summaryrefslogtreecommitdiff
path: root/trunk/lib/un.rb
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-25 15:02:05 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-25 15:02:05 +0000
commit0dc342de848a642ecce8db697b8fecd83a63e117 (patch)
tree2b7ed4724aff1f86073e4740134bda9c4aac1a39 /trunk/lib/un.rb
parentef70cf7138ab8034b5b806f466e4b484b24f0f88 (diff)
added tag v1_9_0_4
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_9_0_4@18845 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'trunk/lib/un.rb')
-rw-r--r--trunk/lib/un.rb302
1 files changed, 302 insertions, 0 deletions
diff --git a/trunk/lib/un.rb b/trunk/lib/un.rb
new file mode 100644
index 0000000000..3dcdbede4a
--- /dev/null
+++ b/trunk/lib/un.rb
@@ -0,0 +1,302 @@
+#
+# = 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
+# ruby -run -e wait_writable -- [OPTION] FILE
+# ruby -run -e mkmf -- [OPTION] EXTNAME [OPTION]
+# ruby -run -e help [COMMAND]
+
+require "fileutils"
+require "optparse"
+
+module FileUtils
+# @fileutils_label = ""
+ @fileutils_output = $stdout
+end
+
+def setup(options = "", *long_options)
+ opt_hash = {}
+ argv = []
+ OptionParser.new do |o|
+ options.scan(/.:?/) do |s|
+ opt_name = s.delete(":").intern
+ o.on("-" + s.tr(":", " ")) do |val|
+ opt_hash[opt_name] = val
+ end
+ end
+ long_options.each do |s|
+ opt_name = s[/\A(?:--)?([^\s=]+)/, 1].intern
+ o.on(s.sub(/\A(?!--)/, '--')) do |val|
+ opt_hash[opt_name] = val
+ end
+ end
+ o.on("-v") do opt_hash[:verbose] = true end
+ o.order!(ARGV) do |x|
+ if /[*?\[{]/ =~ x
+ argv.concat(Dir[x])
+ else
+ argv << x
+ end
+ end
+ end
+ yield argv, opt_hash
+end
+
+##
+# 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
+# -v verbose
+#
+
+def cp
+ setup("pr") do |argv, options|
+ cmd = "cp"
+ cmd += "_r" if options.delete :r
+ options[:preserve] = true if options.delete :p
+ dest = argv.pop
+ argv = argv[0] if argv.size == 1
+ FileUtils.send cmd, argv, dest, options
+ end
+end
+
+##
+# 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
+# -v verbose
+#
+
+def ln
+ setup("sf") do |argv, options|
+ cmd = "ln"
+ cmd += "_s" if options.delete :s
+ options[:force] = true if options.delete :f
+ dest = argv.pop
+ argv = argv[0] if argv.size == 1
+ FileUtils.send cmd, argv, dest, options
+ end
+end
+
+##
+# Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
+#
+# ruby -run -e mv -- [OPTION] SOURCE DEST
+#
+# -v verbose
+#
+
+def mv
+ setup do |argv, options|
+ dest = argv.pop
+ argv = argv[0] if argv.size == 1
+ FileUtils.mv argv, dest, options
+ end
+end
+
+##
+# Remove the FILE
+#
+# ruby -run -e rm -- [OPTION] FILE
+#
+# -f ignore nonexistent files
+# -r remove the contents of directories recursively
+# -v verbose
+#
+
+def rm
+ setup("fr") do |argv, options|
+ cmd = "rm"
+ cmd += "_r" if options.delete :r
+ options[:force] = true if options.delete :f
+ FileUtils.send cmd, argv, options
+ end
+end
+
+##
+# 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
+# -v verbose
+#
+
+def mkdir
+ setup("p") do |argv, options|
+ cmd = "mkdir"
+ cmd += "_p" if options.delete :p
+ FileUtils.send cmd, argv, options
+ end
+end
+
+##
+# Remove the DIR.
+#
+# ruby -run -e rmdir -- [OPTION] DIR
+#
+# -v verbose
+#
+
+def rmdir
+ setup do |argv, options|
+ FileUtils.rmdir argv, options
+ end
+end
+
+##
+# 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
+# -v verbose
+#
+
+def install
+ setup("pm:") do |argv, options|
+ options[:mode] = (mode = options.delete :m) ? mode.oct : 0755
+ options[:preserve] = true if options.delete :p
+ dest = argv.pop
+ argv = argv[0] if argv.size == 1
+ FileUtils.install argv, dest, options
+ end
+end
+
+##
+# Change the mode of each FILE to OCTAL-MODE.
+#
+# ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
+#
+# -v verbose
+#
+
+def chmod
+ setup do |argv, options|
+ mode = argv.shift.oct
+ FileUtils.chmod mode, argv, options
+ end
+end
+
+##
+# Update the access and modification times of each FILE to the current time.
+#
+# ruby -run -e touch -- [OPTION] FILE
+#
+# -v verbose
+#
+
+def touch
+ setup do |argv, options|
+ FileUtils.touch argv, options
+ end
+end
+
+##
+# Wait until the file becomes writable.
+#
+# ruby -run -e wait_writable -- [OPTION] FILE
+#
+# -n RETRY count to retry
+# -w SEC each wait time in seconds
+# -v verbose
+#
+
+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
+
+##
+# Create makefile using mkmf.
+#
+# ruby -run -e mkmf -- [OPTION] EXTNAME [OPTION]
+#
+# -d ARGS run dir_config
+# -h ARGS run have_header
+# -l ARGS run have_library
+# -f ARGS run have_func
+# -v ARGS run have_var
+# -t ARGS run have_type
+# -m ARGS run have_macro
+# -c ARGS run have_const
+# --vendor install to vendor_ruby
+#
+
+def mkmf
+ setup("d:h:l:f:v:t:m:c:", "vendor") do |argv, options|
+ require 'mkmf'
+ opt = options[:d] and opt.split(/:/).each {|n| dir_config(*n.split(/,/))}
+ opt = options[:h] and opt.split(/:/).each {|n| have_header(*n.split(/,/))}
+ opt = options[:l] and opt.split(/:/).each {|n| have_library(*n.split(/,/))}
+ opt = options[:f] and opt.split(/:/).each {|n| have_func(*n.split(/,/))}
+ opt = options[:v] and opt.split(/:/).each {|n| have_var(*n.split(/,/))}
+ opt = options[:t] and opt.split(/:/).each {|n| have_type(*n.split(/,/))}
+ opt = options[:m] and opt.split(/:/).each {|n| have_macro(*n.split(/,/))}
+ opt = options[:c] and opt.split(/:/).each {|n| have_const(*n.split(/,/))}
+ $configure_args["--vendor"] = true if options[:vendor]
+ create_makefile(*argv)
+ end
+end
+
+##
+# 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