summaryrefslogtreecommitdiff
path: root/lib/rubygems
diff options
context:
space:
mode:
authordrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-30 23:27:52 +0000
committerdrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-30 23:27:52 +0000
commit73fc703f7cbb2e6dfd50897d26b37fe8e76064e3 (patch)
tree0296426c8ac01331f2d33dde54fd9f1e183ea974 /lib/rubygems
parent6727297dfecddaef6b1166a7f442db2a22929c65 (diff)
* lib/rubygems: Update to RubyGems master 66e5c39. Notable changes:
Implement gem.deps.rb (Gemfile) .lock support Fixed `gem uninstall` for a relative directory in GEM_HOME. * test/rubygems: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43939 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems')
-rw-r--r--lib/rubygems/basic_specification.rb22
-rw-r--r--lib/rubygems/ext/builder.rb2
-rw-r--r--lib/rubygems/ext/rake_builder.rb2
-rw-r--r--lib/rubygems/rdoc.rb2
-rw-r--r--lib/rubygems/request_set.rb20
-rw-r--r--lib/rubygems/request_set/lockfile.rb25
-rw-r--r--lib/rubygems/resolver/best_set.rb10
-rw-r--r--lib/rubygems/resolver/git_set.rb23
-rw-r--r--lib/rubygems/resolver/index_set.rb24
-rw-r--r--lib/rubygems/resolver/lock_set.rb18
-rw-r--r--lib/rubygems/resolver/vendor_set.rb15
-rw-r--r--lib/rubygems/source.rb2
-rw-r--r--lib/rubygems/source/git.rb34
-rw-r--r--lib/rubygems/source/installed.rb3
-rw-r--r--lib/rubygems/source/local.rb3
-rw-r--r--lib/rubygems/source/lock.rb44
-rw-r--r--lib/rubygems/source/vendor.rb2
-rw-r--r--lib/rubygems/specification.rb2
-rw-r--r--lib/rubygems/test_utilities.rb18
-rw-r--r--lib/rubygems/validator.rb1
20 files changed, 252 insertions, 20 deletions
diff --git a/lib/rubygems/basic_specification.rb b/lib/rubygems/basic_specification.rb
index cfbfbdde92..bb4fa281a0 100644
--- a/lib/rubygems/basic_specification.rb
+++ b/lib/rubygems/basic_specification.rb
@@ -5,6 +5,16 @@
class Gem::BasicSpecification
##
+ # Allows installation of extensions for git: gems.
+
+ attr_writer :base_dir # :nodoc:
+
+ ##
+ # Sets the directory where extensions for this gem will be installed.
+
+ attr_writer :extension_install_dir # :nodoc:
+
+ ##
# The path this gemspec was loaded from. This attribute is not persisted.
attr_reader :loaded_from
@@ -68,8 +78,9 @@ class Gem::BasicSpecification
# end
def extension_install_dir
- File.join base_dir, 'extensions', Gem::Platform.local.to_s,
- Gem.extension_api_version, full_name
+ @extension_install_dir ||=
+ File.join base_dir, 'extensions', Gem::Platform.local.to_s,
+ Gem.extension_api_version, full_name
end
def find_full_gem_path # :nodoc:
@@ -141,9 +152,10 @@ class Gem::BasicSpecification
def loaded_from= path
@loaded_from = path && path.to_s
- @full_gem_path = nil
- @gems_dir = nil
- @base_dir = nil
+ @extension_install_dir = nil
+ @full_gem_path = nil
+ @gems_dir = nil
+ @base_dir = nil
end
##
diff --git a/lib/rubygems/ext/builder.rb b/lib/rubygems/ext/builder.rb
index e9244c760c..110576e685 100644
--- a/lib/rubygems/ext/builder.rb
+++ b/lib/rubygems/ext/builder.rb
@@ -98,7 +98,7 @@ class Gem::Ext::Builder
def initialize spec, build_args = spec.build_args
@spec = spec
@build_args = build_args
- @gem_dir = spec.gem_dir
+ @gem_dir = spec.full_gem_path
@ran_rake = nil
end
diff --git a/lib/rubygems/ext/rake_builder.rb b/lib/rubygems/ext/rake_builder.rb
index 2093bcabdd..d5ebf597ae 100644
--- a/lib/rubygems/ext/rake_builder.rb
+++ b/lib/rubygems/ext/rake_builder.rb
@@ -19,7 +19,7 @@ class Gem::Ext::RakeBuilder < Gem::Ext::Builder
rake = ENV['rake']
rake ||= begin
- "\"#{Gem.ruby}\" -rubygems #{Gem.bin_path('rake', 'rake')}"
+ "#{Gem.ruby} -rubygems #{Gem.bin_path('rake', 'rake')}"
rescue Gem::Exception
end
diff --git a/lib/rubygems/rdoc.rb b/lib/rubygems/rdoc.rb
index f16c8696f0..52249dc267 100644
--- a/lib/rubygems/rdoc.rb
+++ b/lib/rubygems/rdoc.rb
@@ -8,7 +8,7 @@ rescue Gem::LoadError
# swallow
else
# This will force any deps that 'rdoc' might have
- # (such as json) that are ambigious to be activated, which
+ # (such as json) that are ambiguous to be activated, which
# is important because we end up using Specification.reset
# and we don't want the warning it pops out.
Gem.finish_resolve
diff --git a/lib/rubygems/request_set.rb b/lib/rubygems/request_set.rb
index d6337e32d8..54e4d9dee4 100644
--- a/lib/rubygems/request_set.rb
+++ b/lib/rubygems/request_set.rb
@@ -67,6 +67,7 @@ class Gem::RequestSet
@dependency_names = {}
@development = false
@git_set = nil
+ @install_dir = Gem.dir
@requests = []
@sets = []
@soft_missing = false
@@ -143,7 +144,11 @@ class Gem::RequestSet
# dependencies file are not used. See Gem::Installer for other +options+.
def install_from_gemdeps options, &block
- load_gemdeps options[:gemdeps], options[:without_groups]
+ gemdeps = options[:gemdeps]
+
+ @install_dir = options[:install_dir] || Gem.dir
+
+ load_gemdeps gemdeps, options[:without_groups]
resolve
@@ -154,7 +159,12 @@ class Gem::RequestSet
puts " #{s}"
end
else
- install options, &block
+ installed = install options, &block
+
+ lockfile = Gem::RequestSet::Lockfile.new self, gemdeps
+ lockfile.write
+
+ installed
end
end
@@ -194,6 +204,11 @@ class Gem::RequestSet
@git_set = Gem::Resolver::GitSet.new
@vendor_set = Gem::Resolver::VendorSet.new
+ @git_set.root_dir = @install_dir
+
+ lockfile = Gem::RequestSet::Lockfile.new self, path
+ lockfile.parse
+
gf = Gem::RequestSet::GemDependencyAPI.new self, path
gf.without_groups = without_groups if without_groups
gf.load
@@ -264,3 +279,4 @@ class Gem::RequestSet
end
require 'rubygems/request_set/gem_dependency_api'
+require 'rubygems/request_set/lockfile'
diff --git a/lib/rubygems/request_set/lockfile.rb b/lib/rubygems/request_set/lockfile.rb
index 0073bfdcc5..d70b09f7a2 100644
--- a/lib/rubygems/request_set/lockfile.rb
+++ b/lib/rubygems/request_set/lockfile.rb
@@ -1,3 +1,8 @@
+##
+# Parses a gem.deps.rb.lock file and constructs a LockSet containing the
+# dependencies found inside. If the lock file is missing no LockSet is
+# constructed.
+
class Gem::RequestSet::Lockfile
##
@@ -100,7 +105,7 @@ class Gem::RequestSet::Lockfile
out << nil
end
- def relative_path_from(dest, base)
+ def relative_path_from dest, base # :nodoc:
dest = File.expand_path(dest)
base = File.expand_path(base)
@@ -263,6 +268,9 @@ class Gem::RequestSet::Lockfile
get while not @tokens.empty? and peek.first == type
end
+ ##
+ # The contents of the lock file.
+
def to_s
@set.resolve
@@ -293,6 +301,10 @@ class Gem::RequestSet::Lockfile
[byte_offset - @line_pos, @line]
end
+ ##
+ # Converts a lock file into an Array of tokens. If the lock file is missing
+ # an empty Array is returned.
+
def tokenize # :nodoc:
@line = 0
@line_pos = 0
@@ -343,6 +355,8 @@ class Gem::RequestSet::Lockfile
end
@tokens
+ rescue Errno::ENOENT
+ @tokens
end
##
@@ -352,5 +366,14 @@ class Gem::RequestSet::Lockfile
@tokens.unshift @current_token
end
+ ##
+ # Writes the lock file alongside the gem dependencies file
+
+ def write
+ open "#{@gem_deps_file}.lock", 'w' do |io|
+ io.write to_s
+ end
+ end
+
end
diff --git a/lib/rubygems/resolver/best_set.rb b/lib/rubygems/resolver/best_set.rb
index 533a0db58f..fa6c9f84c0 100644
--- a/lib/rubygems/resolver/best_set.rb
+++ b/lib/rubygems/resolver/best_set.rb
@@ -17,5 +17,15 @@ class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet
end
end
+ def pretty_print q # :nodoc:
+ q.group 2, '[BestSet', ']' do
+ q.breakable
+ q.text 'sets:'
+
+ q.breakable
+ q.pp @sets
+ end
+ end
+
end
diff --git a/lib/rubygems/resolver/git_set.rb b/lib/rubygems/resolver/git_set.rb
index c912e367d9..ed809c124f 100644
--- a/lib/rubygems/resolver/git_set.rb
+++ b/lib/rubygems/resolver/git_set.rb
@@ -11,6 +11,12 @@
class Gem::Resolver::GitSet < Gem::Resolver::Set
##
+ # The root directory for git gems in this set. This is usually Gem.dir, the
+ # installation directory for regular gems.
+
+ attr_accessor :root_dir
+
+ ##
# Contains repositories needing submodules
attr_reader :need_submodules # :nodoc:
@@ -30,6 +36,7 @@ class Gem::Resolver::GitSet < Gem::Resolver::Set
@git = ENV['git'] || 'git'
@need_submodules = {}
@repositories = {}
+ @root_dir = Gem.dir
@specs = {}
end
@@ -57,6 +64,7 @@ class Gem::Resolver::GitSet < Gem::Resolver::Set
@repositories.each do |name, (repository, reference)|
source = Gem::Source::Git.new name, repository, reference
+ source.root_dir = @root_dir
source.specs.each do |spec|
git_spec = Gem::Resolver::GitSpecification.new self, spec, source
@@ -66,5 +74,20 @@ class Gem::Resolver::GitSet < Gem::Resolver::Set
end
end
+ def pretty_print q # :nodoc:
+ q.group 2, '[GitSet', ']' do
+ next if @repositories.empty?
+ q.breakable
+
+ repos = @repositories.map do |name, (repository, reference)|
+ "#{name}: #{repository}@#{reference}"
+ end
+
+ q.seplist repos do |repo|
+ q.text repo
+ end
+ end
+ end
+
end
diff --git a/lib/rubygems/resolver/index_set.rb b/lib/rubygems/resolver/index_set.rb
index 0ba3c78a44..a6ef56bb7f 100644
--- a/lib/rubygems/resolver/index_set.rb
+++ b/lib/rubygems/resolver/index_set.rb
@@ -46,5 +46,29 @@ class Gem::Resolver::IndexSet < Gem::Resolver::Set
res
end
+ def pretty_print q # :nodoc:
+ q.group 2, '[IndexSet', ']' do
+ q.breakable
+ q.text 'sources:'
+ q.breakable
+ q.pp @f.sources
+
+ q.breakable
+ q.text 'specs:'
+
+ q.breakable
+
+ names = @all.values.map do |tuples|
+ tuples.map do |_, tuple|
+ tuple.full_name
+ end
+ end.flatten
+
+ q.seplist names do |name|
+ q.text name
+ end
+ end
+ end
+
end
diff --git a/lib/rubygems/resolver/lock_set.rb b/lib/rubygems/resolver/lock_set.rb
index 6885e70945..ef5395597d 100644
--- a/lib/rubygems/resolver/lock_set.rb
+++ b/lib/rubygems/resolver/lock_set.rb
@@ -9,7 +9,7 @@ class Gem::Resolver::LockSet < Gem::Resolver::Set
# Creates a new LockSet from the given +source+
def initialize source
- @source = source
+ @source = Gem::Source::Lock.new source
@specs = []
end
@@ -56,5 +56,21 @@ class Gem::Resolver::LockSet < Gem::Resolver::Set
found.source.fetch_spec tuple
end
+ def pretty_print q # :nodoc:
+ q.group 2, '[LockSet', ']' do
+ q.breakable
+ q.text 'source:'
+
+ q.breakable
+ q.pp @source
+
+ q.breakable
+ q.text 'specs:'
+
+ q.breakable
+ q.pp @specs.map { |spec| spec.full_name }
+ end
+ end
+
end
diff --git a/lib/rubygems/resolver/vendor_set.rb b/lib/rubygems/resolver/vendor_set.rb
index c8826005a7..339492f690 100644
--- a/lib/rubygems/resolver/vendor_set.rb
+++ b/lib/rubygems/resolver/vendor_set.rb
@@ -64,5 +64,20 @@ class Gem::Resolver::VendorSet < Gem::Resolver::Set
@specs.fetch key
end
+ def pretty_print q # :nodoc:
+ q.group 2, '[VendorSet', ']' do
+ next if @directories.empty?
+ q.breakable
+
+ dirs = @directories.map do |spec, directory|
+ "#{spec.full_name}: #{directory}"
+ end
+
+ q.seplist dirs do |dir|
+ q.text dir
+ end
+ end
+ end
+
end
diff --git a/lib/rubygems/source.rb b/lib/rubygems/source.rb
index b6e2d97523..9553db18c6 100644
--- a/lib/rubygems/source.rb
+++ b/lib/rubygems/source.rb
@@ -49,6 +49,7 @@ class Gem::Source
case other
when Gem::Source::Installed,
Gem::Source::Local,
+ Gem::Source::Lock,
Gem::Source::SpecificFile,
Gem::Source::Git,
Gem::Source::Vendor then
@@ -213,5 +214,6 @@ require 'rubygems/source/git'
require 'rubygems/source/installed'
require 'rubygems/source/specific_file'
require 'rubygems/source/local'
+require 'rubygems/source/lock'
require 'rubygems/source/vendor'
diff --git a/lib/rubygems/source/git.rb b/lib/rubygems/source/git.rb
index 2794735c96..e8b03165c1 100644
--- a/lib/rubygems/source/git.rb
+++ b/lib/rubygems/source/git.rb
@@ -31,6 +31,11 @@ class Gem::Source::Git < Gem::Source
attr_reader :repository
##
+ # The directory for cache and git gem installation
+
+ attr_accessor :root_dir
+
+ ##
# Does this repository need submodules checked out too?
attr_reader :need_submodules
@@ -50,14 +55,16 @@ class Gem::Source::Git < Gem::Source
@reference = reference
@need_submodules = submodules
- @git = ENV['git'] || 'git'
+ @root_dir = Gem.dir
+ @git = ENV['git'] || 'git'
end
def <=> other
case other
when Gem::Source::Git then
0
- when Gem::Source::Installed then
+ when Gem::Source::Installed,
+ Gem::Source::Lock then
-1
when Gem::Source then
1
@@ -114,6 +121,13 @@ class Gem::Source::Git < Gem::Source
end
##
+ # Directory where git gems get unpacked and so-forth.
+
+ def base_dir # :nodoc:
+ File.join @root_dir, 'bundler'
+ end
+
+ ##
# A short reference for use in git gem directories
def dir_shortref # :nodoc:
@@ -130,14 +144,14 @@ class Gem::Source::Git < Gem::Source
# The directory where the git gem will be installed.
def install_dir # :nodoc:
- File.join Gem.dir, 'bundler', 'gems', "#{@name}-#{dir_shortref}"
+ File.join base_dir, 'gems', "#{@name}-#{dir_shortref}"
end
##
# The directory where the git gem's repository will be cached.
def repo_cache_dir # :nodoc:
- File.join Gem.dir, 'cache', 'bundler', 'git', "#{@name}-#{uri_hash}"
+ File.join @root_dir, 'cache', 'bundler', 'git', "#{@name}-#{uri_hash}"
end
##
@@ -162,7 +176,17 @@ class Gem::Source::Git < Gem::Source
Dir.chdir directory do
spec = Gem::Specification.load file
- spec.full_gem_path = File.expand_path '.' if spec
+ if spec then
+ loaded_from = File.expand_path file
+ spec.loaded_from = loaded_from
+ spec.base_dir = base_dir
+
+ spec.extension_install_dir =
+ File.join base_dir, 'extensions', Gem::Platform.local.to_s,
+ Gem.extension_api_version, "#{name}-#{dir_shortref}"
+
+ spec.full_gem_path = File.dirname loaded_from if spec
+ end
spec
end
end.compact
diff --git a/lib/rubygems/source/installed.rb b/lib/rubygems/source/installed.rb
index 2661dd6844..6d343c2439 100644
--- a/lib/rubygems/source/installed.rb
+++ b/lib/rubygems/source/installed.rb
@@ -12,7 +12,8 @@ class Gem::Source::Installed < Gem::Source
def <=> other
case other
- when Gem::Source::Vendor then
+ when Gem::Source::Lock,
+ Gem::Source::Vendor then
-1
when Gem::Source::Installed then
0
diff --git a/lib/rubygems/source/local.rb b/lib/rubygems/source/local.rb
index 3aae20c8ed..8057921163 100644
--- a/lib/rubygems/source/local.rb
+++ b/lib/rubygems/source/local.rb
@@ -15,7 +15,8 @@ class Gem::Source::Local < Gem::Source
def <=> other
case other
- when Gem::Source::Installed then
+ when Gem::Source::Installed,
+ Gem::Source::Lock then
-1
when Gem::Source::Local then
0
diff --git a/lib/rubygems/source/lock.rb b/lib/rubygems/source/lock.rb
new file mode 100644
index 0000000000..d8a46d8d10
--- /dev/null
+++ b/lib/rubygems/source/lock.rb
@@ -0,0 +1,44 @@
+##
+# A Lock source wraps an installed gem's source and sorts before other sources
+# during dependency resolution. This allows RubyGems to prefer gems from
+# dependency lock files.
+
+class Gem::Source::Lock < Gem::Source
+
+ ##
+ # The wrapped Gem::Source
+
+ attr_reader :wrapped
+
+ ##
+ # Creates a new Lock source that wraps +source+ and moves it earlier in the
+ # sort list.
+
+ def initialize source
+ @wrapped = source
+ end
+
+ def <=> other # :nodoc:
+ case other
+ when Gem::Source::Lock then
+ @wrapped <=> other.wrapped
+ when Gem::Source then
+ 1
+ else
+ nil
+ end
+ end
+
+ def == other # :nodoc:
+ 0 == (self <=> other)
+ end
+
+ ##
+ # Delegates to the wrapped source's fetch_spec method.
+
+ def fetch_spec name_tuple
+ @wrapped.fetch_spec name_tuple
+ end
+
+end
+
diff --git a/lib/rubygems/source/vendor.rb b/lib/rubygems/source/vendor.rb
index 244c4201d8..2d936231c1 100644
--- a/lib/rubygems/source/vendor.rb
+++ b/lib/rubygems/source/vendor.rb
@@ -12,6 +12,8 @@ class Gem::Source::Vendor < Gem::Source::Installed
def <=> other
case other
+ when Gem::Source::Lock then
+ -1
when Gem::Source::Vendor then
0
when Gem::Source then
diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb
index 2bcc2c0ef2..abfd139581 100644
--- a/lib/rubygems/specification.rb
+++ b/lib/rubygems/specification.rb
@@ -1031,7 +1031,7 @@ class Gem::Specification < Gem::BasicSpecification
spec = eval code, binding, file
if Gem::Specification === spec
- spec.loaded_from = file.to_s
+ spec.loaded_from = File.expand_path file.to_s
LOAD_CACHE[file] = spec
return spec
end
diff --git a/lib/rubygems/test_utilities.rb b/lib/rubygems/test_utilities.rb
index f7943adcee..ee5ef01203 100644
--- a/lib/rubygems/test_utilities.rb
+++ b/lib/rubygems/test_utilities.rb
@@ -101,6 +101,24 @@ class Gem::FakeFetcher
response
end
+ def pretty_print q # :nodoc:
+ q.group 2, '[FakeFetcher', ']' do
+ q.breakable
+ q.text 'URIs:'
+
+ q.breakable
+ q.pp @data.keys
+
+ unless @api_endpoints.empty? then
+ q.breakable
+ q.text 'API endpoints:'
+
+ q.breakable
+ q.pp @api_endpoints.keys
+ end
+ end
+ end
+
def fetch_size(path)
path = path.to_s
@paths << path
diff --git a/lib/rubygems/validator.rb b/lib/rubygems/validator.rb
index 1436a93ae6..6992af16ba 100644
--- a/lib/rubygems/validator.rb
+++ b/lib/rubygems/validator.rb
@@ -86,6 +86,7 @@ class Gem::Validator
Gem::Specification.each do |spec|
next unless gems.include? spec.name unless gems.empty?
+ next if spec.default_gem?
gem_name = spec.file_name
gem_path = spec.cache_file