* lib/rubygems: Import RubyGems from master as of commit b165260

* test/rubygems:  ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42124 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
drbrain 2013-07-22 22:46:50 +00:00
parent 66cc0fa4ab
commit 4c2304f000
34 changed files with 1169 additions and 597 deletions

View file

@ -31,6 +31,10 @@ class Gem::Commands::ContentsCommand < Gem::Command
"Don't include installed path prefix") do |prefix, options|
options[:prefix] = prefix
end
@path_kind = nil
@spec_dirs = nil
@version = nil
end
def arguments # :nodoc:
@ -46,74 +50,113 @@ class Gem::Commands::ContentsCommand < Gem::Command
end
def execute
version = options[:version] || Gem::Requirement.default
@version = options[:version] || Gem::Requirement.default
@spec_dirs = specification_directories
@path_kind = path_description @spec_dirs
spec_dirs = options[:specdirs].map do |i|
[i, File.join(i, "specifications")]
end.flatten
names = gem_names
path_kind = if spec_dirs.empty? then
spec_dirs = Gem::Specification.dirs
"default gem paths"
else
"specified path"
end
names.each do |name|
found = gem_contents name
gem_names = if options[:all] then
Gem::Specification.map(&:name)
else
get_all_gem_names
end
terminate_interaction 1 unless found or names.length > 1
end
end
gem_names.each do |name|
# HACK: find_by_name fails for some reason... ARGH
# How many places must we embed our resolve logic?
spec = Gem::Specification.find_all_by_name(name, version).last
def files_in spec
if spec.default_gem? then
files_in_default_gem spec
else
files_in_gem spec
end
end
unless spec then
say "Unable to find gem '#{name}' in #{path_kind}"
def files_in_gem spec
gem_path = spec.full_gem_path
extra = "/{#{spec.require_paths.join ','}}" if options[:lib_only]
glob = "#{gem_path}#{extra}/**/*"
prefix_re = /#{Regexp.escape(gem_path)}\//
if Gem.configuration.verbose then
say "\nDirectories searched:"
spec_dirs.sort.each { |dir| say dir }
end
Dir[glob].map do |file|
[gem_path, file.sub(prefix_re, "")]
end
end
terminate_interaction 1 if gem_names.length == 1
end
if spec.default_gem?
files = spec.files.sort.map do |file|
case file
when /\A#{spec.bindir}\//
[Gem::ConfigMap[:bindir], $POSTMATCH]
when /\.so\z/
[Gem::ConfigMap[:archdir], file]
else
[Gem::ConfigMap[:rubylibdir], file]
end
end
def files_in_default_gem spec
spec.files.sort.map do |file|
case file
when /\A#{spec.bindir}\//
[Gem::ConfigMap[:bindir], $POSTMATCH]
when /\.so\z/
[Gem::ConfigMap[:archdir], file]
else
gem_path = spec.full_gem_path
extra = "/{#{spec.require_paths.join ','}}" if options[:lib_only]
glob = "#{gem_path}#{extra}/**/*"
prefix_re = /#{Regexp.escape(gem_path)}\//
files = Dir[glob].map do |file|
[gem_path, file.sub(prefix_re, "")]
end
end
files.sort.each do |prefix, basename|
absolute_path = File.join(prefix, basename)
next if File.directory? absolute_path
if options[:prefix]
say absolute_path
else
say basename
end
[Gem::ConfigMap[:rubylibdir], file]
end
end
end
def gem_contents name
spec = spec_for name
return false unless spec
files = files_in spec
show_files files
true
end
def gem_names # :nodoc:
if options[:all] then
Gem::Specification.map(&:name)
else
get_all_gem_names
end
end
def path_description spec_dirs # :nodoc:
if spec_dirs.empty? then
spec_dirs = Gem::Specification.dirs
"default gem paths"
else
"specified path"
end
end
def show_files files
files.sort.each do |prefix, basename|
absolute_path = File.join(prefix, basename)
next if File.directory? absolute_path
if options[:prefix] then
say absolute_path
else
say basename
end
end
end
def spec_for name
spec = Gem::Specification.find_all_by_name(name, @version).last
return spec if spec
say "Unable to find gem '#{name}' in #{@path_kind}"
if Gem.configuration.verbose then
say "\nDirectories searched:"
@spec_dirs.sort.each { |dir| say dir }
end
return nil
end
def specification_directories # :nodoc:
options[:specdirs].map do |i|
[i, File.join(i, "specifications")]
end.flatten
end
end