From 7ed9b794b4e3f3f9874f2ce19401461596d8a2c0 Mon Sep 17 00:00:00 2001 From: drbrain Date: Sun, 8 Dec 2013 01:22:39 +0000 Subject: * lib/rubygems: Update to RubyGems master 14749ce. This fixes bugs handling of gem dependencies lockfiles (Gemfile.lock). * test/rubygems: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44054 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rubygems/resolver.rb | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) (limited to 'lib/rubygems/resolver.rb') diff --git a/lib/rubygems/resolver.rb b/lib/rubygems/resolver.rb index 8f11acc197..ad9373cb86 100644 --- a/lib/rubygems/resolver.rb +++ b/lib/rubygems/resolver.rb @@ -36,6 +36,8 @@ class Gem::Resolver attr_reader :missing + attr_reader :stats + ## # When a missing dependency, don't stop. Just go on and record what was # missing. @@ -93,6 +95,7 @@ class Gem::Resolver @development = false @missing = [] @soft_missing = false + @stats = Gem::Resolver::Stats.new end def explain stage, *data # :nodoc: @@ -132,10 +135,13 @@ class Gem::Resolver s.dependencies.reverse_each do |d| next if d.type == :development and not @development reqs.add Gem::Resolver::DependencyRequest.new(d, act) + @stats.requirement! end @set.prefetch reqs + @stats.record_requirements reqs + reqs end @@ -151,8 +157,11 @@ class Gem::Resolver request = Gem::Resolver::DependencyRequest.new n, nil needed.add request + @stats.requirement! end + @stats.record_requirements needed + res = resolve_for needed, nil raise Gem::DependencyResolutionError, res if @@ -268,6 +277,8 @@ class Gem::Resolver states = [] while !needed.empty? + @stats.iteration! + dep = needed.remove explain :try, [dep, dep.requester ? dep.requester.request : :toplevel] explain_list :next5, needed.next5 @@ -279,12 +290,33 @@ class Gem::Resolver next if dep.matches_spec? existing conflict = handle_conflict dep, existing - explain :conflict, conflict.explain - state = find_conflict_state conflict, states + return conflict unless dep.requester + + explain :conflict, dep, :existing, existing.full_name + + depreq = dep.requester.request + + state = nil + until states.empty? + x = states.pop + + i = existing.request.requester + explain :consider, x.spec.full_name, [depreq.name, dep.name, i ? i.name : :top] + + if x.spec.name == depreq.name or + x.spec.name == dep.name or + (i && (i.name == x.spec.name)) + explain :found, x.spec.full_name + state = x + break + end + end return conflict unless state + @stats.backtracking! + needed, specs = resolve_for_conflict needed, specs, state states << state unless state.possibles.empty? @@ -346,6 +378,8 @@ class Gem::Resolver # what makes conflict resolution possible. states << State.new(needed.dup, specs, dep, spec, possible, []) + @stats.record_depth states + explain :states, states.map { |s| s.dep } needed = requests spec, act, needed @@ -404,6 +438,7 @@ require 'rubygems/resolver/activation_request' require 'rubygems/resolver/conflict' require 'rubygems/resolver/dependency_request' require 'rubygems/resolver/requirement_list' +require 'rubygems/resolver/stats' require 'rubygems/resolver/set' require 'rubygems/resolver/api_set' @@ -423,5 +458,6 @@ require 'rubygems/resolver/git_specification' require 'rubygems/resolver/index_specification' require 'rubygems/resolver/installed_specification' require 'rubygems/resolver/local_specification' +require 'rubygems/resolver/lock_specification' require 'rubygems/resolver/vendor_specification' -- cgit v1.2.3