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
|
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
# Looks for the first occurrence of _program_ within _path_.
#
# On the MS Windows platform, it looks for executables ending with .exe,
# .bat and .com, which you may optionally include in the program name.
# Returns <tt>nil</tt> if not found.
#
# CREDIT: Daniel J. Berger, Michael Granger
#
#--
# The which() method was adopted from Daniel J. Berger, via PTools
# which in in turn was adopted fromt the FileWhich code posted by
# Michael Granger on http://www.rubygarden.org.
#++
def which(prog, path=ENV['PATH'])
path.split(File::PATH_SEPARATOR).each {|dir|
# Windows checks against specific extensions
if File::ALT_SEPARATOR
ext = Win32Exts.find{|ext|
if prog.include?('.') # Assume extension already included
f = File.join(dir,prog)
else
f = File.join(dir,prog+ext)
end
File.executable?(f) && !File.directory?(f)
}
if ext
# Use backslashes, not forward slashes
if prog.include?('.') # Assume extension already included
f = File.join( dir, prog ).gsub(/\//,'\\')
else
f = File.join( dir, prog + ext ).gsub(/\//,'\\')
end
return f
end
else
f = File.join(dir,prog)
# Avoid /usr/lib/ruby, for example
if File.executable?(f) && !File.directory?(f)
return File::join( dir, prog )
end
end
}
nil
end
end
|