Skip to content

Commit cdaa336

Browse files
deivid-rodriguezschneems
authored andcommitted
[rubygems/rubygems] Fix crash when printing resolution conflicts on metadata requirements
ruby/rubygems@b69e1e9374
1 parent 5b61524 commit cdaa336

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

lib/bundler/resolver.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ class Resolver
1919
# collection of gemspecs is returned. Otherwise, nil is returned.
2020
def self.resolve(requirements, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil)
2121
base = SpecSet.new(base) unless base.is_a?(SpecSet)
22-
resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
22+
metadata_requirements, regular_requirements = requirements.partition {|dep| dep.name.end_with?("\0") }
23+
resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
2324
result = resolver.start(requirements)
24-
SpecSet.new(SpecSet.new(result).for(requirements.reject {|dep| dep.name.end_with?("\0") }))
25+
SpecSet.new(SpecSet.new(result).for(regular_requirements))
2526
end
2627

27-
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
28+
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
2829
@source_requirements = source_requirements
30+
@metadata_requirements = metadata_requirements
2931
@base = base
3032
@resolver = Molinillo::Resolver.new(self, self)
3133
@search_for = {}
@@ -344,8 +346,6 @@ def version_conflict_message(e)
344346
trees.sort_by! {|t| t.reverse.map(&:name) }
345347
end
346348

347-
metadata_requirements = {}
348-
349349
o << trees.map do |tree|
350350
t = "".dup
351351
depth = 2
@@ -354,7 +354,6 @@ def version_conflict_message(e)
354354
base_tree_name = base_tree.name
355355

356356
if base_tree_name.end_with?("\0")
357-
metadata_requirements[base_tree_name] = base_tree
358357
t = nil
359358
else
360359
tree.each do |req|
@@ -393,7 +392,7 @@ def version_conflict_message(e)
393392
end
394393
end
395394
elsif name.end_with?("\0")
396-
o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(metadata_requirements[name])}\n\n)
395+
o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(@metadata_requirements.find {|req| req.name == name })}\n\n)
397396
elsif conflict.locked_requirement
398397
o << "\n"
399398
o << %(Running `bundle update` will rebuild your snapshot from scratch, using only\n)

spec/bundler/install/gems/resolving_spec.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,27 @@
282282
expect(err).not_to include("That means the author of parallel_tests (3.8.0) has removed it.")
283283
end
284284

285+
it "gives a meaningful error on ruby version mismatches between dependencies" do
286+
build_repo4 do
287+
build_gem "requires-old-ruby" do |s|
288+
s.required_ruby_version = "< #{RUBY_VERSION}"
289+
end
290+
end
291+
292+
build_lib("foo", :path => bundled_app) do |s|
293+
s.required_ruby_version = ">= #{RUBY_VERSION}"
294+
295+
s.add_dependency "requires-old-ruby"
296+
end
297+
298+
install_gemfile <<-G, :raise_on_error => false
299+
source "#{file_uri_for(gem_repo4)}"
300+
gemspec
301+
G
302+
303+
expect(err).to include("Bundler found conflicting requirements for the Ruby\0 version:")
304+
end
305+
285306
it "installs the older version under rate limiting conditions" do
286307
build_repo4 do
287308
build_gem "rack", "9001.0.0" do |s|

0 commit comments

Comments
 (0)