summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2016-08-30 14:44:37 -0500
committerSamuel Giddins <segiddins@segiddins.me>2016-08-30 14:44:49 -0500
commitbdb853450492e723a519dfeabf5408f8070b11aa (patch)
treeb96407c491ad06ec39be038c4432a2abed614946
parent20cbbf0d5d86a30b8afef8906bdf7536b0565367 (diff)
downloadbundler-seg-fix-fetching-all-specs.tar.gz
[Index] Allow #dependency_names when all specs already have dependenciesseg-fix-fetching-all-specs
-rw-r--r--lib/bundler/definition.rb7
-rw-r--r--lib/bundler/fetcher.rb2
-rw-r--r--lib/bundler/index.rb12
-rw-r--r--lib/bundler/source/rubygems.rb4
-rw-r--r--spec/install/gems/compact_index_spec.rb25
-rw-r--r--spec/support/artifice/compact_index_extra_api_missing.rb16
6 files changed, 62 insertions, 4 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index ab754ae24d..83d975d46d 100644
--- a/lib/bundler/definition.rb
+++ b/lib/bundler/definition.rb
@@ -230,7 +230,12 @@ module Bundler
names = :names # do this so we only have to traverse to get dependency_names from the index once
unmet_dependency_names = proc do
if names == :names
- names = dependency_names.+(idx.dependency_names).uniq unless idx.size > Source::Rubygems::API_REQUEST_LIMIT
+ names = if idx.size > Source::Rubygems::API_REQUEST_LIMIT
+ new_names = idx.dependency_names_if_available
+ new_names && dependency_names.+(new_names).uniq
+ else
+ dependency_names.+(idx.dependency_names).uniq
+ end
else
names
end
diff --git a/lib/bundler/fetcher.rb b/lib/bundler/fetcher.rb
index 13d8ce8119..8620c6d5ab 100644
--- a/lib/bundler/fetcher.rb
+++ b/lib/bundler/fetcher.rb
@@ -205,7 +205,7 @@ module Bundler
end
def inspect
- "#<#{self.class}:0x#{object_id} uri=#{uri}>"
+ "#<#{self.class}:0x#{object_id} uri=#{uri} fetchers=#{fetchers.map {|f| f.class.name }}>"
end
private
diff --git a/lib/bundler/index.rb b/lib/bundler/index.rb
index 833276b251..339e30bb57 100644
--- a/lib/bundler/index.rb
+++ b/lib/bundler/index.rb
@@ -114,6 +114,18 @@ module Bundler
names.uniq
end
+ def dependency_names_if_available
+ reduce([]) do |names, spec|
+ case spec
+ when EndpointSpecification, Gem::Specification, LazySpecification, StubSpecification
+ names.concat(spec.dependencies)
+ else
+ # RemoteSpecification from the full index
+ return nil
+ end
+ end.tap {|n| n && n.map!(&:name) }
+ end
+
def use(other, override_dupes = false)
return unless other
other.each do |s|
diff --git a/lib/bundler/source/rubygems.rb b/lib/bundler/source/rubygems.rb
index 9619d5f497..8078b06d62 100644
--- a/lib/bundler/source/rubygems.rb
+++ b/lib/bundler/source/rubygems.rb
@@ -241,9 +241,9 @@ module Bundler
return unless api_fetchers.any?
unmet_dependency_names = unmet_dependency_names.call
- return if unmet_dependency_names.nil? || unmet_dependency_names.empty?
+ return if !unmet_dependency_names.nil? && unmet_dependency_names.empty?
- Bundler.ui.debug "Double checking for #{unmet_dependency_names} in #{self}"
+ 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
diff --git a/spec/install/gems/compact_index_spec.rb b/spec/install/gems/compact_index_spec.rb
index 1cd0f370ab..7c26e84046 100644
--- a/spec/install/gems/compact_index_spec.rb
+++ b/spec/install/gems/compact_index_spec.rb
@@ -334,6 +334,31 @@ The checksum of /versions does not match the checksum provided by the server! So
should_be_installed "back_deps 1.0"
end
+ it "does not fetch every spec if the index of gems is large when doing back deps & everything is the compact index" do
+ build_repo4 do
+ build_gem "back_deps" do |s|
+ s.add_dependency "foo"
+ end
+ build_gem "missing"
+ # need to hit the limit
+ 1.upto(Bundler::Source::Rubygems::API_REQUEST_LIMIT) do |i|
+ build_gem "gem#{i}"
+ end
+
+ FileUtils.rm_rf Dir[gem_repo4("gems/foo-*.gem")]
+ end
+
+ gemfile <<-G
+ source "#{source_uri}"
+ source "#{source_uri}/extra" do
+ gem "back_deps"
+ end
+ G
+
+ bundle! :install, :artifice => "compact_index_extra_api_missing"
+ should_be_installed "back_deps 1.0"
+ end
+
it "uses the endpoint if all sources support it" do
gemfile <<-G
source "#{source_uri}"
diff --git a/spec/support/artifice/compact_index_extra_api_missing.rb b/spec/support/artifice/compact_index_extra_api_missing.rb
new file mode 100644
index 0000000000..d11793fc2b
--- /dev/null
+++ b/spec/support/artifice/compact_index_extra_api_missing.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+require File.expand_path("../compact_index_extra_api", __FILE__)
+
+Artifice.deactivate
+
+class CompactIndexExtraAPIMissing < CompactIndexExtraApi
+ get "/extra/fetch/actual/gem/:id" do
+ if params[:id] == "missing-1.0.gemspec.rz"
+ halt 404
+ else
+ File.read("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}")
+ end
+ end
+end
+
+Artifice.activate_with(CompactIndexExtraAPIMissing)