diff options
author | The Bundler Bot <bot@bundler.io> | 2017-01-24 16:28:00 +0000 |
---|---|---|
committer | Samuel Giddins <segiddins@segiddins.me> | 2017-01-24 15:39:54 -0600 |
commit | b26be39561c713c7982cf34f83acd32d16e17a9f (patch) | |
tree | 935a3de293773b2af7b442abc54968695ca18c6d | |
parent | 17ab6362af8c1f044f6c0360df8ed0a19d4cf76a (diff) | |
download | bundler-b26be39561c713c7982cf34f83acd32d16e17a9f.tar.gz |
Auto merge of #5355 - bundler:seg-resolver-restrict-platforms, r=indirect
[Resolver] Restrict activated platforms to those in the Gemfile
This ensures that deps that come from the lockfile, which might only have the "ruby" platform, dont cause us to attempt to activate/resolve all "ruby" platform gems
Closes #5349
(cherry picked from commit 6e69db334661fd31f559fb72463e7911b6f9c6a1)
-rw-r--r-- | lib/bundler/definition.rb | 2 | ||||
-rw-r--r-- | lib/bundler/resolver.rb | 11 | ||||
-rw-r--r-- | spec/install/gemfile/gemspec_spec.rb | 18 |
3 files changed, 26 insertions, 5 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 1e13794ae7..85ee5a9ebf 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -249,7 +249,7 @@ module Bundler else # Run a resolve against the locally available gems Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}") - last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve) + last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms) end end end diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index bdb8f4883c..2bdf4721ec 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -175,14 +175,15 @@ module Bundler # ==== Returns # <GemBundle>,nil:: If the list of dependencies can be resolved, a # collection of gemspecs is returned. Otherwise, nil is returned. - def self.resolve(requirements, index, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = []) + def self.resolve(requirements, index, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil) + platforms = Set.new(platforms) if platforms base = SpecSet.new(base) unless base.is_a?(SpecSet) - resolver = new(index, source_requirements, base, gem_version_promoter, additional_base_requirements) + resolver = new(index, source_requirements, base, gem_version_promoter, additional_base_requirements, platforms) result = resolver.start(requirements) SpecSet.new(result) end - def initialize(index, source_requirements, base, gem_version_promoter, additional_base_requirements) + def initialize(index, source_requirements, base, gem_version_promoter, additional_base_requirements, platforms) @index = index @source_requirements = source_requirements @base = base @@ -194,6 +195,7 @@ module Bundler @base_dg.add_vertex(ls.name, DepProxy.new(dep, ls.platform), true) end additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) } + @platforms = platforms @gem_version_promoter = gem_version_promoter end @@ -308,7 +310,8 @@ module Bundler def requirement_satisfied_by?(requirement, activated, spec) return false unless requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec) - spec.activate_platform!(requirement.__platform) || spec.for?(requirement.__platform) + spec.activate_platform!(requirement.__platform) if !@platforms || @platforms.include?(requirement.__platform) + true end def sort_dependencies(dependencies, activated, conflicts) diff --git a/spec/install/gemfile/gemspec_spec.rb b/spec/install/gemfile/gemspec_spec.rb index d935f27f52..6a44447461 100644 --- a/spec/install/gemfile/gemspec_spec.rb +++ b/spec/install/gemfile/gemspec_spec.rb @@ -162,6 +162,24 @@ describe "bundle install from an existing gemspec" do expect(out).to include("Found no changes, using resolution from the lockfile") end + it "should match a lockfile on non-ruby platforms with a transitive platform dependency" do + simulate_platform java + simulate_ruby_engine "jruby" + + build_lib("foo", :path => tmp.join("foo")) do |s| + s.add_dependency "platform_specific" + end + + install_gem "platform_specific-1.0-java" + + install_gemfile! <<-G + gemspec :path => '#{tmp.join("foo")}' + G + + bundle! "update --bundler", :verbose => true + expect(the_bundle).to include_gems "foo 1.0", "platform_specific 1.0 JAVA" + end + it "should evaluate the gemspec in its directory" do build_lib("foo", :path => tmp.join("foo")) File.open(tmp.join("foo/foo.gemspec"), "w") do |s| |