summaryrefslogtreecommitdiff
path: root/lib/bundler/source
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2017-09-10 13:15:19 -0700
committerSamuel Giddins <segiddins@segiddins.me>2017-09-13 15:38:18 -0500
commit7326958a66c21a19586cbaf9027a08cf2ff20971 (patch)
tree527e4aed6e33a971fb4952e7e4d1401284965655 /lib/bundler/source
parent018ca4b31f2effb1b14bffb625f5430af959573b (diff)
downloadbundler-7326958a66c21a19586cbaf9027a08cf2ff20971.tar.gz
Avoid request-bloat in double checking logic
This avoids attempting to double-check in each source for gems that are _in the locally installed set of gems_, which could add hundreds or thousands of extra requests
Diffstat (limited to 'lib/bundler/source')
-rw-r--r--lib/bundler/source/rubygems.rb21
1 files changed, 20 insertions, 1 deletions
diff --git a/lib/bundler/source/rubygems.rb b/lib/bundler/source/rubygems.rb
index fa60bb0c84..02835a5485 100644
--- a/lib/bundler/source/rubygems.rb
+++ b/lib/bundler/source/rubygems.rb
@@ -259,13 +259,32 @@ module Bundler
return unless api_fetchers.any?
unmet_dependency_names = unmet_dependency_names.call
- return if !unmet_dependency_names.nil? && unmet_dependency_names.empty?
+ unless unmet_dependency_names.nil?
+ unmet_dependency_names -= remote_specs.spec_names # avoid re-fetching things we've already gotten
+ return if unmet_dependency_names.empty?
+ end
Bundler.ui.debug "Double checking for #{unmet_dependency_names || "all specs (due to the size of the request)"} in #{self}"
fetch_names(api_fetchers, unmet_dependency_names, index, override_dupes)
end
+ def dependency_names_to_double_check
+ names = []
+ remote_specs.each do |spec|
+ case spec
+ when EndpointSpecification, Gem::Specification, StubSpecification, LazySpecification
+ names.concat(spec.runtime_dependencies)
+ when RemoteSpecification # from the full index
+ return nil
+ else
+ raise "unhandled spec type (#{spec.inspect})"
+ end
+ end
+ names.map!(&:name) if names
+ names
+ end
+
protected
def credless_remotes