diff options
author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2022-05-24 12:18:38 +0200 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2022-05-24 21:24:57 +0900 |
commit | 633608ebd4cbdeea562dc4c608495134965a19a9 (patch) | |
tree | 1f9347efb61d132ee68eff8688961c0cc7eb8eb0 | |
parent | 08cee2bf804d22dc51002b0df023aea7ec044d8d (diff) |
[rubygems/rubygems] Fix crash when printing resolution conflicts on metadata requirements
https://github.com/rubygems/rubygems/commit/b69e1e9374
-rw-r--r-- | lib/bundler/resolver.rb | 13 | ||||
-rw-r--r-- | spec/bundler/install/gems/resolving_spec.rb | 21 |
2 files changed, 27 insertions, 7 deletions
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 2285114c57..8ec6d5dbc0 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -19,13 +19,15 @@ module Bundler # collection of gemspecs is returned. Otherwise, nil is returned. def self.resolve(requirements, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil) base = SpecSet.new(base) unless base.is_a?(SpecSet) - resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms) + metadata_requirements, regular_requirements = requirements.partition {|dep| dep.name.end_with?("\0") } + resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements) result = resolver.start(requirements) - SpecSet.new(SpecSet.new(result).for(requirements.reject {|dep| dep.name.end_with?("\0") })) + SpecSet.new(SpecSet.new(result).for(regular_requirements)) end - def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms) + def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements) @source_requirements = source_requirements + @metadata_requirements = metadata_requirements @base = base @resolver = Molinillo::Resolver.new(self, self) @search_for = {} @@ -344,8 +346,6 @@ module Bundler trees.sort_by! {|t| t.reverse.map(&:name) } end - metadata_requirements = {} - o << trees.map do |tree| t = "".dup depth = 2 @@ -354,7 +354,6 @@ module Bundler base_tree_name = base_tree.name if base_tree_name.end_with?("\0") - metadata_requirements[base_tree_name] = base_tree t = nil else tree.each do |req| @@ -393,7 +392,7 @@ module Bundler end end elsif name.end_with?("\0") - o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(metadata_requirements[name])}\n\n) + o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(@metadata_requirements.find {|req| req.name == name })}\n\n) elsif conflict.locked_requirement o << "\n" o << %(Running `bundle update` will rebuild your snapshot from scratch, using only\n) diff --git a/spec/bundler/install/gems/resolving_spec.rb b/spec/bundler/install/gems/resolving_spec.rb index 469ecd412f..f23d137bc1 100644 --- a/spec/bundler/install/gems/resolving_spec.rb +++ b/spec/bundler/install/gems/resolving_spec.rb @@ -282,6 +282,27 @@ RSpec.describe "bundle install with install-time dependencies" do expect(err).not_to include("That means the author of parallel_tests (3.8.0) has removed it.") end + it "gives a meaningful error on ruby version mismatches between dependencies" do + build_repo4 do + build_gem "requires-old-ruby" do |s| + s.required_ruby_version = "< #{RUBY_VERSION}" + end + end + + build_lib("foo", :path => bundled_app) do |s| + s.required_ruby_version = ">= #{RUBY_VERSION}" + + s.add_dependency "requires-old-ruby" + end + + install_gemfile <<-G, :raise_on_error => false + source "#{file_uri_for(gem_repo4)}" + gemspec + G + + expect(err).to include("Bundler found conflicting requirements for the Ruby\0 version:") + end + it "installs the older version under rate limiting conditions" do build_repo4 do build_gem "rack", "9001.0.0" do |s| |