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,193 @@
|
|
|
1
|
+
module Reap
|
|
2
|
+
|
|
3
|
+
class Manager
|
|
4
|
+
|
|
5
|
+
# Make a release announcement. Generates and can email release
|
|
6
|
+
# announcements. The announcement if built from the README file
|
|
7
|
+
# unless another file is specified.
|
|
8
|
+
#
|
|
9
|
+
# This will subsititue the first line mathing /please see notes/i
|
|
10
|
+
# for the notelog. And /please see change/i for the changelog.
|
|
11
|
+
#
|
|
12
|
+
# The following settings apply:
|
|
13
|
+
#
|
|
14
|
+
# title Project title.
|
|
15
|
+
# subtitle Brief one-line description.
|
|
16
|
+
# version Project version.
|
|
17
|
+
# description Long description of project.
|
|
18
|
+
# homepage Project homepage web address.
|
|
19
|
+
# slogan Motto for you project.
|
|
20
|
+
# memo File that contains announcement message.
|
|
21
|
+
# template Announcement template file, rather then README.
|
|
22
|
+
# mail_to Email address(es) to send announcemnt.
|
|
23
|
+
#
|
|
24
|
+
# If <em>mail_to</em> is set then these also apply:
|
|
25
|
+
#
|
|
26
|
+
# from Message FROM address [email].
|
|
27
|
+
# subject Subject of email message ([ANN] title verison).
|
|
28
|
+
# server Email server to route message.
|
|
29
|
+
# port Email server's port.
|
|
30
|
+
# domain Email server's domain name.
|
|
31
|
+
# account Email account name [email].
|
|
32
|
+
# login Login type: plain, cram_md5 or login.
|
|
33
|
+
# secure Uses TLS security, true or false?
|
|
34
|
+
#
|
|
35
|
+
# A template file can be specified that uses "$setting" as
|
|
36
|
+
# substitutes for poject information.
|
|
37
|
+
|
|
38
|
+
def announce(options=nil)
|
|
39
|
+
options = configure_options(options, 'announce', 'mail')
|
|
40
|
+
|
|
41
|
+
message = announce_message(options)
|
|
42
|
+
|
|
43
|
+
options = options.to_ostruct
|
|
44
|
+
|
|
45
|
+
mail_to = options.mail_to
|
|
46
|
+
mail_from = options.mail_from
|
|
47
|
+
subject = options.subject # Subject line (default is "ANN: project version").
|
|
48
|
+
server = options.server # Email server
|
|
49
|
+
port = options.port # Emails server port (default is usually correct).
|
|
50
|
+
account = options.account # Email account name (defaults to mail_from).
|
|
51
|
+
domain = options.domain # User domain (not sure why SMTP requires this?)
|
|
52
|
+
login = options.login # Login type (plain, login)
|
|
53
|
+
secure = options.secure # Use TLS/SSL true or false?
|
|
54
|
+
password = options.password || ENV['EMAIL_PASSWORD']
|
|
55
|
+
|
|
56
|
+
title = options.title || metadata.title
|
|
57
|
+
version = options.versoin || metadata.version
|
|
58
|
+
|
|
59
|
+
# defaults
|
|
60
|
+
subject ||= "ANN: #{title}, v#{version}"
|
|
61
|
+
account ||= mail_from
|
|
62
|
+
|
|
63
|
+
subject = subject % [title, version]
|
|
64
|
+
|
|
65
|
+
puts "\n#{message}\n\n"
|
|
66
|
+
|
|
67
|
+
if mail_to and !dryrun?
|
|
68
|
+
ans = ask("Would you like to email this announcement?", "yN")
|
|
69
|
+
case ans.downcase
|
|
70
|
+
when 'y', 'yes'
|
|
71
|
+
email(message,
|
|
72
|
+
:to => mail_to,
|
|
73
|
+
:from => mail_from,
|
|
74
|
+
:subject => subject,
|
|
75
|
+
:server => server,
|
|
76
|
+
:port => port,
|
|
77
|
+
:domain => domain,
|
|
78
|
+
:account => account,
|
|
79
|
+
:login => login,
|
|
80
|
+
:secure => secure,
|
|
81
|
+
:password => password
|
|
82
|
+
)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Make a release announcement. Generates and can email a release
|
|
88
|
+
# announcements. These are nicely formated message and can
|
|
89
|
+
# email the message to the specified address(es).
|
|
90
|
+
#
|
|
91
|
+
# The following settings apply:
|
|
92
|
+
#
|
|
93
|
+
# template Announcement file/template.
|
|
94
|
+
# cutoff Max number of lines of changelog to show.
|
|
95
|
+
#
|
|
96
|
+
# A template file can be specified that uses "$setting" as
|
|
97
|
+
# substitutes for poject information.
|
|
98
|
+
|
|
99
|
+
def announce_message(options={})
|
|
100
|
+
config = settings['announce'] || {}
|
|
101
|
+
options = config.merge(options).to_ostruct
|
|
102
|
+
|
|
103
|
+
cutoff = options.cutoff || 30
|
|
104
|
+
template = options.template || "{ANNOUNCE,README}{,.txt}"
|
|
105
|
+
|
|
106
|
+
#config['mail_to'] = nil if keys['mail_to'].empty?
|
|
107
|
+
|
|
108
|
+
# Build message
|
|
109
|
+
|
|
110
|
+
# template
|
|
111
|
+
template = Dir.glob(options.template.to_s, File::FNM_CASEFOLD).first
|
|
112
|
+
abort "No announcememnt template." unless template
|
|
113
|
+
|
|
114
|
+
#
|
|
115
|
+
readme = File.read(template)
|
|
116
|
+
readme = unfold_paragraphs(readme)
|
|
117
|
+
|
|
118
|
+
# changelog
|
|
119
|
+
file = Dir.glob('change{s,log}{,.txt}', File::FNM_CASEFOLD)[0]
|
|
120
|
+
changelog = file ? File.read(file).strip : ''
|
|
121
|
+
#changelog = unfold_paragraphs(changelog)
|
|
122
|
+
changelog = changelog.split("\n")[0..cutoff].join("\n")
|
|
123
|
+
|
|
124
|
+
# noteslog
|
|
125
|
+
file = Dir.glob('note{s,log}{,.txt}', File::FNM_CASEFOLD)[0]
|
|
126
|
+
notelog = file ? File.read(file).strip : ''
|
|
127
|
+
notelog = unfold_paragraphs(notelog)
|
|
128
|
+
|
|
129
|
+
# Strip tiny version zero.
|
|
130
|
+
#if keys['version'] =~ /[.].*?[.]/
|
|
131
|
+
# keys['version'] = keys['version'].chomp('.0')
|
|
132
|
+
#end
|
|
133
|
+
|
|
134
|
+
# Make announcement message
|
|
135
|
+
message = readme.dup
|
|
136
|
+
|
|
137
|
+
#message.gsub!('$readme$', readme || '')
|
|
138
|
+
message.sub!(/^\s*please\ see(\ the)?\ notes(.*?)$/i, "\n" + notelog) if notelog
|
|
139
|
+
message.sub!(/^\s*please\ see(\ the)?\ change(.*?)$/i, "\n" + changelog) if changelog
|
|
140
|
+
|
|
141
|
+
template = message.dup
|
|
142
|
+
|
|
143
|
+
template.scan(/[$](.*?)[$]/m) do |key|
|
|
144
|
+
#key = key.strip
|
|
145
|
+
name = $1.strip #key[1..-1]
|
|
146
|
+
if metadata.respond_to?(name.downcase)
|
|
147
|
+
value = metadata.send(name.downcase)
|
|
148
|
+
message.gsub!("$#{name}$", value.to_s.strip)
|
|
149
|
+
else
|
|
150
|
+
puts "Warning: Unknown project field -- #{name}."
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
message.gsub!(/(^|[ ])[$].*?(?=[ ]|$)/,'') # remove unused vars
|
|
155
|
+
message.gsub!(/\n\s*\n\s*\n/m,"\n\n") # remove any triple blank lines
|
|
156
|
+
message.rstrip!
|
|
157
|
+
|
|
158
|
+
return message
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def unfold_paragraphs(string)
|
|
162
|
+
blank = false
|
|
163
|
+
text = ''
|
|
164
|
+
string.split(/\n/).each do |line|
|
|
165
|
+
if /\S/ !~ line
|
|
166
|
+
text << "\n\n"
|
|
167
|
+
blank = true
|
|
168
|
+
else
|
|
169
|
+
if /^(\s+|[*])/ =~ line
|
|
170
|
+
text << (line.rstrip + "\n")
|
|
171
|
+
else
|
|
172
|
+
text << (line.rstrip + " ")
|
|
173
|
+
end
|
|
174
|
+
blank = false
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
return text
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# keys = {}
|
|
185
|
+
# keys['from'] = info.email
|
|
186
|
+
# keys.update info.gather('mail')
|
|
187
|
+
# keys.update info.gather('announce')
|
|
188
|
+
# keys.update info.select(
|
|
189
|
+
# :project, :version, :title, :subtitle, :description,
|
|
190
|
+
# :homepage, :download, :slogan
|
|
191
|
+
# )
|
|
192
|
+
# keys.update override if override
|
|
193
|
+
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
module Reap
|
|
2
|
+
|
|
3
|
+
class Manager
|
|
4
|
+
|
|
5
|
+
# Verify syntax of ruby scripts.
|
|
6
|
+
#
|
|
7
|
+
# This takes one option +:scripts+ which is a glob or list of globs
|
|
8
|
+
# of the scripts to check. By default this is all scripts in the libpath(s).
|
|
9
|
+
|
|
10
|
+
def check_syntax(options=nil)
|
|
11
|
+
options = configure_options(options, 'check-syntax', 'check')
|
|
12
|
+
|
|
13
|
+
libpath = options['loadpath'] || metadata.loadpath
|
|
14
|
+
exclude = options['exclude']
|
|
15
|
+
|
|
16
|
+
#libpath = libpath.split(/[:;]/) unless Array===libpath
|
|
17
|
+
libpath = list_option(libpath)
|
|
18
|
+
exclude = list_option(exclude)
|
|
19
|
+
|
|
20
|
+
files = multiglob_r(*libpath) - multiglob_r(exclude)
|
|
21
|
+
files = files.select{ |f| File.extname(f) == '.rb' }
|
|
22
|
+
max = files.collect{ |f| f.size }.max
|
|
23
|
+
list = []
|
|
24
|
+
|
|
25
|
+
files.each do |s|
|
|
26
|
+
next unless File.file?(s)
|
|
27
|
+
#if not system "ruby -c -Ibin:lib:test #{s} &> /dev/null" then
|
|
28
|
+
r = system "ruby -c -I#{libpath} #{s} > /dev/null 2>&1"
|
|
29
|
+
if r
|
|
30
|
+
puts("%-#{max}s [PASS]" % [s]) #if verbose?
|
|
31
|
+
else
|
|
32
|
+
puts("%-#{max}s [FAIL]" % [s]) #if verbose?
|
|
33
|
+
list << s #:syntax
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
puts " #{list.size} Syntax Errors"
|
|
38
|
+
|
|
39
|
+
if verbose?
|
|
40
|
+
unless list.empty?
|
|
41
|
+
puts "\n-- Syntax Errors --\n"
|
|
42
|
+
list.each do |f|
|
|
43
|
+
print "* "
|
|
44
|
+
system "ruby -c -I#{libpath} #{f} 2>&1"
|
|
45
|
+
#puts
|
|
46
|
+
end
|
|
47
|
+
puts
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Load each script independently to ensure there are no
|
|
53
|
+
# require dependency issues.
|
|
54
|
+
#
|
|
55
|
+
# WARNING! You should only run this on scripts that have no
|
|
56
|
+
# toplevel side-effects!!!
|
|
57
|
+
#
|
|
58
|
+
# This takes one option +:scripts+ which is a glob or list of globs
|
|
59
|
+
# of the scripts to check. By default this is all scripts in the libpath(s).
|
|
60
|
+
#
|
|
61
|
+
# FIXME: This isn't routing output to dev/null as expected.
|
|
62
|
+
|
|
63
|
+
def check_load(options=nil)
|
|
64
|
+
options = configure_options(options, 'check-load', 'check')
|
|
65
|
+
|
|
66
|
+
make if compiles?
|
|
67
|
+
|
|
68
|
+
libpath = options['libpath'] || metadata.libpath
|
|
69
|
+
exclude = options['exclude']
|
|
70
|
+
|
|
71
|
+
libpath = list_option(libpath)
|
|
72
|
+
exclude = list_option(exclude)
|
|
73
|
+
|
|
74
|
+
files = multiglob_r(*libpath) - multiglob_r(exclude)
|
|
75
|
+
files = files.select{ |f| File.extname(f) == '.rb' }
|
|
76
|
+
max = files.collect{ |f| f.size }.max
|
|
77
|
+
list = []
|
|
78
|
+
|
|
79
|
+
files.each do |s|
|
|
80
|
+
next unless File.file?(s)
|
|
81
|
+
#if not system "ruby -c -Ibin:lib:test #{s} &> /dev/null" then
|
|
82
|
+
cmd = "ruby -I#{libpath.join(':')} #{s} > /dev/null 2>&1"
|
|
83
|
+
puts cmd if debug?
|
|
84
|
+
if r = system(cmd)
|
|
85
|
+
puts "%-#{max}s [PASS]" % [s]
|
|
86
|
+
else
|
|
87
|
+
puts "%-#{max}s [FAIL]" % [s]
|
|
88
|
+
list << s #:load
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
puts " #{list.size} Load Failures"
|
|
93
|
+
|
|
94
|
+
if verbose?
|
|
95
|
+
unless list.empty?
|
|
96
|
+
puts "\n-- Load Failures --\n"
|
|
97
|
+
list.each do |f|
|
|
98
|
+
print "* "
|
|
99
|
+
system "ruby -I#{libpath} #{f} 2>&1"
|
|
100
|
+
#puts
|
|
101
|
+
end
|
|
102
|
+
puts
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Reap
|
|
2
|
+
|
|
3
|
+
class Manager
|
|
4
|
+
|
|
5
|
+
# Clean scrap products. All directory paths and or file globs
|
|
6
|
+
# listed under the clean configuration entry, can be removed via
|
|
7
|
+
# this method. By default all files ending with "~" or .back
|
|
8
|
+
# are removed. To specifcy an alternate provide a list of files
|
|
9
|
+
# and/or glibs under +remove:+ sub-entry. You can also provide
|
|
10
|
+
# an +exclude:+ sub-entry to isolate files not to be removed.
|
|
11
|
+
# For example, on might do:
|
|
12
|
+
#
|
|
13
|
+
# clean:
|
|
14
|
+
# remove [ '**/*~', '**/*.bak', '.config' ]
|
|
15
|
+
#
|
|
16
|
+
# Clean is run as a prerequiste to #release via #prepare.
|
|
17
|
+
|
|
18
|
+
def clean(options=nil)
|
|
19
|
+
options = configure_options(options, 'clean')
|
|
20
|
+
|
|
21
|
+
remove = options['remove']
|
|
22
|
+
exclude = options['exclude']
|
|
23
|
+
|
|
24
|
+
remove = list_option(remove)
|
|
25
|
+
exclude = list_option(exclude)
|
|
26
|
+
|
|
27
|
+
files = multiglob_r(*remove) - multiglob_r(exclude)
|
|
28
|
+
|
|
29
|
+
return if files.empty?
|
|
30
|
+
|
|
31
|
+
puts files.join("\n")
|
|
32
|
+
|
|
33
|
+
if verbose?
|
|
34
|
+
ans = ask("Remove files?", "yN").downcase
|
|
35
|
+
return unless ans == 'y' or ans == 'yes'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
files.each do |f|
|
|
39
|
+
rm(f) if File.exist?(f)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Run all clobber methods. This method literally looks for all other
|
|
44
|
+
# methods starting with the phrase "clobber_" and calls them, then
|
|
45
|
+
# runs #clean as well.
|
|
46
|
+
|
|
47
|
+
def clobber(options=nil)
|
|
48
|
+
clobber_methods = methods.select{ |m| m.to_s =~ /^clobber_/ }
|
|
49
|
+
clobber_methods.each do |m|
|
|
50
|
+
send(m)
|
|
51
|
+
end
|
|
52
|
+
clean
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
module Reap
|
|
2
|
+
|
|
3
|
+
class Manager
|
|
4
|
+
|
|
5
|
+
# Remove gem package products.
|
|
6
|
+
|
|
7
|
+
def gem_clobber(options=nil)
|
|
8
|
+
store = "pkg"
|
|
9
|
+
|
|
10
|
+
packages = glob(File.join(store, '*.gem'))
|
|
11
|
+
|
|
12
|
+
packages.each do |path|
|
|
13
|
+
File.directory?(path) ? rm_r(path) : rm(path)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Create a Gem package.
|
|
18
|
+
#
|
|
19
|
+
# TODO: Should this use staging too, like zip/tgz?
|
|
20
|
+
|
|
21
|
+
def gem_package(options=nil)
|
|
22
|
+
begin
|
|
23
|
+
require 'rubygems/specification'
|
|
24
|
+
Gem::manage_gems
|
|
25
|
+
rescue LoadError
|
|
26
|
+
#raise LoadError, "RubyGems is not installed?"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
status "Creating .gem package"
|
|
30
|
+
|
|
31
|
+
options = configure_options(options, 'package-gem', 'package')
|
|
32
|
+
|
|
33
|
+
package = metadata.clone
|
|
34
|
+
package.update(options)
|
|
35
|
+
|
|
36
|
+
abort "No name" unless package.name
|
|
37
|
+
abort "No version" unless package.version
|
|
38
|
+
|
|
39
|
+
store = 'pkg' #package.package_directory
|
|
40
|
+
fname = package.stage_name
|
|
41
|
+
files = package.filelist
|
|
42
|
+
|
|
43
|
+
stage = File.join(store, fname)
|
|
44
|
+
pfile = stage + ".gem"
|
|
45
|
+
|
|
46
|
+
unless out_of_date?(pfile, *files) or force?
|
|
47
|
+
report_package_already_built(pfile)
|
|
48
|
+
return
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
rm_r(stage) if File.exist?(stage) # remove old stage
|
|
52
|
+
stage(stage, files) # make new stage
|
|
53
|
+
package_manifest(stage) # generate manifest
|
|
54
|
+
|
|
55
|
+
if dryrun?
|
|
56
|
+
status "gem build #{stage}"
|
|
57
|
+
else
|
|
58
|
+
file = nil
|
|
59
|
+
cd(stage) do
|
|
60
|
+
#status "vi #{metadata.name}.gemspec"
|
|
61
|
+
builder = ::Gem::Builder.new(gemspec(package))
|
|
62
|
+
status "gem build #{stage}"
|
|
63
|
+
unless dryrun?
|
|
64
|
+
file = builder.build
|
|
65
|
+
file = File.expand_path(file)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
# transfer gem package to package store
|
|
69
|
+
mkdir_p(store)
|
|
70
|
+
destination = File.join(store, File.basename(file))
|
|
71
|
+
mv(file, store) unless File.expand_path(file) == File.expand_path(destination)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
return destination
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Install gem package, creating the package if not already created.
|
|
78
|
+
#
|
|
79
|
+
# TODO: Endure that we even need a gem package using #out_of_date?
|
|
80
|
+
|
|
81
|
+
def gem_install(options=nil)
|
|
82
|
+
file = gem_package(options)
|
|
83
|
+
sh "gem install #{file}"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Uninstall gem package.
|
|
87
|
+
#
|
|
88
|
+
# TODO: Sepcify version?
|
|
89
|
+
|
|
90
|
+
def gem_uninstall
|
|
91
|
+
i = metadata.package_name.rindex('-')
|
|
92
|
+
name, version = metadata.package_name[0...i], metadata.package_name[i+1..-1]
|
|
93
|
+
sh "gem uninstall #{name} -v #{version}"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
private
|
|
97
|
+
|
|
98
|
+
# Create Gem::Specification.
|
|
99
|
+
|
|
100
|
+
def gemspec(package)
|
|
101
|
+
distribute = package.filelist
|
|
102
|
+
#distribute = Dir.multiglob_with_default( '**/*', distribute )
|
|
103
|
+
|
|
104
|
+
# I don't quite get how Rubygems deals with authors. It turns a singel value into an array. Why?
|
|
105
|
+
#author = [package.author, package.contact].flatten.compact.first
|
|
106
|
+
|
|
107
|
+
if md = /(\w+).rubyforge.org/.match(package.homepage)
|
|
108
|
+
rubyforge_project = md[1]
|
|
109
|
+
else
|
|
110
|
+
rubyforge_project = package.project # b/c it has to be something according to Eric Hodel.
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
::Gem::Specification.new do |spec|
|
|
114
|
+
spec.name = package.package
|
|
115
|
+
spec.version = package.version
|
|
116
|
+
spec.summary = package.brief
|
|
117
|
+
spec.description = package.description
|
|
118
|
+
spec.author = package.contact
|
|
119
|
+
spec.email = package.email
|
|
120
|
+
spec.rubyforge_project = rubyforge_project
|
|
121
|
+
spec.homepage = package.homepage
|
|
122
|
+
|
|
123
|
+
# Platform: ruby, mswin32, i586-linux, powerpc-darwin, current
|
|
124
|
+
spec.platform = 'ruby' # TODO current support!
|
|
125
|
+
|
|
126
|
+
spec.require_paths = [package.gem_path].flatten.reverse
|
|
127
|
+
|
|
128
|
+
#if package.platform != 'ruby'
|
|
129
|
+
# spec.require_paths.concat(spec.require_paths.collect{ |d| File.join(d, platform) })
|
|
130
|
+
#end
|
|
131
|
+
|
|
132
|
+
spec.bindir = "bin"
|
|
133
|
+
spec.executables = package.executables
|
|
134
|
+
spec.requirements = package.requirements
|
|
135
|
+
spec.has_rdoc = !(FalseClass===package.document)
|
|
136
|
+
|
|
137
|
+
if package.dependencies
|
|
138
|
+
package.dependencies.each do |d,v|
|
|
139
|
+
spec.add_dependency(*[d,v].compact)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
spec.extensions = package.compile
|
|
144
|
+
|
|
145
|
+
spec.files = distribute
|
|
146
|
+
|
|
147
|
+
spec.test_files = distribute.select{ |f| f =~ /^test\// } # TODO make test_files configurable
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Report that a package has been built.
|
|
152
|
+
# FIXME
|
|
153
|
+
|
|
154
|
+
def report_package_built(type, file)
|
|
155
|
+
r = ''
|
|
156
|
+
r << "\n Successfully built #{type}"
|
|
157
|
+
r << "\n Name: #{package.name}"
|
|
158
|
+
r << "\n Version: #{package.version}"
|
|
159
|
+
r << "\n File: #{File.basename(file)}"
|
|
160
|
+
say r
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# # Build packages.
|
|
167
|
+
# # TODO Move this to Manager ?
|
|
168
|
+
#
|
|
169
|
+
# def generate_packages
|
|
170
|
+
# package_files = formats.collect do |format|
|
|
171
|
+
# #format = clean_type(format)
|
|
172
|
+
# say '' if format == 'gem' # FIXME This is here b/c Gems outputs on it's own.
|
|
173
|
+
# file = create_package(format)
|
|
174
|
+
# unless dryrun? or (format == 'gem')
|
|
175
|
+
# report_package_built(format, file) if file
|
|
176
|
+
# end
|
|
177
|
+
# file
|
|
178
|
+
# end
|
|
179
|
+
# report_packaging_complete(package_files.size)
|
|
180
|
+
# end
|
|
181
|
+
#
|
|
182
|
+
# # Create package.
|
|
183
|
+
#
|
|
184
|
+
# def create_package(type)
|
|
185
|
+
# package.format = type
|
|
186
|
+
#
|
|
187
|
+
# builder_class = FormatBuilder.registry[type]
|
|
188
|
+
# builder = builder_class.new(package, stage_directory, options)
|
|
189
|
+
# file = builder.build
|
|
190
|
+
#
|
|
191
|
+
# transfer(file) unless dryrun?
|
|
192
|
+
#
|
|
193
|
+
# return file
|
|
194
|
+
# end
|
|
195
|
+
#
|
|
196
|
+
# # Report that packaging is complete.
|
|
197
|
+
#
|
|
198
|
+
# def report_packaging_complete(size)
|
|
199
|
+
# say "\nSuccessfully built #{size} packages at #{store}/."
|
|
200
|
+
# end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module Reap
|
|
2
|
+
|
|
3
|
+
class Manager
|
|
4
|
+
|
|
5
|
+
# Create web index.html from README. (Not yet used)
|
|
6
|
+
|
|
7
|
+
def html
|
|
8
|
+
require 'rdoc/markup/simple_markup'
|
|
9
|
+
require 'rdoc/markup/simple_markup/to_html'
|
|
10
|
+
|
|
11
|
+
options = configure_options(options, 'html')
|
|
12
|
+
|
|
13
|
+
output = options['output']
|
|
14
|
+
files = options['files']
|
|
15
|
+
style = options['css']
|
|
16
|
+
|
|
17
|
+
output ||= 'doc'
|
|
18
|
+
files ||= '[A-Z]*'
|
|
19
|
+
style ||= Dir.glob('*.css').first
|
|
20
|
+
|
|
21
|
+
files = Dir.glob(files)
|
|
22
|
+
|
|
23
|
+
s = SM::SimpleMarkup.new
|
|
24
|
+
h = SM::ToHtml.new
|
|
25
|
+
|
|
26
|
+
files.each do |file|
|
|
27
|
+
unless File.exist?(file)
|
|
28
|
+
puts "Warning: file does not exist -- #{file}"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
mkdir_p(output) unless dryrun?
|
|
33
|
+
|
|
34
|
+
files.each do |file|
|
|
35
|
+
name = file.downcase.chomp('.txt')
|
|
36
|
+
if /^readme/ =~ name
|
|
37
|
+
name = "index"
|
|
38
|
+
end
|
|
39
|
+
path = File.join(output, name + '.html')
|
|
40
|
+
|
|
41
|
+
if dryrun?
|
|
42
|
+
puts "[DRYRUN] Create #{path}"
|
|
43
|
+
else
|
|
44
|
+
next unless out_of_date?(path, file)
|
|
45
|
+
|
|
46
|
+
title = "#{package.title} #{name.upcase}"
|
|
47
|
+
|
|
48
|
+
input = File.read(file)
|
|
49
|
+
output = s.convert(input, h)
|
|
50
|
+
|
|
51
|
+
File.open(path, 'w') do |f|
|
|
52
|
+
f << %{<html>}
|
|
53
|
+
f << %{<head>}
|
|
54
|
+
f << %{ <title>#{title}<title>}
|
|
55
|
+
f << %{ <link rel="stylesheet" TYPE="text/css" HREF="#{style}">} if style
|
|
56
|
+
f << %{</head>}
|
|
57
|
+
f << %{<body>}
|
|
58
|
+
f << output
|
|
59
|
+
f << %{</body>}
|
|
60
|
+
f << %{</html>}
|
|
61
|
+
end
|
|
62
|
+
puts "Created #{path}"
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|