From acbdb309417a8436ae542cc8948121d9baaf1fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 27 Sep 2024 09:37:01 +0200 Subject: [PATCH] [rubygems/rubygems] Fix error in one source when fetching dependency APIs clearing results from all sources https://github.com/rubygems/rubygems/commit/0549ddbcc5 --- lib/rubygems/resolver/api_set.rb | 19 ++++++++++++------- lib/rubygems/resolver/best_set.rb | 2 -- test/rubygems/test_gem_resolver_api_set.rb | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/rubygems/resolver/api_set.rb b/lib/rubygems/resolver/api_set.rb index 3e4dadc40f..9f6695a6a9 100644 --- a/lib/rubygems/resolver/api_set.rb +++ b/lib/rubygems/resolver/api_set.rb @@ -104,16 +104,21 @@ class Gem::Resolver::APISet < Gem::Resolver::Set end uri = @dep_uri + name - str = Gem::RemoteFetcher.fetcher.fetch_path uri - lines(str).each do |ver| - number, platform, dependencies, requirements = parse_gem(ver) + begin + str = Gem::RemoteFetcher.fetcher.fetch_path uri + rescue Gem::RemoteFetcher::FetchError + @data[name] = [] + else + lines(str).each do |ver| + number, platform, dependencies, requirements = parse_gem(ver) - platform ||= "ruby" - dependencies = dependencies.map {|dep_name, reqs| [dep_name, reqs.join(", ")] } - requirements = requirements.map {|req_name, reqs| [req_name.to_sym, reqs] }.to_h + platform ||= "ruby" + dependencies = dependencies.map {|dep_name, reqs| [dep_name, reqs.join(", ")] } + requirements = requirements.map {|req_name, reqs| [req_name.to_sym, reqs] }.to_h - @data[name] << { name: name, number: number, platform: platform, dependencies: dependencies, requirements: requirements } + @data[name] << { name: name, number: number, platform: platform, dependencies: dependencies, requirements: requirements } + end end @data[name] diff --git a/lib/rubygems/resolver/best_set.rb b/lib/rubygems/resolver/best_set.rb index 57d0d00375..e2307f6e02 100644 --- a/lib/rubygems/resolver/best_set.rb +++ b/lib/rubygems/resolver/best_set.rb @@ -29,8 +29,6 @@ class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet pick_sets if @remote && @sets.empty? super - rescue Gem::RemoteFetcher::FetchError - [] end def prefetch(reqs) # :nodoc: diff --git a/test/rubygems/test_gem_resolver_api_set.rb b/test/rubygems/test_gem_resolver_api_set.rb index 5781cf37d2..b0b4943bea 100644 --- a/test/rubygems/test_gem_resolver_api_set.rb +++ b/test/rubygems/test_gem_resolver_api_set.rb @@ -136,6 +136,25 @@ class TestGemResolverAPISet < Gem::TestCase assert_empty set.find_all(a_dep) end + def test_find_all_not_found + spec_fetcher + + @fetcher.data["#{@dep_uri}/a"] = + proc do + raise Gem::RemoteFetcher::FetchError + end + + set = Gem::Resolver::APISet.new @dep_uri + + a_dep = Gem::Resolver::DependencyRequest.new dep("a"), nil + + assert_empty set.find_all(a_dep) + + @fetcher.data.delete "#{@dep_uri}a" + + assert_empty set.find_all(a_dep) + end + def test_prefetch spec_fetcher