summaryrefslogtreecommitdiff
path: root/lib/rubygems/request_set.rb
diff options
context:
space:
mode:
authorhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-14 03:30:02 +0000
committerhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-14 03:30:02 +0000
commit4de117a61517e839f2c45eaf45d56fc243d6d5b2 (patch)
tree7cb5af7a7eb513e5dddf5e343746b1611e628387 /lib/rubygems/request_set.rb
parente548c09d429a5136285ea81aed418685359ed124 (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.rb114
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