Commit 2919cde2 authored by Samuel E. Giddins's avatar Samuel E. Giddins

Merge pull request #4097 from CocoaPods/seg-resolver-platforms-fix

[Resolver] Allow platform detection to work for nested dependencies
parents d7ca4c95 36f96d48
...@@ -23,6 +23,10 @@ To install release candidates run `[sudo] gem install cocoapods --pre` ...@@ -23,6 +23,10 @@ To install release candidates run `[sudo] gem install cocoapods --pre`
[Samuel Giddins](https://github.com/segiddins) [Samuel Giddins](https://github.com/segiddins)
[#4065](https://github.com/CocoaPods/CocoaPods/issues/4065) [#4065](https://github.com/CocoaPods/CocoaPods/issues/4065)
* Fix resolving to platform-compatible versions of transitive dependencies.
[Samuel Giddins](https://github.com/segiddins)
[#4084](https://github.com/CocoaPods/CocoaPods/issues/4084)
## 0.39.0.beta.3 (2015-08-28) ## 0.39.0.beta.3 (2015-08-28)
......
...@@ -537,7 +537,7 @@ module Pod ...@@ -537,7 +537,7 @@ module Pod
end end
specs_by_target = nil specs_by_target = nil
UI.section "Resolving dependencies of #{UI.path podfile.defined_in_file}" do UI.section "Resolving dependencies of #{UI.path(podfile.defined_in_file) || 'Podfile'}" do
resolver = Resolver.new(sandbox, podfile, locked_dependencies, sources) resolver = Resolver.new(sandbox, podfile, locked_dependencies, sources)
specs_by_target = resolver.resolve specs_by_target = resolver.resolve
specs_by_target.values.flatten(1).each(&:validate_cocoapods_version) specs_by_target.values.flatten(1).each(&:validate_cocoapods_version)
......
...@@ -38,6 +38,7 @@ module Pod ...@@ -38,6 +38,7 @@ module Pod
@locked_dependencies = locked_dependencies @locked_dependencies = locked_dependencies
@sources = Array(sources) @sources = Array(sources)
@platforms_by_dependency = Hash.new { |h, k| h[k] = [] } @platforms_by_dependency = Hash.new { |h, k| h[k] = [] }
@cached_sets = {}
end end
#-------------------------------------------------------------------------# #-------------------------------------------------------------------------#
...@@ -58,7 +59,6 @@ module Pod ...@@ -58,7 +59,6 @@ module Pod
@platforms_by_dependency[dep].push(target.platform).uniq! @platforms_by_dependency[dep].push(target.platform).uniq!
end end
end end
@cached_sets = {}
@activated = Molinillo::Resolver.new(self, self).resolve(dependencies, locked_dependencies) @activated = Molinillo::Resolver.new(self, self).resolve(dependencies, locked_dependencies)
specs_by_target.tap do |specs_by_target| specs_by_target.tap do |specs_by_target|
specs_by_target.values.flatten.each do |spec| specs_by_target.values.flatten.each do |spec|
...@@ -409,10 +409,10 @@ module Pod ...@@ -409,10 +409,10 @@ module Pod
def spec_is_platform_compatible?(dependency_graph, dependency, spec) def spec_is_platform_compatible?(dependency_graph, dependency, spec)
all_predecessors = ->(vertex) do all_predecessors = ->(vertex) do
pred = vertex.predecessors pred = vertex.predecessors
pred + pred.map(&all_predecessors).reduce(Set.new, &:&) << vertex pred + pred.map(&all_predecessors).reduce(Set.new, &:|) << vertex
end end
vertex = dependency_graph.vertex_named(dependency.name) vertex = dependency_graph.vertex_named(dependency.name)
predecessors = all_predecessors[vertex].reject { |v| v.explicit_requirements.empty? } predecessors = all_predecessors[vertex].reject { |v| !dependency_graph.root_vertex_named(v.name) }
platforms_to_satisfy = predecessors.flat_map(&:explicit_requirements).flat_map { |r| @platforms_by_dependency[r] } platforms_to_satisfy = predecessors.flat_map(&:explicit_requirements).flat_map { |r| @platforms_by_dependency[r] }
platforms_to_satisfy.all? do |platform_to_satisfy| platforms_to_satisfy.all? do |platform_to_satisfy|
......
...@@ -191,6 +191,30 @@ module Pod ...@@ -191,6 +191,30 @@ module Pod
] ]
end end
it 'selects only platform-compatible versions for transitive dependencies' do
spec = Pod::Spec.new do |s|
s.name = 'lib'
s.version = '1.0'
s.platform = :ios, '5.0'
s.subspec('Calendar') {}
s.subspec('Classes') { |ss| ss.dependency 'lib/Calendar' }
s.subspec('RequestManager') do |ss|
ss.dependency 'lib/Classes'
ss.dependency 'AFNetworking'
end
s.default_subspec = 'RequestManager'
end
@podfile = Podfile.new do
platform :ios, '5.0'
pod 'lib'
end
@resolver.stubs(:podfile).returns(@podfile)
@resolver.send(:cached_sets)['lib'] = stub(:all_specifications => [spec])
@resolver.resolve.values.flatten.map(&:to_s).sort.should == [
'AFNetworking (1.3.4)', 'lib (1.0)', 'lib/Calendar (1.0)', 'lib/Classes (1.0)', 'lib/RequestManager (1.0)'
]
end
it 'raises an informative error when version conflicts are caused by platform incompatibilities' do it 'raises an informative error when version conflicts are caused by platform incompatibilities' do
@podfile = Podfile.new do @podfile = Podfile.new do
platform :osx, '10.7' platform :osx, '10.7'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment