From e3d150d82216d3e0e1c475df45e24cf464bd8a60 Mon Sep 17 00:00:00 2001 From: Daniel Niknam Date: Thu, 19 Aug 2021 19:47:25 +1000 Subject: [PATCH] Pick the last founded gems when fetching metadata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: David Rodríguez --- lib/rubygems/resolver/installer_set.rb | 6 +++--- .../test_gem_resolver_installer_set.rb | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/rubygems/resolver/installer_set.rb b/lib/rubygems/resolver/installer_set.rb index 60181315b03e..f4fee351a592 100644 --- a/lib/rubygems/resolver/installer_set.rb +++ b/lib/rubygems/resolver/installer_set.rb @@ -77,11 +77,11 @@ def add_always_install(dependency) newest = found.last unless @force - found_matching_metadata = found.select do |spec| + found_matching_metadata = found.reverse.find do |spec| metadata_satisfied?(spec) end - if found_matching_metadata.empty? + if found_matching_metadata.nil? if newest ensure_required_ruby_version_met(newest.spec) ensure_required_rubygems_version_met(newest.spec) @@ -92,7 +92,7 @@ def add_always_install(dependency) raise exc end else - newest = found_matching_metadata.last + newest = found_matching_metadata end end diff --git a/test/rubygems/test_gem_resolver_installer_set.rb b/test/rubygems/test_gem_resolver_installer_set.rb index 66857943c97b..928a16b9d351 100644 --- a/test/rubygems/test_gem_resolver_installer_set.rb +++ b/test/rubygems/test_gem_resolver_installer_set.rb @@ -64,6 +64,24 @@ def test_add_always_install_prerelease assert_equal %w[a-1], set.always_install.map {|s| s.full_name } end + def test_add_always_install_prerelease_github_problem + spec_fetcher do |fetcher| + fetcher.gem 'a', 1 + end + + # Github has an issue in which it will generate a misleading prerelease output in its RubyGems server API and + # returns a 0 version for the gem while it doesn't exist. + @fetcher.data["#{@gem_repo}prerelease_specs.#{Gem.marshal_version}.gz"] = util_gzip(Marshal.dump([ + Gem::NameTuple.new('a', Gem::Version.new(0), 'ruby'), + ])) + + set = Gem::Resolver::InstallerSet.new :both + + set.add_always_install dep('a') + + assert_equal %w[a-1], set.always_install.map {|s| s.full_name } + end + def test_add_always_install_prerelease_only spec_fetcher do |fetcher| fetcher.gem 'a', '3.a'