rwdtinker 1.56 → 1.57

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.
@@ -2,7 +2,7 @@
2
2
  require 'fileutils'
3
3
  nametext = "%s" % [@a_removeapplet]
4
4
 
5
- begin # exception trapped block
5
+ # begin # exception trapped block
6
6
  fileName = "installed/" + nametext + ".inf"
7
7
  count = 0
8
8
  fd = File.open(fileName,"r")
@@ -10,19 +10,21 @@
10
10
 
11
11
  fd.each { |oneline|
12
12
  if count == 1
13
- commandline = "rm -r " + oneline
14
- system( commandline+' > temp.output' )
13
+ puts oneline
14
+ FileUtils.rm_rf( oneline.chop)
15
+
15
16
  end
16
17
  count = 1
17
18
  }
18
19
  fd.close
19
- commandline = "rm " + fileName
20
+ puts fileName
21
+ FileUtils.rm_rf( fileName)
22
+
20
23
 
21
- system(commandline)
22
24
  @removeapplettext = "applet files removed! - restart rwd to finish uninstalling"
23
25
 
24
- rescue
25
- @removeapplettext = "\n" + "error"
26
- end # exception rescue
26
+ # rescue
27
+ # @removeapplettext = "\n" + "error"
28
+ # end # exception rescue
27
29
 
28
30
  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"
@@ -1,3 +1,3 @@
1
-
1
+ ##VERSION:1.57
2
2
  $rwdapplicationidentity = "rwdtinker main application"
3
3
 
@@ -1,4 +1,4 @@
1
-
1
+ ##VERSION:1/57
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.57"
@@ -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
data/init.rb CHANGED
@@ -23,6 +23,7 @@
23
23
 
24
24
  require "ev/rwd"
25
25
  require 'fileutils'
26
+ require 'extras/rconftool'
26
27
 
27
28
  $progdir = File::expand_path( File.dirname(__FILE__))
28
29
 
@@ -59,8 +60,25 @@ $progdir = File::expand_path( File.dirname(__FILE__))
59
60
  end
60
61
  end
61
62
 
63
+ # integrate the new configuration files
64
+ MAINconfignew = "rwdconfig.cnf"
65
+ MAINconfigdist = "rwdconfig.dist"
66
+ Rconftool::install(MAINconfigdist,MAINconfignew)
67
+
68
+ Dir.chdir("configuration") #changes the current working directory
69
+
70
+ fileList = Dir.new(".").entries.sort.reverse.delete_if { |x| ! (x =~ /dist$/) } #creates an Array separated with \n
71
+ @doc = ""
72
+ fileList.length.times{ #opening of a block
73
+ configdist =fileList.pop #pops the first item out of the Array
74
+ tempconfigfile = configdist.gsub(/\.dist$/, "")
75
+ confignew = tempconfigfile + ".cnf"
76
+ Rconftool::install(configdist,confignew) #integrates new file with old
77
+ } #closing block
78
+ # END of configuration integration
79
+ Dir.chdir($progdir)
80
+
62
81
  # Read in the configuration files
63
-
64
82
  Dir.chdir("configuration") #changes the current working directory
65
83
 
66
84
  fileList = Dir.new(".").entries.sort.reverse.delete_if { |x| ! (x =~ /cnf$/) } #creates an Array separated with \n
@@ -70,7 +88,7 @@ $progdir = File::expand_path( File.dirname(__FILE__))
70
88
  load fileName #loads the the config file thats in fileName
71
89
  } #closing block
72
90
  # END of configuration reading
73
-
91
+
74
92
  Dir.chdir($progdir) # change back to top program directory
75
93
 
76
94
  # build the English Language hash file from the parts
@@ -227,6 +227,10 @@ http://www.erikveen.dds.nl/rubywebdialogs/index.html
227
227
  Thanks, Steven Gibson
228
228
 
229
229
  == Changelog
230
+ version 1.57
231
+ added rconftool use to update configuration files
232
+ changed applets remove to not used external rm
233
+
230
234
  version 1.56
231
235
  refactored gui files to load without intermediate files
232
236
  refactored code files to load without intermediate files
data/rwdconfig.dist ADDED
@@ -0,0 +1,6 @@
1
+ ##VERSION:1.57
2
+ # rwdtinker core configuration file
3
+ ##NAME: ConfigLocation:0
4
+ ConfigLocation=""
5
+ ##NAME: ZipsLocation:0
6
+ ZipsLocation=""
data/tests/cleancnf.sh ADDED
@@ -0,0 +1,5 @@
1
+ #!/bin/sh
2
+ rm *.cnf
3
+ rm *.bak
4
+ rm configuration/*.cnf
5
+ rm configuration/*.bak
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.6
3
3
  specification_version: 1
4
4
  name: rwdtinker
5
5
  version: !ruby/object:Gem::Version
6
- version: "1.56"
7
- date: 2005-02-28
6
+ version: "1.57"
7
+ date: 2005-03-05
8
8
  summary: rwdtinker application is a framework to program for RubyWebDialogs.
9
9
  require_paths:
10
10
  - "."
@@ -59,12 +59,10 @@ files:
59
59
  - code/superant.com.rwdtinkerbackwindow/installremotegem.rb
60
60
  - code/superant.com.rwdtinkerbackwindow/listgemzips.rb
61
61
  - code/zz0applicationend/zz0end.rb
62
- - configuration/language.cnf
63
- - configuration/rwdapplicationidentity.cnf
64
- - configuration/rwdtinker.cnf
65
- - configuration/rwdtinkerversion.cnf
66
- - configuration/tinkerwin2variables.cnf
67
- - configuration/tinkerwin2version.cnf
62
+ - configuration/tinkerwin2variables.dist
63
+ - configuration/rwdtinker.dist
64
+ - configuration/language.dist
65
+ - configuration/rwdapplicationidentity.dist
68
66
  - ev/browser.rb
69
67
  - ev/ftools.rb
70
68
  - ev/net.rb
@@ -74,6 +72,7 @@ files:
74
72
  - ev/thread.rb
75
73
  - ev/tree.rb
76
74
  - ev/xml.rb
75
+ - extras/rconftool.rb
77
76
  - extras/zip/ioextras.rb
78
77
  - extras/zip/stdrubyext.rb
79
78
  - extras/zip/tempfile_bugfixed.rb
@@ -141,8 +140,10 @@ files:
141
140
  - tests/rwdtinkertestEN.rb
142
141
  - tests/test.result
143
142
  - tests/totranslate.lang
143
+ - tests/cleancnf.sh
144
144
  - init.rb
145
145
  - Readme.txt
146
+ - rwdconfig.dist
146
147
  test_files: []
147
148
  rdoc_options:
148
149
  - "--main"
@@ -1,5 +0,0 @@
1
-
2
- #$lang = "jp"
3
- $lang= "en"
4
- #$lang= "nl"
5
- #$lang= "es"
@@ -1,2 +0,0 @@
1
-
2
- RwdTinkerVersion = "1.56"
@@ -1,3 +0,0 @@
1
-
2
- RwdTinkerWin2Version = "0.8"
3
-