reap 4.3.1 → 4.3.2
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.
- data/ChangeLog +0 -24
- data/ProjectInfo +1 -1
- data/bin/reap +1 -1
- data/bin/rubytest +5 -0
- data/lib/reap/bin/reap.rb +22 -3
- data/lib/reap/bin/rubytest.rb +45 -0
- data/lib/reap/projectinfo.rb +9 -5
- data/lib/reap/setup.rb +1557 -0
- data/lib/reap/task/install.rb +25 -8
- data/lib/reap/task/noop.rb +3 -0
- data/lib/reap/task/publish.rb +3 -2
- data/lib/reap/task/test.rb +59 -18
- data/lib/reap/task/testext.rb +2 -0
- data/lib/reap/task.rb +12 -3
- data/note/Rakefile +60 -0
- data/note/composite_task.rb +27 -0
- data/note/compositepublisher.rb +24 -0
- data/note/ftptools.rb +139 -0
- data/note/license-each.rb +85 -0
- data/note/publisher.rb +75 -0
- data/note/rubyforgepublisher.rb +18 -0
- data/note/sshpublisher.rb +47 -0
- data/note/suby-cvs.rb +46 -0
- data/note/template.rb +72 -0
- metadata +16 -3
- data/Rakefile +0 -0
data/lib/reap/task/install.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
|
2
3
|
require 'reap/task'
|
4
|
+
require 'reap/setup'
|
3
5
|
|
4
6
|
#
|
5
7
|
# Install Task
|
@@ -8,24 +10,39 @@ class Reap::Install < Reap::Task
|
|
8
10
|
|
9
11
|
task_desc "Locally install package using setup.rb or install.rb."
|
10
12
|
|
11
|
-
attr_accessor :options
|
13
|
+
attr_accessor :options #, :sudo
|
12
14
|
|
13
15
|
def init
|
14
|
-
@quiet ||= !$VERBOSE
|
15
16
|
@options ||= []
|
16
17
|
#@sudo ||= true
|
17
18
|
end
|
18
19
|
|
19
20
|
def run
|
20
|
-
exe = %w{ setup.rb install.rb }.find{ |f| File.exists?(f) }
|
21
|
-
raise "setup.rb or install.rb not found" if exe == nil
|
21
|
+
#exe = %w{ setup.rb install.rb }.find{ |f| File.exists?(f) }
|
22
|
+
#raise "setup.rb or install.rb not found" if exe == nil
|
22
23
|
|
23
|
-
puts "Reap is shelling out work to
|
24
|
+
puts "Reap is shelling out work to setup.rb..."
|
24
25
|
|
25
|
-
|
26
|
+
# prepare for using internalized setup.rb
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
ARGV.delete('install')
|
29
|
+
ARGV << '-q' unless $VERBOSE
|
30
|
+
ARGV.concat(options)
|
31
|
+
|
32
|
+
$setup_pwd = $PROJECT_INFO.info_dir #Dir.pwd
|
33
|
+
|
34
|
+
# invoke setup.rb
|
35
|
+
|
36
|
+
begin
|
37
|
+
ToplevelInstaller.invoke
|
38
|
+
rescue SetupError
|
39
|
+
raise if $DEBUG
|
40
|
+
$stderr.puts $!.message
|
41
|
+
$stderr.puts "Try 'reap --help' for detailed usage."
|
42
|
+
exit 1
|
43
|
+
end
|
44
|
+
|
45
|
+
puts "Setup complete!"
|
29
46
|
end
|
30
47
|
|
31
48
|
end
|
data/lib/reap/task/noop.rb
CHANGED
data/lib/reap/task/publish.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
|
2
3
|
require 'reap/task'
|
3
4
|
|
@@ -6,10 +7,10 @@ require 'reap/task'
|
|
6
7
|
#
|
7
8
|
class Reap::Publish < Reap::Task
|
8
9
|
|
9
|
-
task_desc "Publish documents to the web."
|
10
|
-
|
11
10
|
section_required true
|
12
11
|
|
12
|
+
task_desc "Publish documents to the web."
|
13
|
+
|
13
14
|
attr_accessor :host, :type, :dir, :project, :username
|
14
15
|
attr_accessor :exclude # not using yet
|
15
16
|
|
data/lib/reap/task/test.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
|
2
3
|
require 'reap/task'
|
3
4
|
|
@@ -7,7 +8,7 @@ require 'facet/string/tabto'
|
|
7
8
|
|
8
9
|
Test::Unit.run = true # don't run auto tests
|
9
10
|
|
10
|
-
|
11
|
+
|
11
12
|
# Test Task
|
12
13
|
#
|
13
14
|
# The Reap test task runs each test in
|
@@ -15,23 +16,41 @@ Test::Unit.run = true # don't run auto tests
|
|
15
16
|
# test facility.
|
16
17
|
#
|
17
18
|
# NOTE: This works well enough but it is a bit of
|
18
|
-
# hack. It actually marshals test results across
|
19
|
-
#
|
19
|
+
# a hack. It actually marshals test results across
|
20
|
+
# stdout->stdin shell pipe. One consequence of
|
20
21
|
# this is that you can't send debug info to stdout
|
21
22
|
# (including #p and #puts). This, hopefully can be
|
22
23
|
# remedied in the future.
|
23
|
-
|
24
|
+
|
24
25
|
class Reap::Test < Reap::Task
|
25
26
|
|
26
27
|
task_desc "Run unit-tests (each in a separate process)."
|
27
28
|
|
28
|
-
|
29
|
+
task_help %{
|
30
|
+
|
31
|
+
Attributes
|
32
|
+
|
33
|
+
files Test files (eg. test/tc_**/*.rb)
|
34
|
+
Defaults to typcial selection.
|
35
|
+
|
36
|
+
requires List of any files to pre-require.
|
37
|
+
|
38
|
+
libs List of lookup directories to include in
|
39
|
+
load path. './lib' is always included.
|
40
|
+
|
41
|
+
live Flag to quickly deactive use of local libs.
|
42
|
+
Test against installed files instead.
|
43
|
+
|
44
|
+
}
|
45
|
+
|
46
|
+
attr_accessor :files, :requires, :live, :libs
|
29
47
|
|
30
48
|
def init
|
31
|
-
@libs ||= ['lib']
|
32
49
|
@files ||= [ 'test/*/**/*.rb', 'test/**/tc*.rb', 'test/**/test*.rb', 'test/**/*test.rb' ]
|
33
|
-
@
|
34
|
-
|
50
|
+
@requires ||= []
|
51
|
+
|
52
|
+
@live ||= false
|
53
|
+
@libs ||= [] #['./lib']
|
35
54
|
|
36
55
|
# interal use
|
37
56
|
@results = TestResults.new
|
@@ -48,9 +67,9 @@ class Reap::Test < Reap::Task
|
|
48
67
|
puts "No test files found."
|
49
68
|
return
|
50
69
|
end
|
51
|
-
print "Reap is shelling out work to Ruby's Test Suite
|
70
|
+
print "Reap is shelling out work to Ruby's Test Suite...\n"
|
52
71
|
|
53
|
-
test_files.each { |f|
|
72
|
+
test_files.uniq.each { |f|
|
54
73
|
$stdout << '.'; $stdout.flush
|
55
74
|
dotest( f )
|
56
75
|
#ruby %{-r"test/unit" "#{f}"}
|
@@ -102,6 +121,8 @@ class Reap::Test < Reap::Task
|
|
102
121
|
#ruby %{-e0 -r"test/unit" \\\n#{test_reqs}#{test_opts}}
|
103
122
|
end
|
104
123
|
|
124
|
+
# Runs a test.
|
125
|
+
|
105
126
|
def dotest( test_file )
|
106
127
|
if ! File.file?( test_file )
|
107
128
|
r = nil
|
@@ -117,20 +138,31 @@ class Reap::Test < Reap::Task
|
|
117
138
|
|
118
139
|
# Currently send program output to null device.
|
119
140
|
# Could send to a logger in future version.
|
141
|
+
|
120
142
|
def fork_test( testfile )
|
121
143
|
src = ''
|
122
|
-
|
144
|
+
|
145
|
+
unless live
|
146
|
+
l = File.join( Dir.pwd, 'lib' )
|
147
|
+
if File.directory?( l )
|
148
|
+
src << %{$:.unshift('#{l}')\n}
|
149
|
+
end
|
150
|
+
libs.each { |r| src << %{$:.unshift('#{r}')\n} }
|
151
|
+
end
|
152
|
+
|
123
153
|
src << %{
|
124
154
|
#require 'test/unit'
|
125
155
|
require 'test/unit/collector'
|
126
156
|
require 'test/unit/collector/objectspace'
|
127
157
|
require 'test/unit/ui/testrunnermediator'
|
128
158
|
}
|
129
|
-
|
159
|
+
|
160
|
+
requires.each do |fix|
|
130
161
|
src << %Q{
|
131
162
|
require '#{fix}'
|
132
163
|
}
|
133
164
|
end
|
165
|
+
|
134
166
|
src << %{
|
135
167
|
output = STDOUT.dup
|
136
168
|
STDOUT.reopen( PLATFORM =~ /mswin/ ? "NUL" : "/dev/null" )
|
@@ -146,46 +178,55 @@ class Reap::Test < Reap::Task
|
|
146
178
|
$stderr << "MARSHAL ERROR\n"
|
147
179
|
$stderr << "TEST: #{testfile}\n"
|
148
180
|
$stderr << "DATA:" << result.inspect
|
149
|
-
exit 1
|
181
|
+
exit -1
|
150
182
|
end
|
151
183
|
output << marshalled
|
152
|
-
|
184
|
+
|
153
185
|
STDOUT.reopen(output)
|
154
186
|
output.close
|
155
187
|
}
|
188
|
+
|
156
189
|
result = IO.popen("ruby","w+") do |ruby|
|
157
190
|
ruby.puts src
|
158
191
|
ruby.close_write
|
159
192
|
ruby.read
|
160
193
|
end
|
194
|
+
|
161
195
|
p testfile if $VERBOSE
|
196
|
+
|
162
197
|
begin
|
163
198
|
marsh = Marshal.load(result)
|
164
199
|
rescue ArgumentError
|
165
|
-
$stderr << "\nCannot load marshalled test data
|
200
|
+
$stderr << "\nCannot load marshalled test data.\n"
|
166
201
|
$stderr << result << "\n"
|
167
|
-
exit
|
202
|
+
exit -1
|
168
203
|
end
|
204
|
+
|
169
205
|
return marsh
|
170
206
|
end
|
171
207
|
|
172
208
|
#
|
173
|
-
# Support class for collecting test results
|
209
|
+
# Support class for collecting test results.
|
174
210
|
#
|
211
|
+
|
175
212
|
class TestResults
|
213
|
+
|
176
214
|
attr_reader :assertion_count, :run_count, :failure_count, :error_count
|
215
|
+
|
177
216
|
def initialize
|
178
217
|
@assertion_count = 0
|
179
218
|
@run_count = 0
|
180
219
|
@failure_count = 0
|
181
220
|
@error_count = 0
|
182
221
|
end
|
222
|
+
|
183
223
|
def <<( result )
|
184
224
|
@assertion_count += result.assertion_count
|
185
225
|
@run_count += result.run_count
|
186
226
|
@failure_count += result.failure_count
|
187
227
|
@error_count += result.error_count
|
188
228
|
end
|
229
|
+
|
189
230
|
def to_s
|
190
231
|
s = %{SUMMARY:\n\n}
|
191
232
|
s << %{ tests : #{@run_count}\n}
|
@@ -194,7 +235,7 @@ class Reap::Test < Reap::Task
|
|
194
235
|
s << %{ errors : #{@error_count}\n}
|
195
236
|
s
|
196
237
|
end
|
238
|
+
|
197
239
|
end
|
198
240
|
|
199
241
|
end
|
200
|
-
|
data/lib/reap/task/testext.rb
CHANGED
data/lib/reap/task.rb
CHANGED
@@ -7,7 +7,7 @@ require 'facet/string/tabto'
|
|
7
7
|
require 'facet/module/basename'
|
8
8
|
require 'facet/module/attr_setter'
|
9
9
|
|
10
|
-
require '
|
10
|
+
require 'facet/filelist'
|
11
11
|
|
12
12
|
|
13
13
|
# Base class for reap tasks.
|
@@ -59,6 +59,7 @@ module Reap
|
|
59
59
|
|
60
60
|
def self.register
|
61
61
|
$PROJECT_INFO = ProjectInfo.new( $PROJECT_FILE )
|
62
|
+
|
62
63
|
#@registry ||= {}
|
63
64
|
#ObjectSpace.each_object(Class) { |klass|
|
64
65
|
# if klass < ::Reap::Task
|
@@ -77,7 +78,6 @@ module Reap
|
|
77
78
|
# end
|
78
79
|
|
79
80
|
|
80
|
-
|
81
81
|
class Task
|
82
82
|
|
83
83
|
include ::Config
|
@@ -97,13 +97,22 @@ module Reap
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
+
def task_help( text=nil, &block )
|
101
|
+
if text
|
102
|
+
@task_help = proc { text }
|
103
|
+
elsif block_given?
|
104
|
+
@task_help = block
|
105
|
+
else
|
106
|
+
@task_help.call
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
100
110
|
#def task_desc ; '(no desciption given)' ; end
|
101
111
|
def task_name ; basename.downcase ; end
|
102
112
|
|
103
113
|
def section_required( val ) ; @section_required = val ;end
|
104
114
|
def section_required? ; @section_required ; end
|
105
115
|
|
106
|
-
#
|
107
116
|
def verify?
|
108
117
|
if section_required?
|
109
118
|
return $PROJECT_INFO.info.key?(task_name)
|
data/note/Rakefile
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# Rakefile for rubypants -*-ruby-*-
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
|
4
|
+
|
5
|
+
desc "Run all the tests"
|
6
|
+
task :default => [:test]
|
7
|
+
|
8
|
+
desc "Do predistribution stuff"
|
9
|
+
task :predist => [:changelog, :doc]
|
10
|
+
|
11
|
+
|
12
|
+
desc "Run all the tests"
|
13
|
+
task :test do
|
14
|
+
ruby 'rand.rb'
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Make an archive as .tar.gz"
|
18
|
+
task :dist => :test do
|
19
|
+
system "export DARCS_REPO=#{File.expand_path "."}; " +
|
20
|
+
"darcs dist -d rand#{get_darcs_tree_version}"
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Generate a ChangeLog"
|
24
|
+
task :changelog do
|
25
|
+
system "darcs changes --repo=#{ENV["DARCS_REPO"] || "."} >ChangeLog"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Generate RDoc documentation"
|
29
|
+
Rake::RDocTask.new(:doc) do |rdoc|
|
30
|
+
rdoc.options << '--line-numbers --inline-source --all'
|
31
|
+
rdoc.rdoc_files.include 'README'
|
32
|
+
rdoc.rdoc_files.include 'rand.rb'
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
# Helper to retrieve the "revision number" of the darcs tree.
|
37
|
+
def get_darcs_tree_version
|
38
|
+
return "" unless File.directory? "_darcs"
|
39
|
+
|
40
|
+
changes = `darcs changes`
|
41
|
+
count = 0
|
42
|
+
tag = "0.0"
|
43
|
+
|
44
|
+
changes.each("\n\n") { |change|
|
45
|
+
head, title, desc = change.split("\n", 3)
|
46
|
+
|
47
|
+
if title =~ /^ \*/
|
48
|
+
# Normal change.
|
49
|
+
count += 1
|
50
|
+
elsif title =~ /tagged (.*)/
|
51
|
+
# Tag. We look for these.
|
52
|
+
tag = $1
|
53
|
+
break
|
54
|
+
else
|
55
|
+
warn "Unparsable change: #{change}"
|
56
|
+
end
|
57
|
+
}
|
58
|
+
|
59
|
+
"-" + tag + "." + count.to_s
|
60
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
require 'reap/reap'
|
3
|
+
require 'reap/task'
|
4
|
+
|
5
|
+
class Reap::CompositeTask < Reap::Task
|
6
|
+
|
7
|
+
register "composite"
|
8
|
+
|
9
|
+
#def default_name ; "" ; end
|
10
|
+
def default_desc
|
11
|
+
"run tasks #{subtasks.join(',')} [reap]"
|
12
|
+
end
|
13
|
+
|
14
|
+
#attr_accessor :subtasks
|
15
|
+
|
16
|
+
def init
|
17
|
+
#@subtasks = section['subtasks']
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def run
|
23
|
+
#@subtasks.each do |st|
|
24
|
+
#end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
module Rake
|
4
|
+
|
5
|
+
# Manage several publishers as a single entity.
|
6
|
+
class CompositePublisher
|
7
|
+
def initialize
|
8
|
+
@publishers = []
|
9
|
+
end
|
10
|
+
|
11
|
+
# Add a publisher to the composite.
|
12
|
+
def add(pub)
|
13
|
+
@publishers << pub
|
14
|
+
end
|
15
|
+
|
16
|
+
# Upload all the individual publishers.
|
17
|
+
def upload
|
18
|
+
@publishers.each { |p| p.upload }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
|
data/note/ftptools.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# = Tools for FTP uploading.
|
4
|
+
#
|
5
|
+
# This file is still under development and is not released for general
|
6
|
+
# use.
|
7
|
+
|
8
|
+
require 'date'
|
9
|
+
require 'parsedate'
|
10
|
+
require 'net/ftp'
|
11
|
+
|
12
|
+
module Rake # :nodoc:
|
13
|
+
|
14
|
+
####################################################################
|
15
|
+
# <b>Note:</b> <em> Not released for general use.</em>
|
16
|
+
class FtpFile
|
17
|
+
attr_reader :name, :size, :owner, :group, :time
|
18
|
+
|
19
|
+
def self.date
|
20
|
+
@date_class ||= Date
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(path, entry)
|
24
|
+
@path = path
|
25
|
+
@mode, line, @owner, @group, size, d1, d2, d3, @name = entry.split(' ')
|
26
|
+
@size = size.to_i
|
27
|
+
@time = determine_time(d1, d2, d3)
|
28
|
+
end
|
29
|
+
|
30
|
+
def path
|
31
|
+
File.join(@path, @name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def directory?
|
35
|
+
@mode[0] == ?d
|
36
|
+
end
|
37
|
+
|
38
|
+
def mode
|
39
|
+
parse_mode(@mode)
|
40
|
+
end
|
41
|
+
|
42
|
+
def symlink?
|
43
|
+
@mode[0] == ?l
|
44
|
+
end
|
45
|
+
|
46
|
+
private # --------------------------------------------------------
|
47
|
+
|
48
|
+
def parse_mode(m)
|
49
|
+
result = 0
|
50
|
+
(1..9).each do |i|
|
51
|
+
result = 2*result + ((m[i]==?-) ? 0 : 1)
|
52
|
+
end
|
53
|
+
result
|
54
|
+
end
|
55
|
+
|
56
|
+
def determine_time(d1, d2, d3)
|
57
|
+
elements = ParseDate.parsedate("#{d1} #{d2} #{d3}")
|
58
|
+
if elements[0].nil?
|
59
|
+
today = self.class.date.today
|
60
|
+
if elements[1] > today.month
|
61
|
+
elements[0] = today.year - 1
|
62
|
+
else
|
63
|
+
elements[0] = today.year
|
64
|
+
end
|
65
|
+
end
|
66
|
+
elements = elements.collect { |el| el.nil? ? 0 : el }
|
67
|
+
Time.mktime(*elements[0,7])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
####################################################################
|
72
|
+
# Manage the uploading of files to an FTP account.
|
73
|
+
class FtpUploader
|
74
|
+
|
75
|
+
# Log uploads to standard output when true.
|
76
|
+
attr_accessor :verbose
|
77
|
+
|
78
|
+
class << FtpUploader
|
79
|
+
# Create an uploader and pass it to the given block as +up+.
|
80
|
+
# When the block is complete, close the uploader.
|
81
|
+
def connect(path, host, account, password)
|
82
|
+
up = self.new(path, host, account, password)
|
83
|
+
begin
|
84
|
+
yield(up)
|
85
|
+
ensure
|
86
|
+
up.close
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Create an FTP uploader targetting the directory +path+ on +host+
|
92
|
+
# using the given account and password. +path+ will be the root
|
93
|
+
# path of the uploader.
|
94
|
+
def initialize(path, host, account, password)
|
95
|
+
@created = Hash.new
|
96
|
+
@path = path
|
97
|
+
@ftp = Net::FTP.new(host, account, password)
|
98
|
+
makedirs(@path)
|
99
|
+
@ftp.chdir(@path)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Create the directory +path+ in the uploader root path.
|
103
|
+
def makedirs(path)
|
104
|
+
route = []
|
105
|
+
File.split(path).each do |dir|
|
106
|
+
route << dir
|
107
|
+
current_dir = File.join(route)
|
108
|
+
if @created[current_dir].nil?
|
109
|
+
@created[current_dir] = true
|
110
|
+
puts "Creating Directory #{current_dir}" if @verbose
|
111
|
+
@ftp.mkdir(current_dir) rescue nil
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# Upload all files matching +wildcard+ to the uploader's root
|
117
|
+
# path.
|
118
|
+
def upload_files(wildcard)
|
119
|
+
Dir[wildcard].each do |fn|
|
120
|
+
upload(fn)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
# Close the uploader.
|
125
|
+
def close
|
126
|
+
@ftp.close
|
127
|
+
end
|
128
|
+
|
129
|
+
private # --------------------------------------------------------
|
130
|
+
|
131
|
+
# Upload a single file to the uploader's root path.
|
132
|
+
def upload(file)
|
133
|
+
puts "Uploading #{file}" if @verbose
|
134
|
+
dir = File.dirname(file)
|
135
|
+
makedirs(dir)
|
136
|
+
@ftp.putbinaryfile(file, file) unless File.directory?(file)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# Ruby Treasures 0.4
|
2
|
+
# Copyright (C) 2002 Paul Brannan <paul@atdesk.com>
|
3
|
+
#
|
4
|
+
# You may distribute this software under the same terms as Ruby (see the file
|
5
|
+
# COPYING that was distributed with this library).
|
6
|
+
#
|
7
|
+
# Ruby Treasures 0.2
|
8
|
+
# Copyright (C) 2002 Paul Brannan <paul@atdesk.com>
|
9
|
+
#
|
10
|
+
# You may distribute this software under the same terms as Ruby (see the file
|
11
|
+
# COPYING that was distributed with this library).
|
12
|
+
#
|
13
|
+
# Run this Ruby script to prepare the RubyTreasures distribution for
|
14
|
+
# publication.
|
15
|
+
|
16
|
+
require 'find'
|
17
|
+
require 'ftools'
|
18
|
+
|
19
|
+
|
20
|
+
# Add licences to the top of every file and remove unnecessary files
|
21
|
+
|
22
|
+
license = IO.readlines('LICENSE')
|
23
|
+
ruby_license_comment = license.map { |i| i.sub(/^/, '# ') }
|
24
|
+
c_license_comment = ["/*\n"] + license.map { |i| i.sub(/^/, ' * ') } + [" */\n"]
|
25
|
+
|
26
|
+
def rm_rf(dir)
|
27
|
+
Dir.foreach(dir) do |f|
|
28
|
+
if not f =~ /\.?\.$/ then
|
29
|
+
filename = File.join(dir, f)
|
30
|
+
if File.directory?(filename) then
|
31
|
+
rm_rf(filename)
|
32
|
+
else
|
33
|
+
puts "Removing file #{filename}"
|
34
|
+
File.rm_f(filename)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
puts "Removing directory #{dir}"
|
39
|
+
Dir.rmdir(dir)
|
40
|
+
end
|
41
|
+
|
42
|
+
Find.find('.') do |file|
|
43
|
+
if File.directory?(file) then
|
44
|
+
case file
|
45
|
+
when /\/CVS$/
|
46
|
+
# Remove CVS directories
|
47
|
+
rm_rf(file)
|
48
|
+
else
|
49
|
+
# Remove empty directories
|
50
|
+
entries = Dir.entries(file)
|
51
|
+
entries.delete('.')
|
52
|
+
entries.delete('..')
|
53
|
+
entries.delete('CVS')
|
54
|
+
if entries.length == 0 then
|
55
|
+
rm_rf(file)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
else
|
59
|
+
case file
|
60
|
+
when /\.rb$/
|
61
|
+
# Add LICENSE to ruby sources
|
62
|
+
puts "Adding license to #{file}"
|
63
|
+
lines = ruby_license_comment + IO.readlines(file)
|
64
|
+
File.open(file, 'w') do |out|
|
65
|
+
lines.each do |line|
|
66
|
+
out.puts line
|
67
|
+
end
|
68
|
+
end
|
69
|
+
when /\.c$/
|
70
|
+
# Add LICENSE to C sources
|
71
|
+
puts "Adding license to #{file}"
|
72
|
+
lines = c_license_comment + IO.readlines(file)
|
73
|
+
File.open(file, 'w') do |out|
|
74
|
+
lines.each do |line|
|
75
|
+
out.puts line
|
76
|
+
end
|
77
|
+
end
|
78
|
+
when /~$/
|
79
|
+
# Remove temporary files
|
80
|
+
puts "Removing file #{file}"
|
81
|
+
File.rm_f(file)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|