reap 6.0.2 → 9.2.0
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/CHANGES +6 -0
- data/COPYING +666 -395
- data/MANIFEST +139 -0
- data/NOTES +12 -0
- data/README +19 -163
- data/bin/reap-announce +7 -0
- data/bin/reap-check-load +8 -0
- data/bin/reap-check-syntax +7 -0
- data/bin/reap-clean +7 -0
- data/bin/reap-clobber +7 -0
- data/bin/reap-doc +7 -0
- data/bin/reap-doc-rdoc +7 -0
- data/bin/reap-doc-ri +7 -0
- data/bin/reap-init +69 -0
- data/bin/reap-inspect +7 -0
- data/bin/reap-install +8 -0
- data/bin/reap-install-gem +8 -0
- data/bin/reap-log +7 -0
- data/bin/reap-log-changes +8 -0
- data/bin/reap-log-notes +8 -0
- data/bin/reap-make +7 -0
- data/bin/reap-make-clean +7 -0
- data/bin/reap-make-distclean +7 -0
- data/bin/reap-make-extconf +7 -0
- data/bin/reap-make-static +8 -0
- data/bin/reap-package +8 -0
- data/bin/reap-package-gem +7 -0
- data/bin/reap-package-tgz +7 -0
- data/bin/reap-package-zip +7 -0
- data/bin/reap-prepare +7 -0
- data/bin/reap-publish +7 -0
- data/bin/reap-release +7 -0
- data/bin/reap-scaffold +8 -0
- data/bin/reap-scm-branch +7 -0
- data/bin/reap-scm-tag +7 -0
- data/bin/reap-spec +7 -0
- data/bin/reap-spec-doc +8 -0
- data/bin/reap-stamp +7 -0
- data/bin/reap-stats +7 -0
- data/bin/reap-test +7 -0
- data/bin/reap-test-cross +7 -0
- data/bin/reap-test-load +9 -0
- data/bin/reap-test-solo +7 -0
- data/bin/reap-uninstall +7 -0
- data/bin/reap-uninstall-gem +7 -0
- data/data/reap/base/CHANGES +19 -0
- data/data/reap/base/COPYING +674 -0
- data/data/reap/base/NOTES +12 -0
- data/data/reap/base/README +8 -0
- data/data/reap/build/rake/Rakefile +130 -0
- data/{forge/reference/installers → data/reap/build/rake}/setup.rb +155 -97
- data/data/reap/build/rake-lite/install.rb +79 -0
- data/data/reap/build/tasks/task/rdoc +211 -0
- data/data/reap/{setup.rb → build/tasks/task/setup} +248 -200
- data/data/reap/build/tasks/task/test +38 -0
- data/data/reap/init/meta/project.yaml +21 -0
- data/demo/README +15 -0
- data/demo/lib/foo/foo.rb +7 -0
- data/demo/meta/VERSION +1 -0
- data/demo/meta/project.yaml +21 -0
- data/lib/reap/application.rb +80 -0
- data/lib/reap/default.yaml +77 -0
- data/lib/reap/extensions/array.rb +50 -0
- data/lib/reap/extensions/hash.rb +63 -0
- data/lib/reap/extensions/string.rb +31 -0
- data/lib/reap/extensions.rb +6 -0
- data/lib/reap/iobject.rb +264 -0
- data/lib/reap/manager/announce.rb +193 -0
- data/lib/reap/manager/check.rb +109 -0
- data/lib/reap/manager/clean.rb +58 -0
- data/lib/reap/manager/gem.rb +200 -0
- data/lib/reap/manager/html.rb +69 -0
- data/lib/reap/manager/log.rb +214 -0
- data/lib/reap/manager/make.rb +109 -0
- data/lib/reap/manager/pack.rb +232 -0
- data/lib/reap/manager/publish.rb +72 -0
- data/lib/reap/manager/rdoc.rb +194 -0
- data/lib/reap/manager/release.rb +78 -0
- data/lib/reap/manager/rubyforge.rb +44 -0
- data/lib/reap/manager/scaffold.rb +138 -0
- data/lib/reap/manager/scm.rb +66 -0
- data/lib/reap/manager/site.rb +27 -0
- data/lib/reap/manager/spec.rb +94 -0
- data/lib/reap/manager/stats.rb +145 -0
- data/lib/reap/manager/svn.rb +76 -0
- data/lib/reap/manager/test.rb +389 -0
- data/lib/reap/manager.rb +74 -0
- data/lib/reap/metadata.rb +603 -0
- data/lib/reap/project.rb +165 -0
- data/lib/reap/settings.rb +67 -0
- data/lib/reap/systems/rubyforge.rb +737 -0
- data/lib/reap/systems/subversion.rb +333 -0
- data/lib/reap/utilities/fileutils.rb +304 -0
- data/lib/reap/utilities/netutils.rb +221 -0
- data/lib/reap/utilities/setuputils.rb +124 -0
- data/lib/reap/utilities/shellutils.rb +175 -0
- data/log/Changelog.txt +107 -0
- data/log/FIXME.txt +25 -0
- data/log/TODO.txt +72 -0
- data/meta/VERSION +1 -0
- data/meta/description +4 -0
- data/meta/project.yaml +20 -0
- data/task/man +14 -0
- data/task/rdoc +20 -0
- data/{data/reap/scaffold/standard/setup.rb → task/setup} +248 -200
- metadata +225 -153
- data/ProjectInfo +0 -105
- data/bin/reap +0 -5
- data/bin/rubytest +0 -5
- data/data/reap/install.rb +0 -62
- data/data/reap/scaffold/standard/COPYING +0 -403
- data/data/reap/scaffold/standard/ChangeLog +0 -0
- data/data/reap/scaffold/standard/INSTALL +0 -14
- data/data/reap/scaffold/standard/ProjectInfo +0 -77
- data/data/reap/scaffold/standard/README +0 -3
- data/data/reap/scaffold/standard/Rakefile +0 -10
- data/data/reap/scaffold/standard/TODO +0 -0
- data/data/reap/scaffold/subversion/trunk/COPYING +0 -403
- data/data/reap/scaffold/subversion/trunk/ChangeLog +0 -0
- data/data/reap/scaffold/subversion/trunk/INSTALL +0 -14
- data/data/reap/scaffold/subversion/trunk/ProjectInfo +0 -76
- data/data/reap/scaffold/subversion/trunk/README +0 -3
- data/data/reap/scaffold/subversion/trunk/Rakefile +0 -10
- data/data/reap/scaffold/subversion/trunk/TODO +0 -0
- data/data/reap/scaffold/subversion/trunk/setup.rb +0 -1568
- data/forge/ProjectInfo +0 -38
- data/forge/ProjectInfo.rb +0 -76
- data/forge/TODO +0 -10
- data/forge/installer.rb +0 -250
- data/forge/reference/Rakefile +0 -124
- data/forge/reference/Rakefile.htm +0 -69
- data/forge/reference/aRakefile +0 -60
- data/forge/reference/compositepublisher.rb +0 -24
- data/forge/reference/ftptools.rb +0 -139
- data/forge/reference/installers/package.rb +0 -629
- data/forge/reference/license-each.rb +0 -85
- data/forge/reference/publisher.rb +0 -75
- data/forge/reference/rubyforge.rb +0 -247
- data/forge/reference/rubyforgepublisher.rb +0 -18
- data/forge/reference/sshpublisher.rb +0 -47
- data/forge/reference/suby-cvs.rb +0 -46
- data/forge/scaffold.rb +0 -126
- data/forge/unit_runner/README +0 -6
- data/forge/unit_runner/commentrunner.rb +0 -62
- data/forge/unit_runner/cunit.rb +0 -17
- data/forge/unit_runner/forkedrunner.rb +0 -91
- data/forge/unit_runner/sample.rb +0 -16
- data/lib/reap/bin/reap.rb +0 -230
- data/lib/reap/bin/rubytest.rb +0 -53
- data/lib/reap/class/announce.rb +0 -220
- data/lib/reap/class/doap.rb +0 -80
- data/lib/reap/class/extest.rb +0 -146
- data/lib/reap/class/filer.rb +0 -62
- data/lib/reap/class/manifest.rb +0 -68
- data/lib/reap/class/package.rb +0 -576
- data/lib/reap/class/publish.rb +0 -152
- data/lib/reap/class/rdoc.rb +0 -123
- data/lib/reap/class/test.rb +0 -264
- data/lib/reap/projectinfo.rb +0 -208
- data/lib/reap/rake.rb +0 -42
- data/lib/reap/reap.rb +0 -89
- data/lib/reap/tasks.rb +0 -756
- data/lib/reap/taskutils.rb +0 -122
- data/note/LATEST +0 -44
- data/note/doap.xml +0 -28
- data/note/history/Rakefile-0.1 +0 -308
- data/sample/ProjectInfo +0 -96
- data/sample/Rakefile +0 -9
- data/sample/Reapfile +0 -11
- data/sample/task/demo.rb +0 -15
- data/setup.rb +0 -1568
- data/web/ProjectInfo.html +0 -75
- data/web/images/grape.jpg +0 -0
- data/web/index.html +0 -312
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
require 'reap/manager/scm'
|
|
2
|
+
|
|
3
|
+
module Reap
|
|
4
|
+
|
|
5
|
+
class Manager
|
|
6
|
+
|
|
7
|
+
# Update all logs.
|
|
8
|
+
|
|
9
|
+
def log(*args)
|
|
10
|
+
log_changes(*args)
|
|
11
|
+
log_notes(*args)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Generate ChangeLog. This routes to the
|
|
15
|
+
# source control manager library.
|
|
16
|
+
|
|
17
|
+
def log_changes(options=nil)
|
|
18
|
+
options = configure_options(options, 'log-changes', 'log')
|
|
19
|
+
scm_log(options)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# TODO: Add ability to read header notes.
|
|
23
|
+
|
|
24
|
+
# Collect embedded notes.
|
|
25
|
+
#
|
|
26
|
+
# This task scans source code for developer notes and writes to
|
|
27
|
+
# well organized files. This tool can lookup and list TODO, FIXME
|
|
28
|
+
# and other types of labeled comments from source code.
|
|
29
|
+
#
|
|
30
|
+
# files Glob(s) of files to search.
|
|
31
|
+
# labels Labels to search for. Defaults to [ 'TODO', 'FIXME' ].
|
|
32
|
+
# output Output directory. Defaults to log/.
|
|
33
|
+
#
|
|
34
|
+
# TODO: Remove format field, and ultimately use XML as primary format?
|
|
35
|
+
|
|
36
|
+
def log_notes(options={})
|
|
37
|
+
options = configure_options(options, 'log-notes', 'log')
|
|
38
|
+
|
|
39
|
+
loadpath = options['loadpath'] || metadata.loadpath
|
|
40
|
+
labels = options['labels'] || ['TODO', 'FIXME', 'OPTIMIZE']
|
|
41
|
+
output = options['output'] || 'log'
|
|
42
|
+
|
|
43
|
+
labels = labels.split(',') if String === labels
|
|
44
|
+
labels = [labels].flatten.compact
|
|
45
|
+
|
|
46
|
+
output.chomp!('/')
|
|
47
|
+
|
|
48
|
+
records, counts = log_notes_extract(labels, loadpath)
|
|
49
|
+
notes = log_notes_format(labels, records, (format=nil))
|
|
50
|
+
|
|
51
|
+
if records.empty?
|
|
52
|
+
puts "No #{labels.join(', ')} notes."
|
|
53
|
+
else
|
|
54
|
+
log_notes_save(output, notes, labels)
|
|
55
|
+
puts counts.collect{|l,n| "#{n} #{l}s"}.join(', ')
|
|
56
|
+
puts "Notes saved in #{output} folder."
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
# Gather notes.
|
|
63
|
+
|
|
64
|
+
def log_notes_extract(labels, loadpath=nil)
|
|
65
|
+
files = Dir.multiglob_r(*loadpath)
|
|
66
|
+
|
|
67
|
+
counts = Hash.new(0)
|
|
68
|
+
records = []
|
|
69
|
+
|
|
70
|
+
files.each do |fname|
|
|
71
|
+
next unless fname =~ /.*rb/ # TODO should this be done?
|
|
72
|
+
File.open(fname) do |f|
|
|
73
|
+
line_no, save, text = 0, nil, nil
|
|
74
|
+
while line = f.gets
|
|
75
|
+
line_no += 1
|
|
76
|
+
labels.each do |label|
|
|
77
|
+
if line =~ /^\s*#\s*#{Regexp.escape(label)}[:]?\s*(.*?)$/
|
|
78
|
+
file = fname
|
|
79
|
+
text = ''
|
|
80
|
+
save = {'label'=>label,'file'=>file,'line'=>line_no,'note'=>text}
|
|
81
|
+
records << save
|
|
82
|
+
counts[label] += 1
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
if text
|
|
86
|
+
if line =~ /^\s*[#]{0,1}\s*$/ or line !~ /^\s*#/ or line =~ /^\s*#[+][+]/
|
|
87
|
+
text.strip!
|
|
88
|
+
text = nil
|
|
89
|
+
#records << save
|
|
90
|
+
else
|
|
91
|
+
text << line.gsub(/^\s*#\s*/,'')
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
return records, counts
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Format notes.
|
|
101
|
+
|
|
102
|
+
def log_notes_format(labels, records, format=nil)
|
|
103
|
+
#return "No #{labels.join('/')} notes." if records.empty?
|
|
104
|
+
#return {} if records.empty?
|
|
105
|
+
notes = {}
|
|
106
|
+
labels.each do |label|
|
|
107
|
+
recs = records.select{ |r| r['label'] == label }
|
|
108
|
+
next if recs.empty?
|
|
109
|
+
out = "\n= #{label}\n"
|
|
110
|
+
last_file = nil
|
|
111
|
+
recs.sort!{ |a,b| a['file'] <=> b['file'] }
|
|
112
|
+
recs.each do |record|
|
|
113
|
+
if last_file != record['file']
|
|
114
|
+
out << "\n"
|
|
115
|
+
last_file = record['file']
|
|
116
|
+
out << "file://#{record['file']}\n"
|
|
117
|
+
end
|
|
118
|
+
out << "* #{record['note'].rstrip} (#{record['line']})\n"
|
|
119
|
+
end
|
|
120
|
+
notes[label] = out
|
|
121
|
+
end
|
|
122
|
+
return notes
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Save notes.
|
|
126
|
+
|
|
127
|
+
def log_notes_save(dir, notes, labels)
|
|
128
|
+
mkdir_p(dir)
|
|
129
|
+
# Remove empty note files.
|
|
130
|
+
(labels - notes.keys).each do |label|
|
|
131
|
+
file = File.join(dir,label)
|
|
132
|
+
rm(file) if File.file?(file)
|
|
133
|
+
end
|
|
134
|
+
# Create note files.
|
|
135
|
+
notes.each do |label, note|
|
|
136
|
+
file = apply_naming_policy(label, 'txt')
|
|
137
|
+
file = File.join(dir,file)
|
|
138
|
+
if dryrun?
|
|
139
|
+
puts "write #{file}"
|
|
140
|
+
else
|
|
141
|
+
File.open(file,'w') do |f| f << note end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
#
|
|
147
|
+
|
|
148
|
+
def naming_policy
|
|
149
|
+
@naming_policy ||= (
|
|
150
|
+
logconfig = configuration['log'] || {}
|
|
151
|
+
logconfig['policy'] || DEFAULT['log']['policy']
|
|
152
|
+
)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# TODO: Naming policy needs to be apply to changelog too.
|
|
156
|
+
|
|
157
|
+
def apply_naming_policy(name, ext)
|
|
158
|
+
policy = naming_policy
|
|
159
|
+
name = name.downcase if /low/i =~ policy
|
|
160
|
+
name = name.upcase if /up/i =~ policy
|
|
161
|
+
name = name.capitalize if /cap/i =~ policy
|
|
162
|
+
name = name + ".#{ext}" if /ext/i =~ policy
|
|
163
|
+
name
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# out = ''
|
|
171
|
+
#
|
|
172
|
+
# case format
|
|
173
|
+
# when 'yaml'
|
|
174
|
+
# out << records.to_yaml
|
|
175
|
+
# when 'list'
|
|
176
|
+
# records.each do |record|
|
|
177
|
+
# out << "* #{record['note']}\n"
|
|
178
|
+
# end
|
|
179
|
+
# else #when 'rdoc'
|
|
180
|
+
# labels.each do |label|
|
|
181
|
+
# recs = records.select{ |r| r['label'] == label }
|
|
182
|
+
# next if recs.empty?
|
|
183
|
+
# out << "\n= #{label}\n"
|
|
184
|
+
# last_file = nil
|
|
185
|
+
# recs.sort!{ |a,b| a['file'] <=> b['file'] }
|
|
186
|
+
# recs.each do |record|
|
|
187
|
+
# if last_file != record['file']
|
|
188
|
+
# out << "\n"
|
|
189
|
+
# last_file = record['file']
|
|
190
|
+
# out << "file://#{record['file']}\n"
|
|
191
|
+
# end
|
|
192
|
+
# out << "* #{record['note'].rstrip} (#{record['line']})\n"
|
|
193
|
+
# end
|
|
194
|
+
# end
|
|
195
|
+
# out << "\n---\n"
|
|
196
|
+
# out << counts.collect{|l,n| "#{n} #{l}s"}.join(' ')
|
|
197
|
+
# out << "\n"
|
|
198
|
+
# end
|
|
199
|
+
|
|
200
|
+
# # List TODO notes. Same as notes --label=TODO.
|
|
201
|
+
#
|
|
202
|
+
# def todo( options={} )
|
|
203
|
+
# options = options.to_openhash
|
|
204
|
+
# options.label = 'TODO'
|
|
205
|
+
# notes(options)
|
|
206
|
+
# end
|
|
207
|
+
#
|
|
208
|
+
# # List FIXME notes. Same as notes --label=FIXME.
|
|
209
|
+
#
|
|
210
|
+
# def fixme( options={} )
|
|
211
|
+
# options = options.to_openhash
|
|
212
|
+
# options.label = 'FIXME'
|
|
213
|
+
# notes(options)
|
|
214
|
+
# end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#
|
|
2
|
+
# The Make tool routes to extension Makefile(s).
|
|
3
|
+
# At this point it's designed to support extconf.rb design.
|
|
4
|
+
#
|
|
5
|
+
# TODO: Perhaps make a true compiler class in the future.
|
|
6
|
+
# TODO: win32 cross-compile.
|
|
7
|
+
|
|
8
|
+
module Reap
|
|
9
|
+
|
|
10
|
+
class Manager
|
|
11
|
+
|
|
12
|
+
def extensions
|
|
13
|
+
@extensions ||= metadata.extensions || 'ext/**/extconf.rb'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Return list of extconf.rb scripts.
|
|
17
|
+
|
|
18
|
+
def extension_scripts
|
|
19
|
+
[extensions].flatten.collect do |ext|
|
|
20
|
+
Dir.glob(ext)
|
|
21
|
+
end.flatten
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Return list of directory locations of extconf.rb scripts.
|
|
25
|
+
|
|
26
|
+
def extension_directories
|
|
27
|
+
glob(extension_scripts).map do |ext|
|
|
28
|
+
File.dirname(ext)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Check to see if this project has extensions that need to be compiled.
|
|
33
|
+
|
|
34
|
+
def compiles?
|
|
35
|
+
!extension_directories.empty?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Compile extensions.
|
|
39
|
+
|
|
40
|
+
def make
|
|
41
|
+
make_extconf
|
|
42
|
+
make_target
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Compile static.
|
|
46
|
+
|
|
47
|
+
def make_static
|
|
48
|
+
make_extconf
|
|
49
|
+
make_target 'static'
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Remove enouhg compile products for a clean compile.
|
|
53
|
+
|
|
54
|
+
def make_clean
|
|
55
|
+
make_target 'clean'
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Remove all compile products.
|
|
59
|
+
|
|
60
|
+
def make_distclean
|
|
61
|
+
make_target 'distclean'
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Create Makefile(s).
|
|
65
|
+
|
|
66
|
+
def make_extconf
|
|
67
|
+
extensions.each do |file|
|
|
68
|
+
directory = File.dirname(file)
|
|
69
|
+
next if File.exist?(File.join(directory, 'Makefile'))
|
|
70
|
+
cd(directory) do
|
|
71
|
+
sh "ruby #{File.basename(file)}"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
def make_target(target='')
|
|
79
|
+
extension_directories.each do |directory|
|
|
80
|
+
cd(directory) do
|
|
81
|
+
sh "make #{target}"
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
# Eric Hodel said NOT to copy the compiled libs.
|
|
88
|
+
#
|
|
89
|
+
#task :copy_files do
|
|
90
|
+
# cp "ext/**/*.#{dlext}", "lib/**/#{arch}/"
|
|
91
|
+
#end
|
|
92
|
+
#
|
|
93
|
+
#def dlext
|
|
94
|
+
# Config::CONFIG['DLEXT']
|
|
95
|
+
#end
|
|
96
|
+
#
|
|
97
|
+
#def arch
|
|
98
|
+
# Config::CONFIG['arch']
|
|
99
|
+
#end
|
|
100
|
+
|
|
101
|
+
# Cross-compile for Windows. (TODO)
|
|
102
|
+
|
|
103
|
+
#def make_mingw
|
|
104
|
+
# abort "NOT YET IMPLEMENTED"
|
|
105
|
+
#end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
require 'reap/manager/gem'
|
|
2
|
+
|
|
3
|
+
module Reap
|
|
4
|
+
|
|
5
|
+
class Manager
|
|
6
|
+
|
|
7
|
+
# Remove packages.
|
|
8
|
+
|
|
9
|
+
def clobber_packages(options=nil)
|
|
10
|
+
options = configure_options(options, 'package')
|
|
11
|
+
|
|
12
|
+
store = 'pkg'
|
|
13
|
+
|
|
14
|
+
packages = glob(File.join(store, '*'))
|
|
15
|
+
|
|
16
|
+
packages.each do |path|
|
|
17
|
+
rm_r(path)
|
|
18
|
+
puts "Removed #{path}" unless dryrun?
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# General pack command.
|
|
23
|
+
|
|
24
|
+
def package(options=nil)
|
|
25
|
+
packopts = configure_options(options, 'package')
|
|
26
|
+
|
|
27
|
+
formats = packopts['formats'] || ['zip']
|
|
28
|
+
formats = [formats].flatten
|
|
29
|
+
|
|
30
|
+
puts
|
|
31
|
+
formats.each do |format|
|
|
32
|
+
send("package_#{format}", options)
|
|
33
|
+
puts
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Routes to $gem_package.
|
|
38
|
+
|
|
39
|
+
def package_gem(options=nil)
|
|
40
|
+
gem_package(options)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Create a Tar'd Gzip package.
|
|
44
|
+
|
|
45
|
+
def package_tgz(options=nil)
|
|
46
|
+
status "Creating .tgz package"
|
|
47
|
+
|
|
48
|
+
options = configure_options(options, 'package-tgz', 'package')
|
|
49
|
+
|
|
50
|
+
package = metadata.clone
|
|
51
|
+
package.update(options)
|
|
52
|
+
|
|
53
|
+
abort "No name" unless package.name
|
|
54
|
+
abort "No version" unless package.version
|
|
55
|
+
|
|
56
|
+
store = 'pkg' #package.package_directory
|
|
57
|
+
fname = package.stage_name
|
|
58
|
+
files = package.filelist
|
|
59
|
+
|
|
60
|
+
stage = File.join(store, fname)
|
|
61
|
+
pfile = stage + ".tgz"
|
|
62
|
+
|
|
63
|
+
unless out_of_date?(pfile, *files) or force?
|
|
64
|
+
report_package_already_built(pfile)
|
|
65
|
+
return
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
rm_r(stage) if File.exist?(stage) # remove old stage
|
|
69
|
+
stage(stage, files) # make new stage
|
|
70
|
+
package_manifest(stage) # generate stage manifest
|
|
71
|
+
|
|
72
|
+
if dryrun?
|
|
73
|
+
status "tar -cxf #{fname}.tgz"
|
|
74
|
+
else
|
|
75
|
+
file = nil
|
|
76
|
+
cd(store) do
|
|
77
|
+
file = tgz(fname) # FIXME: Prefer .tgz as extensions.
|
|
78
|
+
end
|
|
79
|
+
transfer(file, store)
|
|
80
|
+
report_package_built(file)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Create Zip package.
|
|
85
|
+
|
|
86
|
+
def package_zip(options=nil)
|
|
87
|
+
status "Creating .zip package"
|
|
88
|
+
|
|
89
|
+
options = configure_options(options, 'package-zip', 'package')
|
|
90
|
+
|
|
91
|
+
package = metadata.clone
|
|
92
|
+
package.update(options)
|
|
93
|
+
|
|
94
|
+
abort "No name" unless package.name
|
|
95
|
+
abort "No version" unless package.version
|
|
96
|
+
|
|
97
|
+
store = 'pkg' #package.package_directory
|
|
98
|
+
fname = package.stage_name
|
|
99
|
+
files = package.filelist
|
|
100
|
+
|
|
101
|
+
stage = File.join(store, fname)
|
|
102
|
+
pfile = stage + ".zip"
|
|
103
|
+
|
|
104
|
+
unless out_of_date?(pfile, *files) or force?
|
|
105
|
+
report_package_already_built(pfile)
|
|
106
|
+
return
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
rm_r(stage) if File.exist?(stage) # remove old stage
|
|
110
|
+
stage(stage, files) # make new stage
|
|
111
|
+
package_manifest(stage) # generate manifest
|
|
112
|
+
|
|
113
|
+
if dryrun?
|
|
114
|
+
status "zip -r #{fname}.zip ."
|
|
115
|
+
else
|
|
116
|
+
file = nil
|
|
117
|
+
cd(store) do
|
|
118
|
+
file = zip(fname)
|
|
119
|
+
end
|
|
120
|
+
transfer(file, store)
|
|
121
|
+
report_package_built(file)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Create off-line documentation package.
|
|
126
|
+
#
|
|
127
|
+
# FIXME: package_docs is not yet ready for use.
|
|
128
|
+
|
|
129
|
+
def package_docs(options=nil)
|
|
130
|
+
options = configure_options(options, 'package-doc')
|
|
131
|
+
|
|
132
|
+
dir = options['dir'] || 'doc'
|
|
133
|
+
name = options['name'] || metadata.name
|
|
134
|
+
ver = options['version'] || metadata.version
|
|
135
|
+
|
|
136
|
+
cd(dir) do
|
|
137
|
+
zip "-czhvf #{name}-docs-#{ver}.zip *"
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
private
|
|
142
|
+
|
|
143
|
+
# Transfer package file to storage location.
|
|
144
|
+
|
|
145
|
+
def transfer(file, store)
|
|
146
|
+
# move to store, unless already there
|
|
147
|
+
dest = File.join(store, File.basename(file))
|
|
148
|
+
dest = File.expand_path(dest)
|
|
149
|
+
mv(file, store) unless file == dest
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Generate manifest.
|
|
153
|
+
|
|
154
|
+
def package_manifest(dir)
|
|
155
|
+
return if dryrun?
|
|
156
|
+
Dir.chdir(dir) do
|
|
157
|
+
files = Dir['**/*']
|
|
158
|
+
rm('MANIFEST') if File.exist?('MANIFEST')
|
|
159
|
+
File.open('MANIFEST', 'w') do |f|
|
|
160
|
+
f << files.join("\n")
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Report that a package has been built.
|
|
166
|
+
# FIXME: will type, name and version always be right?
|
|
167
|
+
|
|
168
|
+
def report_package_built(file)
|
|
169
|
+
file = File.basename(file)
|
|
170
|
+
type = File.extname(file)
|
|
171
|
+
name = file[0...file.rindex('-')]
|
|
172
|
+
vers = file[file.rindex('-')+1..-1].chomp(type)
|
|
173
|
+
|
|
174
|
+
puts " Successfully built #{type}"
|
|
175
|
+
puts " Name: #{name}"
|
|
176
|
+
puts " Version: #{vers}"
|
|
177
|
+
puts " File: #{file}"
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Report that a package has been built.
|
|
181
|
+
# FIXME: will type, name and version always be right?
|
|
182
|
+
|
|
183
|
+
def report_package_already_built(file)
|
|
184
|
+
file = File.basename(file)
|
|
185
|
+
type = File.extname(file)
|
|
186
|
+
name = file[0...file.rindex('-')]
|
|
187
|
+
vers = file[file.rindex('-')+1..-1].chomp(type)
|
|
188
|
+
|
|
189
|
+
puts " Package #{file} is already current."
|
|
190
|
+
#puts " Name: #{name}"
|
|
191
|
+
#puts " Version: #{vers}"
|
|
192
|
+
#puts " File: #{file}"
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# # Build packages.
|
|
199
|
+
# # TODO Move this to Manager ?
|
|
200
|
+
#
|
|
201
|
+
# def generate_packages
|
|
202
|
+
# package_files = formats.collect do |format|
|
|
203
|
+
# #format = clean_type(format)
|
|
204
|
+
# say '' if format == 'gem' # FIXME This is here b/c Gems outputs on it's own.
|
|
205
|
+
# file = create_package(format)
|
|
206
|
+
# unless dryrun? or (format == 'gem')
|
|
207
|
+
# report_package_built(format, file) if file
|
|
208
|
+
# end
|
|
209
|
+
# file
|
|
210
|
+
# end
|
|
211
|
+
# report_packaging_complete(package_files.size)
|
|
212
|
+
# end
|
|
213
|
+
#
|
|
214
|
+
# # Create package.
|
|
215
|
+
#
|
|
216
|
+
# def create_package(type)
|
|
217
|
+
# package.format = type
|
|
218
|
+
#
|
|
219
|
+
# builder_class = FormatBuilder.registry[type]
|
|
220
|
+
# builder = builder_class.new(package, stage_directory, options)
|
|
221
|
+
# file = builder.build
|
|
222
|
+
#
|
|
223
|
+
# transfer(file) unless dryrun?
|
|
224
|
+
#
|
|
225
|
+
# return file
|
|
226
|
+
# end
|
|
227
|
+
#
|
|
228
|
+
# # Report that packaging is complete.
|
|
229
|
+
#
|
|
230
|
+
# def report_packaging_complete(size)
|
|
231
|
+
# say "\nSuccessfully built #{size} packages at #{store}/."
|
|
232
|
+
# end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
module Reap
|
|
2
|
+
|
|
3
|
+
class Manager
|
|
4
|
+
|
|
5
|
+
# Publish website to rubyforge.
|
|
6
|
+
#
|
|
7
|
+
# This task publishes the source dir (deafult 'doc')
|
|
8
|
+
# to a rubyforge website.
|
|
9
|
+
#
|
|
10
|
+
# Uses RSync to upload files to webserver.
|
|
11
|
+
#
|
|
12
|
+
# TODO: Add FTP/SFTP support.
|
|
13
|
+
|
|
14
|
+
def publish(options=nil)
|
|
15
|
+
options = configure_options(options, 'publish', 'rubyforge')
|
|
16
|
+
|
|
17
|
+
project = options['project'] || metadata.project
|
|
18
|
+
webdir = options['webdir']
|
|
19
|
+
source = options['source']
|
|
20
|
+
username = options['username']
|
|
21
|
+
clear = options['clear']
|
|
22
|
+
protect = options['protect']
|
|
23
|
+
exclude = options['exclude']
|
|
24
|
+
|
|
25
|
+
source ||= "doc"
|
|
26
|
+
username ||= ENV['RUBYFORGE_USERNAME']
|
|
27
|
+
|
|
28
|
+
if clear
|
|
29
|
+
protect = protect().to_a
|
|
30
|
+
exclude = exclude().to_a
|
|
31
|
+
else
|
|
32
|
+
protect = %w{usage statcvs statsvn robot.txt wiki} + [protect].flatten
|
|
33
|
+
exclude = %w{.svn} + [exclude].flatten
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
abort "No project name." unless project
|
|
37
|
+
abort "No username." unless username
|
|
38
|
+
|
|
39
|
+
if webdir and webdir != '.'
|
|
40
|
+
destination = File.join(project, webdir)
|
|
41
|
+
else
|
|
42
|
+
destination = project
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
dir = source.chomp('/') + '/'
|
|
46
|
+
url = "#{username}@rubyforge.org:/var/www/gforge-projects/#{destination}"
|
|
47
|
+
|
|
48
|
+
op = ['-rLvz', '--delete-after'] # maybe -p ?
|
|
49
|
+
|
|
50
|
+
# Using commandline filter options didn't seem
|
|
51
|
+
# to work, so I opted for creating an .rsync_filter file for
|
|
52
|
+
# all cases.
|
|
53
|
+
|
|
54
|
+
unless protect.empty? && exclude.empty?
|
|
55
|
+
rsync_file = File.join(source,'.rsync-filter')
|
|
56
|
+
unless file?(rsync_file)
|
|
57
|
+
File.open(rsync_file, 'w') do |f|
|
|
58
|
+
exclude.each{|e| f << "- #{e}\n"}
|
|
59
|
+
protect.each{|e| f << "P #{e}\n"}
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
op << "--filter='dir-merge #{rsync_file}'"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
args = op + [dir, url]
|
|
66
|
+
|
|
67
|
+
sh "rsync #{args.to_params}"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|