1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
require 'fileutils'
module FileUtils
if const_defined?(:Win32Exts)
Win32Exts.concat %w{.exe .com .bat .cmd}
Win32Exts.uniq!
else
Win32Exts = %w{.exe .com .bat .cmd}
end
module_function
# In block form, yields each ((*program*)) within ((*path*)). In non-block
# form, returns an array of each ((*program*)) within ((*path*)). Returns
# (({nil})) if not found.
#
# On the MS Windows platform, it looks for executables ending with .exe,
# .bat and .com, which you may optionally include in the program name:
#
# FileUtils.whereis("ruby") #=> ['/usr/local/bin/ruby','/opt/bin/ruby']
#
# CREDIT: Daniel J. Berger
def whereis(prog, path=ENV['PATH']) #:yield:
dirs = []
path.split(File::PATH_SEPARATOR).each{|dir|
# Windows checks against specific extensions
if File::ALT_SEPARATOR
if prog.include?('.')
f = File.join(dir,prog)
if File.executable?(f) && !File.directory?(f)
if block_given?
yield f.gsub(/\//,'\\')
else
dirs << f.gsub(/\//,'\\')
end
end
else
Win32Exts.find_all{|ext|
f = File.join(dir,prog+ext)
if File.executable?(f) && !File.directory?(f)
if block_given?
yield f.gsub(/\//,'\\')
else
dirs << f.gsub(/\//,'\\')
end
end
}
end
else
f = File.join(dir,prog)
# Avoid /usr/lib/ruby, for example
if File.executable?(f) && !File.directory?(f)
if block_given?
yield f
else
dirs << f
end
end
end
}
dirs.empty? ? nil : dirs
end
end
|