Grammar and stream of consciousness cleanup for Channel and Scheduler rdoc
[rbx.git] / lib / un.rb
blob9bf6c13146a906c8ed734225d4eafab2dd5aa640
1
2 # = un.rb
3
4 # Copyright (c) 2003 WATANABE Hirofumi <eban@ruby-lang.org>
5
6 # This program is free software.
7 # You can distribute/modify this program under the same terms of Ruby.
8
9 # == Utilities to replace common UNIX commands in Makefiles etc
11 # == SYNOPSIS
13 #   ruby -run -e cp -- [OPTION] SOURCE DEST
14 #   ruby -run -e ln -- [OPTION] TARGET LINK_NAME
15 #   ruby -run -e mv -- [OPTION] SOURCE DEST
16 #   ruby -run -e rm -- [OPTION] FILE
17 #   ruby -run -e mkdir -- [OPTION] DIRS
18 #   ruby -run -e rmdir -- [OPTION] DIRS
19 #   ruby -run -e install -- [OPTION] SOURCE DEST
20 #   ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
21 #   ruby -run -e touch -- [OPTION] FILE
22 #   ruby -run -e help [COMMAND]
24 require "fileutils"
25 require "optparse"
27 module FileUtils
28 #  @fileutils_label = ""
29   @fileutils_output = $stdout
30 end
32 def setup(options = "")
33   ARGV.map! do |x|
34     case x
35     when /^-/
36       x.delete "^-#{options}v"
37     when /[*?\[{]/
38       Dir[x]
39     else
40       x
41     end
42   end
43   ARGV.flatten!
44   ARGV.delete_if{|x| x == "-"}
45   opt_hash = {}
46   OptionParser.new do |o|
47     options.scan(/.:?/) do |s|
48       o.on("-" + s.tr(":", " ")) do |val|
49         opt_hash[s.delete(":").intern] = val
50       end
51     end
52     o.on("-v") do opt_hash[:verbose] = true end
53     o.parse!
54   end
55   yield ARGV, opt_hash
56 end
59 # Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY
61 #   ruby -run -e cp -- [OPTION] SOURCE DEST
63 #   -p          preserve file attributes if possible
64 #   -r          copy recursively
65 #   -v          verbose
68 def cp
69   setup("pr") do |argv, options|
70     cmd = "cp"
71     cmd += "_r" if options.delete :r
72     options[:preserve] = true if options.delete :p
73     dest = argv.pop
74     argv = argv[0] if argv.size == 1
75     FileUtils.send cmd, argv, dest, options
76   end
77 end
80 # Create a link to the specified TARGET with LINK_NAME.
82 #   ruby -run -e ln -- [OPTION] TARGET LINK_NAME
84 #   -s          make symbolic links instead of hard links
85 #   -f          remove existing destination files
86 #   -v          verbose
89 def ln
90   setup("sf") do |argv, options|
91     cmd = "ln"
92     cmd += "_s" if options.delete :s
93     options[:force] = true if options.delete :f
94     dest = argv.pop
95     argv = argv[0] if argv.size == 1
96     FileUtils.send cmd, argv, dest, options
97   end
98 end
101 # Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
103 #   ruby -run -e mv -- [OPTION] SOURCE DEST
105 #   -v          verbose
108 def mv
109   setup do |argv, options|
110     dest = argv.pop
111     argv = argv[0] if argv.size == 1
112     FileUtils.mv argv, dest, options
113   end
117 # Remove the FILE
119 #   ruby -run -e rm -- [OPTION] FILE
121 #   -f          ignore nonexistent files
122 #   -r          remove the contents of directories recursively
123 #   -v          verbose
126 def rm
127   setup("fr") do |argv, options|
128     cmd = "rm"
129     cmd += "_r" if options.delete :r
130     options[:force] = true if options.delete :f
131     FileUtils.send cmd, argv, options
132   end
136 # Create the DIR, if they do not already exist.
138 #   ruby -run -e mkdir -- [OPTION] DIR
140 #   -p          no error if existing, make parent directories as needed
141 #   -v          verbose
144 def mkdir
145   setup("p") do |argv, options|
146     cmd = "mkdir"
147     cmd += "_p" if options.delete :p
148     FileUtils.send cmd, argv, options
149   end
153 # Remove the DIR.
155 #   ruby -run -e rmdir -- [OPTION] DIR
157 #   -v          verbose
160 def rmdir
161   setup do |argv, options|
162     FileUtils.rmdir argv, options
163   end
167 # Copy SOURCE to DEST.
169 #   ruby -run -e install -- [OPTION] SOURCE DEST
171 #   -p          apply access/modification times of SOURCE files to
172 #               corresponding destination files
173 #   -m          set permission mode (as in chmod), instead of 0755
174 #   -v          verbose
177 def install
178   setup("pm:") do |argv, options|
179     options[:mode] = (mode = options.delete :m) ? mode.oct : 0755
180     options[:preserve] = true if options.delete :p
181     dest = argv.pop
182     argv = argv[0] if argv.size == 1
183     FileUtils.install argv, dest, options
184   end
188 # Change the mode of each FILE to OCTAL-MODE.
190 #   ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
192 #   -v          verbose
195 def chmod
196   setup do |argv, options|
197     mode = argv.shift.oct
198     FileUtils.chmod mode, argv, options
199   end
203 # Update the access and modification times of each FILE to the current time.
205 #   ruby -run -e touch -- [OPTION] FILE
207 #   -v          verbose
210 def touch
211   setup do |argv, options|
212     FileUtils.touch argv, options
213   end
217 # Display help message.
219 #   ruby -run -e help [COMMAND]
222 def help
223   setup do |argv,|
224     all = argv.empty?
225     open(__FILE__) do |me|
226       while me.gets("##\n")
227         if help = me.gets("\n\n")
228           if all or argv.delete help[/-e \w+/].sub(/-e /, "")
229             print help.gsub(/^# ?/, "")
230           end
231         end
232       end
233     end
234   end