1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/lib/rubygems/commands/which_command.rb
hsbt 5335ce0e06 Merge master branch from rubygems/rubygems upstream.
* Enable Style/MethodDefParentheses in Rubocop
    https://github.com/rubygems/rubygems/pull/2478
  * Enable Style/MultilineIfThen in Rubocop
    https://github.com/rubygems/rubygems/pull/2479
  * Fix required_ruby_version with prereleases and improve error message
    https://github.com/rubygems/rubygems/pull/2344
  * Fix bundler rubygems binstub not properly looking for bundler
    https://github.com/rubygems/rubygems/pull/2426

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65904 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-11-21 10:20:47 +00:00

90 lines
2.1 KiB
Ruby

# frozen_string_literal: true
require 'rubygems/command'
class Gem::Commands::WhichCommand < Gem::Command
def initialize
super 'which', 'Find the location of a library file you can require',
:search_gems_first => false, :show_all => false
add_option '-a', '--[no-]all', 'show all matching files' do |show_all, options|
options[:show_all] = show_all
end
add_option '-g', '--[no-]gems-first',
'search gems before non-gems' do |gems_first, options|
options[:search_gems_first] = gems_first
end
end
def arguments # :nodoc:
"FILE name of file to find"
end
def defaults_str # :nodoc:
"--no-gems-first --no-all"
end
def description # :nodoc:
<<-EOF
The which command is like the shell which command and shows you where
the file you wish to require lives.
You can use the which command to help determine why you are requiring a
version you did not expect or to look at the content of a file you are
requiring to see why it does not behave as you expect.
EOF
end
def execute
found = true
options[:args].each do |arg|
arg = arg.sub(/#{Regexp.union(*Gem.suffixes)}$/, '')
dirs = $LOAD_PATH
spec = Gem::Specification.find_by_path arg
if spec
if options[:search_gems_first]
dirs = spec.full_require_paths + $LOAD_PATH
else
dirs = $LOAD_PATH + spec.full_require_paths
end
end
# TODO: this is totally redundant and stupid
paths = find_paths arg, dirs
if paths.empty?
alert_error "Can't find Ruby library file or shared library #{arg}"
found &&= false
else
say paths
end
end
terminate_interaction 1 unless found
end
def find_paths(package_name, dirs)
result = []
dirs.each do |dir|
Gem.suffixes.each do |ext|
full_path = File.join dir, "#{package_name}#{ext}"
if File.exist? full_path and not File.directory? full_path
result << full_path
return result unless options[:show_all]
end
end
end
result
end
def usage # :nodoc:
"#{program_name} FILE [FILE ...]"
end
end