rwdshell 0.96 → 0.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. data/Readme.txt +7 -0
  2. data/code/superant.com.rwdshell/helptexthashshell.rb +24 -0
  3. data/code/superant.com.rwdshell/loadconfigurationrecord.rb +2 -2
  4. data/code/superant.com.rwdshell/openhelpwindowshell.rb +27 -0
  5. data/code/superant.com.rwdshell/playrubyscript.rb +2 -1
  6. data/code/superant.com.rwdshell/playscript.rb +2 -1
  7. data/code/superant.com.rwdshell/shelleval.rb +1 -1
  8. data/code/superant.com.rwdtinkerbackwindow/helptexthashtinkerwin2.rb +4 -1
  9. data/code/superant.com.rwdtinkerbackwindow/installapplet.rb +5 -3
  10. data/code/superant.com.rwdtinkerbackwindow/removeapplet.rb +10 -6
  11. data/configuration/language.dist +7 -0
  12. data/configuration/rwdapplicationidentity.dist +3 -0
  13. data/configuration/rwdshell.dist +3 -0
  14. data/configuration/{rwdtinker.cnf → rwdtinker.dist} +3 -1
  15. data/configuration/{tinkerwin2variables.cnf → tinkerwin2variables.dist} +6 -1
  16. data/extras/rconftool.rb +380 -0
  17. data/gui/frontwindow0/superant.com.shellscripts/1listplayscripts.rwd +1 -1
  18. data/gui/frontwindow0/superant.com.shellscripts/2listscripts.rwd +2 -2
  19. data/gui/frontwindow0/superant.com.shellscripts/6rwdshelleval.rwd +3 -4
  20. data/gui/frontwindowtdocuments/superant.com.shelldocument/vvdocshellxp.rwd +6 -0
  21. data/init.rb +20 -2
  22. data/rwd_files/HowTo_Shell.txt +9 -0
  23. data/rwd_files/HowTo_Tinker.txt +8 -0
  24. data/rwdconfig.dist +6 -0
  25. data/tests/checkdepends.sh +4 -0
  26. data/tests/cleancnf.sh +5 -0
  27. data/tests/makedist.rb +29 -0
  28. data/tests/rdep.rb +354 -0
  29. metadata +18 -14
  30. data/code/superant.com.rwdshell/helptexthashrubyslippers.rb +0 -81
  31. data/code/superant.com.rwdshell/openhelpwindowrubyslippers.rb +0 -50
  32. data/configuration/language.cnf +0 -5
  33. data/configuration/playscripts.cnf +0 -2
  34. data/configuration/rwdapplicationidentity.cnf +0 -3
  35. data/configuration/rwdshellversion.cnf +0 -2
  36. data/configuration/rwdtinkerversion.cnf +0 -2
  37. data/configuration/tinkerwin2version.cnf +0 -3
  38. data/installed/rwdshell-0.95.inf +0 -14
data/Readme.txt CHANGED
@@ -193,9 +193,16 @@ http://www.erikveen.dds.nl/rubywebdialogs/index.html
193
193
  Thanks, Steven Gibson
194
194
 
195
195
  == Changelog
196
+ version 0.97
197
+ updated for rwdtinker version 1.58
198
+ added rconftool use to update configuration files
199
+ changed applets removal to not use external rm
200
+ removed version number from directory name
201
+
196
202
  version 0.96
197
203
  updated for rwdtinker 1.56
198
204
  first debian version
205
+ correct execute shell script to work with changed scripts directory
199
206
 
200
207
  version 0.95
201
208
  added ruby script running
@@ -0,0 +1,24 @@
1
+
2
+
3
+ Helptext.update( :rwdshell_help => " You can get a list of all scripts by clicking the listfiles button
4
+
5
+ To see the text of a script
6
+ Type in the name of the script you want.
7
+
8
+ type it without the sh ending
9
+ myscript
10
+
11
+ Then click the 'ViewScript' button
12
+
13
+ If it finds the script it will open it.
14
+ It displays the text the search box.",
15
+ :ShellEnvironment_help => "You can view the setup that
16
+ is on your system.
17
+
18
+ Click on Fill
19
+ This will show your setup
20
+
21
+ You can edit the commands or comment
22
+
23
+ Click on the 'save' then reload variables"
24
+ )
@@ -3,13 +3,13 @@
3
3
 
