summaryrefslogtreecommitdiff
path: root/lib/rubygems/commands/contents_command.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/commands/contents_command.rb')
-rw-r--r--lib/rubygems/commands/contents_command.rb167
1 files changed, 58 insertions, 109 deletions
diff --git a/lib/rubygems/commands/contents_command.rb b/lib/rubygems/commands/contents_command.rb
index 97218848ed..42c7fabd86 100644
--- a/lib/rubygems/commands/contents_command.rb
+++ b/lib/rubygems/commands/contents_command.rb
@@ -31,10 +31,6 @@ 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:
@@ -45,125 +41,78 @@ class Gem::Commands::ContentsCommand < Gem::Command
"--no-lib-only --prefix"
end
- def description # :nodoc:
- <<-EOF
-The contents command lists the files in an installed gem. The listing can
-be given as full file names, file names without the installed directory
-prefix or only the files that are requireable.
- EOF
- end
-
def usage # :nodoc:
"#{program_name} GEMNAME [GEMNAME ...]"
end
def execute
- @version = options[:version] || Gem::Requirement.default
- @spec_dirs = specification_directories
- @path_kind = path_description @spec_dirs
-
- names = gem_names
-
- names.each do |name|
- found = gem_contents name
-
- terminate_interaction 1 unless found or names.length > 1
- end
- end
-
- def files_in spec
- if spec.default_gem? then
- files_in_default_gem spec
- else
- files_in_gem spec
- end
- end
+ version = options[:version] || Gem::Requirement.default
- 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)}\//
-
- Dir[glob].map do |file|
- [gem_path, file.sub(prefix_re, "")]
- end
- end
+ spec_dirs = options[:specdirs].map do |i|
+ [i, File.join(i, "specifications")]
+ end.flatten
- 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::ConfigMap[:rubylibdir], file]
+ path_kind = if spec_dirs.empty? then
+ spec_dirs = Gem::Specification.dirs
+ "default gem paths"
+ else
+ "specified path"
+ end
+
+ gem_names = if options[:all] then
+ Gem::Specification.map(&:name)
+ else
+ get_all_gem_names
+ 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
+
+ unless spec then
+ 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
+
+ terminate_interaction 1 if gem_names.length == 1
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
+ 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
else
- say basename
+ 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
- end
- end
-
- def spec_for name
- spec = Gem::Specification.find_all_by_name(name, @version).last
- return spec if spec
+ files.sort.each do |prefix, basename|
+ absolute_path = File.join(prefix, basename)
+ next if File.directory? absolute_path
- say "Unable to find gem '#{name}' in #{@path_kind}"
-
- if Gem.configuration.verbose then
- say "\nDirectories searched:"
- @spec_dirs.sort.each { |dir| say dir }
+ if options[:prefix]
+ say absolute_path
+ else
+ say basename
+ end
+ end
end
-
- return nil
- end
-
- def specification_directories # :nodoc:
- options[:specdirs].map do |i|
- [i, File.join(i, "specifications")]
- end.flatten
end
end