diff options
author | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-10-18 00:41:36 +0000 |
---|---|---|
committer | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-10-18 00:41:36 +0000 |
commit | 05ca2faba2e0851f2b8c659974b1742458e2cf8e (patch) | |
tree | ec5846bc6f75d4e83a9a9fe89ec3782ba195d6cd /lib/rubygems | |
parent | 4fa08bbaf8f2c029f6df7f7ab85293cd31874b15 (diff) |
* lib/rubygems: Update to RubyGems master cee6788. Changes:
Fix test failure on vc10-x64 Server on rubyci.org due to attempting
to File.chmod where it is not supported.
Continuing work on improved gem dependencies file (Gemfile) support.
* test: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43347 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems')
-rw-r--r-- | lib/rubygems/dependency_installer.rb | 2 | ||||
-rw-r--r-- | lib/rubygems/dependency_resolver.rb | 23 | ||||
-rw-r--r-- | lib/rubygems/dependency_resolver/installer_set.rb | 4 | ||||
-rw-r--r-- | lib/rubygems/request_set.rb | 10 | ||||
-rw-r--r-- | lib/rubygems/request_set/gem_dependency_api.rb | 25 | ||||
-rw-r--r-- | lib/rubygems/source.rb | 2 | ||||
-rw-r--r-- | lib/rubygems/test_case.rb | 18 |
7 files changed, 64 insertions, 20 deletions
diff --git a/lib/rubygems/dependency_installer.rb b/lib/rubygems/dependency_installer.rb index 8947e81d57..c6985b27c0 100644 --- a/lib/rubygems/dependency_installer.rb +++ b/lib/rubygems/dependency_installer.rb @@ -278,7 +278,7 @@ class Gem::DependencyInstaller # Gathers all dependencies necessary for the installation from local and # remote sources unless the ignore_dependencies was given. #-- - # TODO remove, no longer used + # TODO remove at RubyGems 3 def gather_dependencies # :nodoc: specs = @available.all_specs diff --git a/lib/rubygems/dependency_resolver.rb b/lib/rubygems/dependency_resolver.rb index bbb5408a55..2b3cc1aa34 100644 --- a/lib/rubygems/dependency_resolver.rb +++ b/lib/rubygems/dependency_resolver.rb @@ -43,10 +43,10 @@ class Gem::DependencyResolver ## # Create DependencyResolver object which will resolve the tree starting - # with +needed+ Depedency objects. + # with +needed+ Dependency objects. # # +set+ is an object that provides where to look for specifications to - # satisify the Dependencies. This defaults to IndexSet, which will query + # satisfy the Dependencies. This defaults to IndexSet, which will query # rubygems.org. def initialize needed, set = nil @@ -119,15 +119,12 @@ class Gem::DependencyResolver end def handle_conflict(dep, existing) - # There is a conflict! We return the conflict - # object which will be seen by the caller and be - # handled at the right level. - - # If the existing activation indicates that there - # are other possibles for it, then issue the conflict - # on the dep for the activation itself. Otherwise, issue - # it on the requester's request itself. - # + # There is a conflict! We return the conflict object which will be seen by + # the caller and be handled at the right level. + + # If the existing activation indicates that there are other possibles for + # it, then issue the conflict on the dependency for the activation itself. + # Otherwise, issue it on the requester's request itself. if existing.others_possible? conflict = Gem::DependencyResolver::DependencyConflict.new dep, existing @@ -146,7 +143,7 @@ class Gem::DependencyResolver # +needed+ is a Gem::List of DependencyRequest objects that, well, need # to be satisfied. # +specs+ is the List of ActivationRequest that are being tested. - # +dep+ is the DepedencyRequest that was used to generate this state. + # +dep+ is the DependencyRequest that was used to generate this state. # +spec+ is the Specification for this state. # +possible+ is List of DependencyRequest objects that can be tried to # find a complete set. @@ -307,4 +304,6 @@ require 'rubygems/dependency_resolver/index_set' require 'rubygems/dependency_resolver/index_specification' require 'rubygems/dependency_resolver/installed_specification' require 'rubygems/dependency_resolver/installer_set' +require 'rubygems/dependency_resolver/vendor_set' +require 'rubygems/dependency_resolver/vendor_specification' diff --git a/lib/rubygems/dependency_resolver/installer_set.rb b/lib/rubygems/dependency_resolver/installer_set.rb index e19fcd76e4..2993766d3a 100644 --- a/lib/rubygems/dependency_resolver/installer_set.rb +++ b/lib/rubygems/dependency_resolver/installer_set.rb @@ -1,3 +1,7 @@ +## +# A set of gems for installation sourced from remote sources and local .gem +# files + class Gem::DependencyResolver::InstallerSet ## diff --git a/lib/rubygems/request_set.rb b/lib/rubygems/request_set.rb index 0d52423f8f..eb45516cfb 100644 --- a/lib/rubygems/request_set.rb +++ b/lib/rubygems/request_set.rb @@ -37,6 +37,11 @@ class Gem::RequestSet attr_accessor :soft_missing ## + # The set of vendor gems imported via load_gemdeps. + + attr_reader :vendor_set # :nodoc: + + ## # Creates a RequestSet for a list of Gem::Dependency objects, +deps+. You # can then #resolve and #install the resolved list of dependencies. # @@ -54,6 +59,7 @@ class Gem::RequestSet @soft_missing = false @sorted = nil @specs = nil + @vendor_set = nil yield self if block_given? end @@ -69,7 +75,7 @@ class Gem::RequestSet # Add +deps+ Gem::Dependency objects to the set. def import deps - @dependencies += deps + @dependencies.concat deps end def install options, &block @@ -143,6 +149,8 @@ class Gem::RequestSet # Load a dependency management file. def load_gemdeps path + @vendor_set = Gem::DependencyResolver::VendorSet.new + gf = Gem::RequestSet::GemDependencyAPI.new self, path gf.load end diff --git a/lib/rubygems/request_set/gem_dependency_api.rb b/lib/rubygems/request_set/gem_dependency_api.rb index 435e157861..40dccb6433 100644 --- a/lib/rubygems/request_set/gem_dependency_api.rb +++ b/lib/rubygems/request_set/gem_dependency_api.rb @@ -9,6 +9,11 @@ class Gem::RequestSet::GemDependencyAPI attr_reader :dependency_groups ## + # A set of gems that are loaded via the +:path+ option to #gem + + attr_reader :vendor_set # :nodoc: + + ## # Creates a new GemDependencyAPI that will add dependencies to the # Gem::RequestSet +set+ based on the dependency API description in +path+. @@ -18,6 +23,7 @@ class Gem::RequestSet::GemDependencyAPI @current_groups = nil @dependency_groups = Hash.new { |h, group| h[group] = [] } + @vendor_set = @set.vendor_set end ## @@ -41,13 +47,20 @@ class Gem::RequestSet::GemDependencyAPI options = requirements.pop if requirements.last.kind_of?(Hash) options ||= {} - groups = - (group = options.delete(:group) and Array(group)) || - options.delete(:groups) || - @current_groups + if directory = options.delete(:path) then + @vendor_set.add_vendor_gem name, directory + end + + group = options.delete :group + all_groups = group ? Array(group) : [] + + groups = options.delete :groups + all_groups |= groups if groups + + all_groups |= @current_groups if @current_groups - if groups then - groups.each do |group| + unless all_groups.empty? then + all_groups.each do |group| gem_arguments = [name, *requirements] gem_arguments << options unless options.empty? @dependency_groups[group] << gem_arguments diff --git a/lib/rubygems/source.rb b/lib/rubygems/source.rb index f0e2a597b9..ecfb6c8897 100644 --- a/lib/rubygems/source.rb +++ b/lib/rubygems/source.rb @@ -162,3 +162,5 @@ end require 'rubygems/source/installed' require 'rubygems/source/specific_file' require 'rubygems/source/local' +require 'rubygems/source/vendor' + diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb index d6c1a36ad1..a5a81d72a2 100644 --- a/lib/rubygems/test_case.rb +++ b/lib/rubygems/test_case.rb @@ -1095,6 +1095,24 @@ Also, a list: Gem::Version.create string end + ## + # A vendor_gem is used with a gem dependencies file. The gem created here + # has no files, just a gem specification for the given +name+ and +version+. + + def vendor_gem name = 'a', version = 1 + directory = File.join 'vendor', name + + vendor_spec = Gem::Specification.new name, version + + FileUtils.mkdir_p directory + + open File.join(directory, "#{name}.gemspec"), 'w' do |io| + io.write vendor_spec.to_ruby + end + + return name, vendor_spec.version, directory + end + class StaticSet def initialize(specs) @specs = specs |