mirror of
https://github.com/ruby/ruby.git
synced 2025-08-23 04:55:21 +02:00
* 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:
parent
66cc0fa4ab
commit
4c2304f000
34 changed files with 1169 additions and 597 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue