2003-07-30 12:59:47 +04:00
|
|
|
#
|
|
|
|
# = un.rb
|
|
|
|
#
|
|
|
|
# Copyright (c) 2003 WATANABE Hirofumi <eban@ruby-lang.org>
|
|
|
|
#
|
|
|
|
# This program is free software.
|
|
|
|
# You can distribute/modify this program under the same terms of Ruby.
|
|
|
|
#
|
|
|
|
# == Utilities to replace common UNIX commands in Makefiles etc
|
|
|
|
#
|
|
|
|
# == SYNOPSIS
|
|
|
|
#
|
|
|
|
# ruby -run -e cp -- [OPTION] SOURCE DEST
|
|
|
|
# ruby -run -e ln -- [OPTION] TARGET LINK_NAME
|
|
|
|
# ruby -run -e mv -- [OPTION] SOURCE DEST
|
|
|
|
# ruby -run -e rm -- [OPTION] FILE
|
|
|
|
# ruby -run -e mkdir -- [OPTION] DIRS
|
|
|
|
# ruby -run -e rmdir -- [OPTION] DIRS
|
|
|
|
# ruby -run -e install -- [OPTION] SOURCE DEST
|
|
|
|
# ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
|
|
|
|
# ruby -run -e touch -- [OPTION] FILE
|
2003-08-03 13:32:23 +04:00
|
|
|
# ruby -run -e help [COMMAND]
|
2003-07-30 12:59:47 +04:00
|
|
|
|
2004-02-14 17:27:43 +03:00
|
|
|
require "fileutils"
|
|
|
|
require "optparse"
|
2003-07-29 14:24:28 +04:00
|
|
|
|
|
|
|
module FileUtils
|
2004-02-14 17:27:43 +03:00
|
|
|
# @fileutils_label = ""
|
2003-07-29 14:24:28 +04:00
|
|
|
@fileutils_output = $stdout
|
|
|
|
end
|
|
|
|
|
|
|
|
def setup(options = "")
|
|
|
|
ARGV.map! do |x|
|
|
|
|
case x
|
|
|
|
when /^-/
|
2004-02-14 17:27:43 +03:00
|
|
|
x.delete "^-#{options}v"
|
2003-07-29 14:24:28 +04:00
|
|
|
when /[*?\[{]/
|
|
|
|
Dir[x]
|
|
|
|
else
|
|
|
|
x
|
|
|
|
end
|
|
|
|
end
|
|
|
|
ARGV.flatten!
|
2004-02-14 17:27:43 +03:00
|
|
|
ARGV.delete_if{|x| x == "-"}
|
|
|
|
opt_hash = {}
|
|
|
|
OptionParser.new do |o|
|
|
|
|
options.scan(/.:?/) do |s|
|
|
|
|
o.on("-" + s.tr(":", " ")) do |val|
|
|
|
|
opt_hash[s.delete(":").intern] = val
|
|
|
|
end
|
|
|
|
end
|
|
|
|
o.on("-v") do opt_hash[:verbose] = true end
|
|
|
|
o.parse!
|
|
|
|
end
|
|
|
|
yield ARGV, opt_hash
|
2003-07-29 14:24:28 +04:00
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
2003-07-30 12:59:47 +04:00
|
|
|
# Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY
|
|
|
|
#
|
|
|
|
# ruby -run -e cp -- [OPTION] SOURCE DEST
|
|
|
|
#
|
|
|
|
# -p preserve file attributes if possible
|
|
|
|
# -r copy recursively
|
2003-08-02 08:21:10 +04:00
|
|
|
# -v verbose
|
2003-07-30 12:59:47 +04:00
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2003-07-30 12:59:47 +04:00
|
|
|
def cp
|
2004-02-14 17:27:43 +03:00
|
|
|
setup("pr") do |argv, options|
|
2003-07-30 12:59:47 +04:00
|
|
|
cmd = "cp"
|
2004-02-14 17:27:43 +03:00
|
|
|
cmd += "_r" if options.delete :r
|
|
|
|
options[:preserve] = true if options.delete :p
|
2003-07-30 12:59:47 +04:00
|
|
|
dest = argv.pop
|
|
|
|
argv = argv[0] if argv.size == 1
|
|
|
|
FileUtils.send cmd, argv, dest, options
|
2003-07-29 14:24:28 +04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
2003-07-30 12:59:47 +04:00
|
|
|
# Create a link to the specified TARGET with LINK_NAME.
|
|
|
|
#
|
|
|
|
# ruby -run -e ln -- [OPTION] TARGET LINK_NAME
|
|
|
|
#
|
|
|
|
# -s make symbolic links instead of hard links
|
|
|
|
# -f remove existing destination files
|
2003-08-02 08:21:10 +04:00
|
|
|
# -v verbose
|
2003-07-30 12:59:47 +04:00
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2003-07-29 14:24:28 +04:00
|
|
|
def ln
|
2004-02-14 17:27:43 +03:00
|
|
|
setup("sf") do |argv, options|
|
2003-07-29 14:24:28 +04:00
|
|
|
cmd = "ln"
|
2004-02-14 17:27:43 +03:00
|
|
|
cmd += "_s" if options.delete :s
|
|
|
|
options[:force] = true if options.delete :f
|
2003-07-29 14:24:28 +04:00
|
|
|
dest = argv.pop
|
|
|
|
argv = argv[0] if argv.size == 1
|
|
|
|
FileUtils.send cmd, argv, dest, options
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
2003-07-30 12:59:47 +04:00
|
|
|
# Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
|
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
# ruby -run -e mv -- [OPTION] SOURCE DEST
|
2003-07-30 12:59:47 +04:00
|
|
|
#
|
2003-08-02 08:21:10 +04:00
|
|
|
# -v verbose
|
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2003-07-29 14:24:28 +04:00
|
|
|
def mv
|
|
|
|
setup do |argv, options|
|
|
|
|
dest = argv.pop
|
|
|
|
argv = argv[0] if argv.size == 1
|
|
|
|
FileUtils.mv argv, dest, options
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
2003-07-30 12:59:47 +04:00
|
|
|
# Remove the FILE
|
|
|
|
#
|
|
|
|
# ruby -run -e rm -- [OPTION] FILE
|
|
|
|
#
|
|
|
|
# -f ignore nonexistent files
|
|
|
|
# -r remove the contents of directories recursively
|
2003-08-02 08:21:10 +04:00
|
|
|
# -v verbose
|
2003-07-30 12:59:47 +04:00
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2003-07-29 14:24:28 +04:00
|
|
|
def rm
|
2004-02-14 17:27:43 +03:00
|
|
|
setup("fr") do |argv, options|
|
2003-07-29 14:24:28 +04:00
|
|
|
cmd = "rm"
|
2004-02-14 17:27:43 +03:00
|
|
|
cmd += "_r" if options.delete :r
|
|
|
|
options[:force] = true if options.delete :f
|
2003-07-29 14:24:28 +04:00
|
|
|
FileUtils.send cmd, argv, options
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
2003-07-30 12:59:47 +04:00
|
|
|
# Create the DIR, if they do not already exist.
|
|
|
|
#
|
|
|
|
# ruby -run -e mkdir -- [OPTION] DIR
|
|
|
|
#
|
|
|
|
# -p no error if existing, make parent directories as needed
|
2003-08-02 08:21:10 +04:00
|
|
|
# -v verbose
|
2003-07-30 12:59:47 +04:00
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2003-07-30 12:59:47 +04:00
|
|
|
def mkdir
|
2004-02-14 17:27:43 +03:00
|
|
|
setup("p") do |argv, options|
|
2003-07-30 12:59:47 +04:00
|
|
|
cmd = "mkdir"
|
2004-02-14 17:27:43 +03:00
|
|
|
cmd += "_p" if options.delete :p
|
2003-07-30 12:59:47 +04:00
|
|
|
FileUtils.send cmd, argv, options
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
2003-07-30 12:59:47 +04:00
|
|
|
# Remove the DIR.
|
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
# ruby -run -e rmdir -- [OPTION] DIR
|
2003-07-30 12:59:47 +04:00
|
|
|
#
|
2003-08-02 08:21:10 +04:00
|
|
|
# -v verbose
|
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2003-07-30 12:59:47 +04:00
|
|
|
def rmdir
|
|
|
|
setup do |argv, options|
|
|
|
|
FileUtils.rmdir argv, options
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
2003-07-30 12:59:47 +04:00
|
|
|
# Copy SOURCE to DEST.
|
|
|
|
#
|
|
|
|
# ruby -run -e install -- [OPTION] SOURCE DEST
|
|
|
|
#
|
|
|
|
# -p apply access/modification times of SOURCE files to
|
|
|
|
# corresponding destination files
|
|
|
|
# -m set permission mode (as in chmod), instead of 0755
|
2003-08-02 08:21:10 +04:00
|
|
|
# -v verbose
|
2003-07-30 12:59:47 +04:00
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2003-07-29 14:24:28 +04:00
|
|
|
def install
|
2004-02-14 17:27:43 +03:00
|
|
|
setup("pm:") do |argv, options|
|
|
|
|
options[:mode] = (mode = options.delete :m) ? mode.oct : 0755
|
|
|
|
options[:preserve] = true if options.delete :p
|
2003-07-29 14:24:28 +04:00
|
|
|
dest = argv.pop
|
|
|
|
argv = argv[0] if argv.size == 1
|
|
|
|
FileUtils.install argv, dest, options
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
2003-07-30 12:59:47 +04:00
|
|
|
# Change the mode of each FILE to OCTAL-MODE.
|
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
# ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
|
2003-07-30 12:59:47 +04:00
|
|
|
#
|
2003-08-02 08:21:10 +04:00
|
|
|
# -v verbose
|
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2003-07-29 14:24:28 +04:00
|
|
|
def chmod
|
|
|
|
setup do |argv, options|
|
|
|
|
mode = argv.shift.oct
|
|
|
|
FileUtils.chmod mode, argv, options
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
2003-07-30 12:59:47 +04:00
|
|
|
# Update the access and modification times of each FILE to the current time.
|
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
# ruby -run -e touch -- [OPTION] FILE
|
2003-07-30 12:59:47 +04:00
|
|
|
#
|
2003-08-02 08:21:10 +04:00
|
|
|
# -v verbose
|
|
|
|
#
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2003-07-29 14:24:28 +04:00
|
|
|
def touch
|
|
|
|
setup do |argv, options|
|
|
|
|
FileUtils.touch argv, options
|
|
|
|
end
|
|
|
|
end
|
2003-08-03 13:32:23 +04:00
|
|
|
|
2008-06-02 13:51:30 +04:00
|
|
|
##
|
|
|
|
# Wait until the file becomes writable.
|
|
|
|
#
|
|
|
|
# ruby -run -e wait_writable -- [OPTION] FILE
|
|
|
|
#
|
|
|
|
|
|
|
|
def wait_writable
|
|
|
|
setup("n:w:v") do |argv, options|
|
|
|
|
verbose = options[:verbose]
|
|
|
|
n = options[:n] and n = Integer(n)
|
|
|
|
wait = (wait = options[:w]) ? Float(wait) : 0.2
|
|
|
|
argv.each do |file|
|
|
|
|
begin
|
|
|
|
open(file, "r+b")
|
|
|
|
rescue Errno::ENOENT
|
|
|
|
break
|
|
|
|
rescue Errno::EACCES => e
|
|
|
|
raise if n and (n -= 1) <= 0
|
|
|
|
puts e
|
|
|
|
STDOUT.flush
|
|
|
|
sleep wait
|
|
|
|
retry
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-03 13:32:23 +04:00
|
|
|
##
|
|
|
|
# Display help message.
|
|
|
|
#
|
|
|
|
# ruby -run -e help [COMMAND]
|
|
|
|
#
|
|
|
|
|
|
|
|
def help
|
|
|
|
setup do |argv,|
|
|
|
|
all = argv.empty?
|
|
|
|
open(__FILE__) do |me|
|
|
|
|
while me.gets("##\n")
|
|
|
|
if help = me.gets("\n\n")
|
|
|
|
if all or argv.delete help[/-e \w+/].sub(/-e /, "")
|
|
|
|
print help.gsub(/^# ?/, "")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|