4
4
  require 'fileutils'
5
5
 
6
- @a_rshellconfigurationfilename = "playscripts.cnf"
6
+ @a_rshellconfigurationfilename = "rwdshell.cnf"
7
7
 
8
8
 
9
9
  begin # exception trapped block
10
10
 
11
11
  Dir.chdir($progdir)
12
- fileName = File.join(ConfigurationDir, "playscripts.cnf")
12
+ fileName = File.join(ConfigurationDir, "rwdshell.cnf")
13
13
 
14
14
 
15
15
  fd = File.open(fileName,"r")
@@ -0,0 +1,27 @@
1
+ # this code is to call the help window
2
+ def runhelpwindowrwdshell
3
+
4
+ $help_topic = "rwdshell_help"
5
+ if @rwd_tab == "scriptlister"
6
+ $help_topic = "rwdshell_help"
7
+ end
8
+
9
+ if @rwd_tab == "viewrwdshellconfiguration"
10
+ $help_topic = "ShellEnvironment_help"
11
+ end
12
+
13
+
14
+
15
+ $helptopicsarray = $helptopicsarray | ["rwdshell_help", "ShellEnvironment_help"]
16
+ $previouswindow = @rwd_window
17
+ $previoustab = @rwd_tab
18
+
19
+
20
+ if @rwd_window != "rwdtinkerhelpwindow"
21
+ $previouswindow = @rwd_window
22
+ $previoustab = @rwd_tab
23
+ end
24
+ runhelpwindow
25
+ end
26
+
27
+
@@ -4,7 +4,8 @@
4
4
  nametext = "%s" % [@a_rubyscriptcmd]
5
5
 
6
6
  begin # exception trapped block
7
- fileName = "scripts/" + nametext + ".rb"
7
+
8
+ fileName = $shellscript_directory + "/" + nametext + ".rb"
8
9
 
9
10
 
10
11
  rubyfile_contents = File.read( fileName)
@@ -4,7 +4,8 @@
4
4
  nametext = "%s" % [@a_scriptcmd]
5
5
 
6
6
  begin # exception trapped block
7
- fileName = "scripts/" + nametext + ".sh"
7
+
8
+ fileName = $shellscript_directory + "/" + nametext + ".sh"
8
9
 
9
10
  fd = File.open(fileName,"r")
10
11
 
@@ -5,7 +5,7 @@
5
5
  commandtext = "%s " % [@a_shelleval]
6
6
 
7
7
  begin # exception trapped block
8
- system(commandtext+' > temp.output')
8
+ commandtextnext = File.join($shellscript_directory,commandtext)
9
9
 
10
10
 
11
11
  @result =`#{commandtext}`
@@ -9,6 +9,7 @@
9
9
 
10
10
  rwdtinker applets packaged as RubyGems can be used if you have RubyGems installed.
11
11
  You can download rwdtinker gems at the 'Install Remote Applets' tab
12
+ to install applets you need the ruby zlib library installed
12
13
  ",
13
14
  :applet_viewing => "You can get a list of all installed applets by clicking the 'listfiles button'
14
15
  To see the text of a install file
@@ -32,7 +33,9 @@
32
33
  chose the applet you want\n
33
34
  click on 'install applet'\n
34
35
  If all goes well the applet should be installed.\n
35
- You will need to restart rwdtinker to see the new screens",
36
+ You will need to restart rwdtinker to see the new screens
37
+ to install applets you need the ruby zlib library installed",
38
+
36
39
  :applet_tinkerbackeditconfiguration => " You can edit the configuration
37
40
 
38
41
  Remember to reload the configuration variables if you want your
@@ -1,10 +1,12 @@
1
1
  # code in install rwdtinker applets - now uses ruby.zip module
2
2
  def installapplet
3
- require 'fileutils'
4
- require 'extras/zip/zip'
3
+
5
4
  nametext = "%s" % [@a_installapplet]
6
-
5
+
7
6
  begin # exception trapped block
7
+
8
+
9
+ require 'extras/zip/zip'
8
10
  fullname = nametext + ".zip"
9
11
  fileName = File.join($zipslocation,fullname)
10
12
 
@@ -10,19 +10,23 @@
10
10
 
