diff options
author | Samuel Giddins <segiddins@segiddins.me> | 2016-08-30 14:44:37 -0500 |
---|---|---|
committer | Samuel Giddins <segiddins@segiddins.me> | 2016-08-30 14:44:49 -0500 |
commit | bdb853450492e723a519dfeabf5408f8070b11aa (patch) | |
tree | b96407c491ad06ec39be038c4432a2abed614946 | |
parent | 20cbbf0d5d86a30b8afef8906bdf7536b0565367 (diff) | |
download | bundler-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.rb | 7 | ||||
-rw-r--r-- | lib/bundler/fetcher.rb | 2 | ||||
-rw-r--r-- | lib/bundler/index.rb | 12 | ||||
-rw-r--r-- | lib/bundler/source/rubygems.rb | 4 | ||||
-rw-r--r-- | spec/install/gems/compact_index_spec.rb | 25 | ||||
-rw-r--r-- | spec/support/artifice/compact_index_extra_api_missing.rb | 16 |
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) |