aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems/resolver.rb
diff options
context:
space:
mode:
authordrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-12-08 01:22:39 +0000
committerdrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-12-08 01:22:39 +0000
commit7ed9b794b4e3f3f9874f2ce19401461596d8a2c0 (patch)
tree5caaf13685de34b09d2949709a77b4c650b62741 /lib/rubygems/resolver.rb
parent866b438c21ff05dfeabba8bc9aa9850e415be607 (diff)
downloadruby-7ed9b794b4e3f3f9874f2ce19401461596d8a2c0.tar.gz
* 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
Diffstat (limited to 'lib/rubygems/resolver.rb')
-rw-r--r--lib/rubygems/resolver.rb40
1 files changed, 38 insertions, 2 deletions
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'