11
11
  fd.each { |oneline|
12
12
  if count == 1
13
- commandline = "rm -r " + oneline
14
- system( commandline+' > temp.output' )
13
+ if File.exist?(oneline.chop)
14
+ FileUtils.rm_rf( oneline.chop)
15
+ end
16
+
15
17
  end
16
18
  count = 1
17
19
  }
18
20
  fd.close
19
- commandline = "rm " + fileName
21
+
22
+ FileUtils.rm_rf( fileName)
23
+
20
24
 
21
- system(commandline)
22
25
  @removeapplettext = "applet files removed! - restart rwd to finish uninstalling"
23
26
 
24
27
  rescue
25
- @removeapplettext = "\n" + "error"
26
- end # exception rescue
28
+ @removeapplettext = "\n" + "error"
29
+
30
+ end # exception rescue
27
31
 
28
32
  end
@@ -0,0 +1,7 @@
1
+ ##VERSION:1.57
2
+ #language selection file
3
+ ##NAME:$lang:0
4
+ #$lang = "jp"
5
+ $lang= "en"
6
+ #$lang= "nl"
7
+ #$lang= "es"
@@ -0,0 +1,3 @@
1
+ ##VERSION:1.58
2
+ $rwdapplicationidentity = "rwdshell application"
3
+
@@ -0,0 +1,3 @@
1
+ ##VERSION:0.97
2
+ $shellscript_directory = "scripts"
3
+ RwdShellVersion = "0.97"
@@ -1,4 +1,4 @@
1
-
1
+ ##VERSION:1.58
2
2
  ConfigurationDir = "configuration" # for use in program - init.rb has this value without using this constant
3
3
  CodeName = "rwdtinker"
4
4
  CodeNameFile = CodeName + ".rb"
@@ -11,3 +11,5 @@ LangDir = "lang"
11
11
  $prevouswindow ="main"
12
12
  $rwdcontrolports =["13713","13714","13715","13716","13717","13718"]
13
13
  $port = 7705
14
+
15
+ RwdTinkerVersion = "1.58"
@@ -1,12 +1,17 @@
1
-
1
+ ##VERSION:1.57
2
2
  TinkerWin2ConfigurationFileName = "tinkerwin2variables.cnf" # this file name - do not change
3
+ ##NAME:$zipslocation:0
3
4
  $zipslocation = "zips" # location of applets to add
4
5
  $zipsarray = [""] ; $zipsarraylocal = [""]
6
+ ##NAME:$xpcommand:0
5
7
  $xpcommand = " " # Linux machines
6
8
  # $xpcommand = "cmd /C " # XP machines with cmd shell
9
+ ##NAME:$gemdirectory_withgemfiles:0
7
10
  $gemdirectory_withgemfiles = "/usr/lib/ruby/gems/1.8/gems"
8
11
  # $gemdirectory_withgemfiles = "c:\\ruby\\lib\\ruby\\gems\\1.8\\gems" # XP machine
12
+ ##NAME:$geminstalled_directory:0
9
13
  # $geminstalled_directory = "/ruby/lib/ruby/gems/1.8/gems" # XP machine
10
14
  $geminstalled_directory = "/usr/lib/ruby/gems/1.8/gems" # Debian Linux
11
15
 
16
+ RwdTinkerWin2Version = "0.8"
12
17
 
