mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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
This commit is contained in:
parent
866b438c21
commit
7ed9b794b4
27 changed files with 1083 additions and 108 deletions
|
|
@ -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'
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue