diff options
author | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-09-14 03:30:02 +0000 |
---|---|---|
committer | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-09-14 03:30:02 +0000 |
commit | 4de117a61517e839f2c45eaf45d56fc243d6d5b2 (patch) | |
tree | 7cb5af7a7eb513e5dddf5e343746b1611e628387 /lib/rubygems/request_set.rb | |
parent | e548c09d429a5136285ea81aed418685359ed124 (diff) |
* lib/rubygems: Update to RubyGems 2.4.1 master(713ab65)
Complete history at:
https://github.com/rubygems/rubygems/blob/master/History.txt#L3-L216
* test/rubygems: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47582 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems/request_set.rb')
-rw-r--r-- | lib/rubygems/request_set.rb | 114 |
1 files changed, 92 insertions, 22 deletions
diff --git a/lib/rubygems/request_set.rb b/lib/rubygems/request_set.rb index fb54e344bd..d12e06358d 100644 --- a/lib/rubygems/request_set.rb +++ b/lib/rubygems/request_set.rb @@ -1,4 +1,3 @@ -require 'rubygems' require 'tsort' ## @@ -21,13 +20,23 @@ class Gem::RequestSet ## # Array of gems to install even if already installed - attr_reader :always_install + attr_accessor :always_install attr_reader :dependencies attr_accessor :development ## + # Errors fetching gems during resolution. + + attr_reader :errors + + ## + # Set to true if you want to install only direct development dependencies. + + attr_accessor :development_shallow + + ## # The set of git gems imported via load_gemdeps. attr_reader :git_set # :nodoc: @@ -38,11 +47,20 @@ class Gem::RequestSet attr_accessor :ignore_dependencies + attr_reader :install_dir # :nodoc: + + ## + # If true, allow dependencies to match prerelease gems. + + attr_accessor :prerelease + ## # When false no remote sets are used for resolving gems. attr_accessor :remote + attr_reader :resolver # :nodoc: + ## # Sets used for resolution @@ -71,11 +89,15 @@ class Gem::RequestSet @dependencies = deps @always_install = [] + @conservative = false @dependency_names = {} @development = false + @development_shallow = false + @errors = [] @git_set = nil @ignore_dependencies = false @install_dir = Gem.dir + @prerelease = false @remote = true @requests = [] @sets = [] @@ -116,12 +138,14 @@ class Gem::RequestSet def install options, &block # :yields: request, installer if dir = options[:install_dir] - return install_into dir, false, options, &block + requests = install_into dir, false, options, &block + return requests end cache_dir = options[:cache_dir] || Gem.dir + @prerelease = options[:prerelease] - specs = [] + requests = [] sorted_requests.each do |req| if req.installed? then @@ -139,10 +163,30 @@ class Gem::RequestSet yield req, inst if block_given? - specs << inst.install + requests << inst.install + end + + requests + ensure + raise if $! + return requests if options[:gemdeps] + + specs = requests.map do |request| + case request + when Gem::Resolver::ActivationRequest then + request.spec.spec + else + request + end end - specs + require 'rubygems/dependency_installer' + inst = Gem::DependencyInstaller.new options + inst.installed_gems.replace specs + + Gem.done_installing_hooks.each do |hook| + hook.call inst, specs + end unless Gem.done_installing_hooks.empty? end ## @@ -156,17 +200,19 @@ class Gem::RequestSet gemdeps = options[:gemdeps] @install_dir = options[:install_dir] || Gem.dir + @prerelease = options[:prerelease] @remote = options[:domain] != :local + @conservative = true if options[:conservative] - load_gemdeps gemdeps, options[:without_groups] + gem_deps_api = load_gemdeps gemdeps, options[:without_groups], true resolve if options[:explain] puts "Gems to install:" - specs.map { |s| s.full_name }.sort.each do |s| - puts " #{s}" + sorted_requests.each do |spec| + puts " #{spec.full_name}" end if Gem.configuration.really_verbose @@ -175,8 +221,11 @@ class Gem::RequestSet else installed = install options, &block - lockfile = Gem::RequestSet::Lockfile.new self, gemdeps - lockfile.write + if options.fetch :lock, true then + lockfile = + Gem::RequestSet::Lockfile.new self, gemdeps, gem_deps_api.dependencies + lockfile.write + end installed end @@ -192,8 +241,10 @@ class Gem::RequestSet installed = [] + options[:development] = false options[:install_dir] = dir options[:only_install_dir] = true + @prerelease = options[:prerelease] sorted_requests.each do |request| spec = request.spec @@ -218,7 +269,7 @@ class Gem::RequestSet ## # Load a dependency management file. - def load_gemdeps path, without_groups = [] + def load_gemdeps path, without_groups = [], installing = false @git_set = Gem::Resolver::GitSet.new @vendor_set = Gem::Resolver::VendorSet.new @@ -228,6 +279,7 @@ class Gem::RequestSet lockfile.parse gf = Gem::RequestSet::GemDependencyAPI.new self, path + gf.installing = installing gf.without_groups = without_groups if without_groups gf.load end @@ -243,15 +295,29 @@ class Gem::RequestSet set = Gem::Resolver.compose_sets(*@sets) set.remote = @remote + set.prerelease = @prerelease resolver = Gem::Resolver.new @dependencies, set resolver.development = @development + resolver.development_shallow = @development_shallow resolver.ignore_dependencies = @ignore_dependencies resolver.soft_missing = @soft_missing + if @conservative + installed_gems = {} + Gem::Specification.find_all do |spec| + (installed_gems[spec.name] ||= []) << spec + end + resolver.skip_gems = installed_gems + end + @resolver = resolver @requests = resolver.resolve + + @errors = set.errors + + @requests end ## @@ -284,16 +350,20 @@ class Gem::RequestSet node.spec.dependencies.each do |dep| next if dep.type == :development and not @development - match = @requests.find { |r| dep.match? r.spec.name, r.spec.version } - if match - begin - yield match - rescue TSort::Cyclic - end - else - unless @soft_missing - raise Gem::DependencyError, "Unresolved dependency found during sorting - #{dep} (requested by #{node.spec.full_name})" - end + match = @requests.find { |r| + dep.match? r.spec.name, r.spec.version, @prerelease + } + + unless match then + next if dep.type == :development and @development_shallow + next if @soft_missing + raise Gem::DependencyError, + "Unresolved dependency found during sorting - #{dep} (requested by #{node.spec.full_name})" + end + + begin + yield match + rescue TSort::Cyclic end end end |