@@ -0,0 +1,380 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ # Copyright (c) 2005 Brian Candler
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to
7
+ # deal in the Software without restriction, including without limitation the
8
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9
+ # sell copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
+ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
+ # IN THE SOFTWARE.
22
+
23
+ ##########################################################################
24
+ # rconftool is a reimplementation of Sam Varshavchik's sysconftool in Ruby.
25
+ # See http://www.courier-mta.org/sysconftool/ for details of the original.
26
+ # Its purpose is to keep configuration files "fresh" when upgrading an
27
+ # application from one version to another, ensuring that all necessary
28
+ # settings are present and obsolete ones removed.
29
+ #
30
+ # rconftool can be called as a library function or from the command line. It
31
+ # can also install groups of files recursively from one directory tree into
32
+ # another.
33
+ ##########################################################################
34
+
35
+ require 'fileutils'
36
+
37
+ module Rconftool
38
+ VERSION = "0.1"
39
+ class NoVersionLine < RuntimeError; end
40
+
41
+ # This module function installs a single source (.dist) file to a target
42
+ # location, having first merged in any compatible settings from the
43
+ # target file if it existed previously [if it does not exist, any settings
44
+ # from 'oldfile' are used instead]
45
+ #
46
+ # If the distfile is not in sysconftool format (i.e. doesn't have a
47
+ # ##VERSION: header within the first 20 lines), then for safety it is only
48
+ # installed if the target file does not already exist. No attempt at data
49
+ # merging is made in that case.
50
+
51
+ def self.install(distfile, targetfile=nil, oldfile=nil, opt={})
52
+ debug = opt[:debug] || $stdout
53
+
54
+ targetfile ||= distfile
55
+ if opt[:strip_regexp]
56
+ targetfile = targetfile.sub(opt[:strip_regexp], '')
57
+ oldfile = oldfile.sub(opt[:strip_regexp], '') if oldfile
58
+ end
59
+ if opt[:add_suffix]
60
+ targetfile = targetfile + opt[:add_suffix]
61
+ oldfile = oldfile + opt[:add_suffix] if oldfile
62
+ end
63
+ raise Errno::EEXIST, "#{distfile}: dist and target filenames are the same" if distfile == targetfile
64
+
65
+ # Read in the source (.dist) file
66
+ begin
67
+ src = ConfigFile.new(distfile)
68
+ rescue NoVersionLine
69
+ # Fallback behaviour when installing a file which is not in sysconftool
70
+ # format: we install the file only if it doesn't already exist
71
+ if File.exist?(targetfile)
72
+ debug << "#{targetfile}: already exists, skipping\n"
73
+ return
74
+ end
75
+ return if opt[:noclobber]
76
+ copyfrom = (oldfile and File.exist?(oldfile)) ? oldfile : distfile
77
+ if File.symlink?(copyfrom)
78
+ File.symlink(File.readlink(copyfrom), targetfile)
79
+ debug << "#{targetfile}: symlink copied from #{copyfrom}\n"
80
+ else
81
+ FileUtils.cp copyfrom, targetfile, :preserve=>true
82
+ debug << "#{targetfile}: copied from #{copyfrom}\n"
83
+ end
84
+ return
85
+ end
86
+
87
+ # OK, so we have a sysconftool file to install. Read in the existing
88
+ # target file, or if that does not exist, the oldfile
89
+ begin
90
+ old = ConfigFile.new
91
+ old.read(targetfile)
92
+ rescue NoVersionLine
93
+ # That's OK; the old target will be renamed to .bak
94
+ rescue Errno::ENOENT
95
+ begin
96
+ target_missing = true
97
+ old.read(oldfile) if oldfile
98
+ rescue Errno::ENOENT, NoVersionLine
99
+ end
100
+ end
101
+
102
+ # Same VERSION? No merge is required
103
+ if src.version == old.version and not opt[:force]
104
+ if target_missing
105
+ FileUtils.cp oldfile, targetfile, :preserve=>true
106
+ debug << "#{targetfile}: same VERSION, copied from #{oldfile}\n"
107
+ return
108
+ end
109
+ debug << "#{targetfile}: same VERSION, no change\n"
110
+ return
111
+ end
112
+
113
+ # Merge in old settings (note: any settings which are in targetfile but
114
+ # not in distfile will be silently dropped)
115
+ debug << "#{targetfile}:\n"
116
+ src.settings[1..-1].each do |src_setting|
117
+ name = src_setting.name
118
+ old_setting = old[name]
119
+ unless old_setting
120
+ debug << " #{name}: new\n"
121
+ next
122
+ end
123
+ if old_setting.version == src_setting.version
124
+ debug << " #{name}: unchanged\n"
125
+ src_setting.add_comment("\n DEFAULT SETTING from #{distfile}:\n")
126
+ src_setting.add_comment(src_setting.content)
127
+ src_setting.content = old_setting.content
128
+ next
129
+ end
130
+ # Otherwise, must install updated setting and comment out
131
+ # the current setting for reference
132
+ debug << " #{name}: UPDATED\n"
133
+ src_setting.add_comment("\n Previous setting (inserted by rconftool):\n\n")
134
+ src_setting.add_comment(old_setting.content)
135
+ end
136
+
137
+ return if opt[:noclobber]
138
+
139
+ # Write out the new file and carry forward permissions
140
+ begin
141
+ tempfile = targetfile+".new#{$$}"
142
+ src.write(tempfile)
143
+ st = File.stat(distfile)
144
+ begin
145
+ File.chown(st.uid, st.gid, tempfile)
146
+ rescue Errno::EPERM
147
+ end
148
+ File.chmod(st.mode, tempfile)
149
+ File.rename(targetfile, targetfile+".bak") unless target_missing
150
+ File.rename(tempfile, targetfile)
151
+ rescue
152
+ File.delete(tempfile) rescue nil
153
+ raise
154
+ end
155
+ end
156
+
157
+ HEADER_ID = '__header__'
158
+
159
+ # Object to represent a single setting
160
+
161
+ class Setting
162
+ attr_reader :name, :version
163
+ attr_accessor :content
164
+
165
+ def initialize(name, version)
166
+ @name = name.gsub(/\s+/,'')
167
+ @version = version.gsub(/s+/,'')
168
+ @comment = ""
169
+ @content = ""
170
+ @in_content = false
171
+ end
172
+ def <<(str)
173
+ @in_content = true unless /\A#/ =~ str
174
+ if @in_content
175
+ @content << str
176
+ else
177
+ @comment << str
178
+ end
179
+ end
180
+ # Add text to 'comment' portion of setting, prefixing each line with '#'
181
+ def add_comment(str)
182
+ @comment << str.gsub(/^/,'#')
183
+ end
184
+ def to_s
185
+ return "#{@comment}#{@content}" if @name == HEADER_ID
186
+ return "##NAME: #{@name}:#{@version}\n#{@comment}#{@content}"
187
+ end
188
+ end # class Setting
189
+
190
+ # Object to represent an entire configuration file. It consists of
191
+ # an array of Setting objects, with the first one having a special name
192
+ # (__header__). We also keep a hash of setting name => setting object
193
+ # to enable us to find a particular setting quickly.
194
+
195
+ class ConfigFile
196
+ attr_reader :version, :settings
197
+
198
+ def initialize(filename=nil)
199
+ read(filename) if filename
200
+ end
201
+
202
+ # fetch a setting by name
203
+ def [](item)
204
+ @settings_hash[item]
205
+ end
206
+
207
+ def read(filename)
208
+ @version = nil
209
+ curr_setting = Setting.new(HEADER_ID,'')
210
+ @settings = [curr_setting]
211
+ @settings_hash = {}
212
+
213
+ File.open(filename) do |f|
214
+ # VERSION header must occur within first 20 lines
215
+ 20.times do
216
+ line = f.gets
217
+ break unless line
218
+ curr_setting << line
219
+ if line =~ /\A##VERSION:/
220
+ @version = line
221
+ break
222
+ end
223
+ end
224
+ raise NoVersionLine, "#{filename}: No VERSION line found" unless @version
225
+
226
+ while line = f.gets
227
+ unless line =~ /\A##NAME:(.*):(.*)/
228
+ curr_setting << line
229
+ next
230
+ end
231
+ curr_setting = Setting.new($1,$2)
232
+ @settings << curr_setting
233
+ @settings_hash[curr_setting.name] = curr_setting
234
+ end
235
+ end
236
+ end
237
+
238
+ def write(filename)
239
+ File.open(filename,"w") do |f|
240
+ @settings.each do |s|
241
+ f << s.to_s
242
+ end
243
+ end
244
+ end
245
+ end # class ConfigFile
246
+
247
+ # Yield directory contents recursively, without doing chdir(). Note
248
+ # that yielded pathnames are relative to the base directory given;
249
+ # so that, for example, you can simulate 'cp -r /foo/bar/ /baz/' by
250
+ # recurse_dir("/foo/bar") { |n| copy("/foo/bar/"+n,"/baz/"+n) unless
251
+ # File.directory?("/foo/bar/"+n) }
252
+ # Current behaviour is that if a directory is a symlink, we follow it.
253
+ # (Perhaps the block we yield should return true/false?)
254
+
255
+ def self.recurse_dir(base)
256
+ base = base+File::SEPARATOR unless base[-1,1] == File::SEPARATOR
257
+ dirs = ['']
258
+ while dir = dirs.pop
259
+ yield dir unless dir == ''
260
+ Dir.foreach(base+dir) do |n|
261
+ next if n == '.' || n == '..'
262
+ target = dir + n
263
+ if File.directory?(base+target)
264
+ dirs << target+File::SEPARATOR
265
+ next
266
+ end
267
+ yield target
268
+ end
269
+ end
270
+ end
271
+
272
+ class Processor
273
+ attr_reader :o
274
+
275
+ # Parse command-line options and set the @o options hash
276
+
277
+ def initialize(argv=nil)
278
+ require 'optparse'
279
+
280
+ @o = { :strip_regexp => /\.dist\z/ }
281
+ return unless argv
282
+ opts = OptionParser.new do |opts|
283
+ opts.banner = "rconftool version #{VERSION}"
284
+ opts.separator "Usage: #{$0} [options]"
285
+ opts.separator ""
286
+ opts.separator "Specific options:"
287
+
288
+ opts.on("-n", "--noclobber", "Dummy run") do
289
+ @o[:noclobber] = true
290
+ end
291
+ opts.on("-f", "--force", "Update files even if VERSION is same") do
292
+ @o[:force] = true
293
+ end
294
+ opts.on("-q", "--quiet", "No progress reporting") do
295
+ @o[:debug] = ""
296
+ end
297
+ opts.on("--targetdir DIR", "Where to write merged config files") do |dir|
298
+ @o[:targetdir] = dir
299
+ end
300
+ opts.on("--olddir DIR", "If file does not exist in targetdir,",
301
+ "try to merge from here") do |dir|
302
+ @o[:olddir] = dir
303
+ end
304
+ opts.on("--[no-]recursive", "Traverse directories recursively") do |v|
305
+ @o[:recursive] = v
306
+ end
307
+ opts.on("--strip-suffix FOO", "Remove suffix FOO from target filenames",
308
+ "(default .dist)") do |suffix|
309
+ @o[:strip_regexp] = /#{Regexp.escape(suffix)}\z/
310
+ end
311
+ opts.on("-a", "--add-suffix FOO", "Add suffix FOO to target filenames") do |suffix|
312
+ @o[:add_suffix] = suffix
313
+ end
314
+
315
+ opts.on_tail("-?", "--help", "Show this message") do
316
+ puts opts
317
+ exit
318
+ end
319
+ end
320
+ opts.parse!(argv)
321
+ end
322
+
323
+ # Process a list of files, [src1,src2,...]. If recursive mode has been
324
+ # enabled, then subdirectories of destdir are created as necessary
325
+ # when 'src' is a directory, and the mode/ownership of these newly
326
+ # created directories is copied from the original.
327
+
328
+ def run(files)
329
+ done_work = false
330
+ files.each do |f|
331
+ if not File.directory?(f)
332
+ dst = old = nil
333
+ dst = @o[:targetdir] + File::SEPARATOR + File.basename(f) if @o[:targetdir]
334
+ old = @o[:olddir] + File::SEPARATOR + File.basename(f) if @o[:olddir]
335
+ Rconftool::install(f, dst, old, @o)
336
+ elsif not @o[:recursive]
337
+ raise Errno::EISDIR, "#{f} (not copied). Need --recursive?"
338
+ else
339
+ Rconftool::recurse_dir(f) do |nf|
340
+ src = f + File::SEPARATOR + nf
341
+ dst = old = nil
342
+ dst = @o[:targetdir] + File::SEPARATOR + nf if @o[:targetdir]
343
+ old = @o[:olddir] + File::SEPARATOR + nf if @o[:olddir]
344
+ if File.directory?(src)
345
+ if dst and not File.directory?(dst)
346
+ orig = File.stat(src)
347
+ Dir.mkdir(dst, orig.mode)
348
+ begin
349
+ File.chown(orig.uid, orig.gid, dst)
350
+ rescue Errno::EPERM
351
+ end
352
+ end
353
+ else
354
+ Rconftool::install(src, dst, old, @o)
355
+ end
356
+ end
357
+ end
358
+ done_work = true
359
+ end
360
+ unless done_work
361
+ $stderr.puts "Usage: #{$0} [options] src1 src2 ...\n"+
362
+ "Try #{$0} --help for more information\n"
363
+ exit 1
364
+ end
365
+ end
366
+ end # class Processor
367
+
368
+ end # module Rconftool
369
+
370
+ # Run from command line?
371
+ if __FILE__ == $0
372
+
373
+ begin
374
+ s = Rconftool::Processor.new(ARGV)
375
+ s.run(ARGV)
376
+ rescue Exception => e
377
+ $stderr.puts "#{$0}: #{e}"
378
+ end
379
+
380
+ end