aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThe Bundler Bot <bot@bundler.io>2017-01-24 16:28:00 +0000
committerSamuel Giddins <segiddins@segiddins.me>2017-01-24 15:39:54 -0600
commitb26be39561c713c7982cf34f83acd32d16e17a9f (patch)
tree935a3de293773b2af7b442abc54968695ca18c6d
parent17ab6362af8c1f044f6c0360df8ed0a19d4cf76a (diff)
downloadbundler-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.rb2
-rw-r--r--lib/bundler/resolver.rb11
-rw-r--r--spec/install/gemfile/gemspec_spec.rb18
3 files changed, 26 insertions, 5 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index 1e13794a..85ee5a9e 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 bdb8f488..2bdf4721 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 d935f27f..6a444474 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|