diff --git a/lib/rubygems/resolver/api_set.rb b/lib/rubygems/resolver/api_set.rb index 5475e626e6e7..dda357987829 100644 --- a/lib/rubygems/resolver/api_set.rb +++ b/lib/rubygems/resolver/api_set.rb @@ -34,6 +34,8 @@ def initialize dep_uri = 'https://rubygems.org/api/v1/dependencies' @data = Hash.new { |h,k| h[k] = [] } @source = Gem::Source.new @uri + + @to_fetch = [] end ## @@ -45,6 +47,10 @@ def find_all req return res unless @remote + if @to_fetch.include?(req.name) + prefetch_now + end + versions(req.name).each do |ver| if req.dependency.match? req.name, ver[:number] res << Gem::Resolver::APISpecification.new(self, ver) @@ -61,9 +67,13 @@ def find_all req def prefetch reqs return unless @remote names = reqs.map { |r| r.dependency.name } - needed = names - @data.keys + needed = names - @data.keys - @to_fetch + + @to_fetch += needed + end - return if needed.empty? + def prefetch_now + needed, @to_fetch = @to_fetch, [] uri = @dep_uri + "?gems=#{needed.sort.join ','}" str = Gem::RemoteFetcher.fetcher.fetch_path uri