reap 6.0.2 → 9.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/CHANGES +6 -0
  2. data/COPYING +666 -395
  3. data/MANIFEST +139 -0
  4. data/NOTES +12 -0
  5. data/README +19 -163
  6. data/bin/reap-announce +7 -0
  7. data/bin/reap-check-load +8 -0
  8. data/bin/reap-check-syntax +7 -0
  9. data/bin/reap-clean +7 -0
  10. data/bin/reap-clobber +7 -0
  11. data/bin/reap-doc +7 -0
  12. data/bin/reap-doc-rdoc +7 -0
  13. data/bin/reap-doc-ri +7 -0
  14. data/bin/reap-init +69 -0
  15. data/bin/reap-inspect +7 -0
  16. data/bin/reap-install +8 -0
  17. data/bin/reap-install-gem +8 -0
  18. data/bin/reap-log +7 -0
  19. data/bin/reap-log-changes +8 -0
  20. data/bin/reap-log-notes +8 -0
  21. data/bin/reap-make +7 -0
  22. data/bin/reap-make-clean +7 -0
  23. data/bin/reap-make-distclean +7 -0
  24. data/bin/reap-make-extconf +7 -0
  25. data/bin/reap-make-static +8 -0
  26. data/bin/reap-package +8 -0
  27. data/bin/reap-package-gem +7 -0
  28. data/bin/reap-package-tgz +7 -0
  29. data/bin/reap-package-zip +7 -0
  30. data/bin/reap-prepare +7 -0
  31. data/bin/reap-publish +7 -0
  32. data/bin/reap-release +7 -0
  33. data/bin/reap-scaffold +8 -0
  34. data/bin/reap-scm-branch +7 -0
  35. data/bin/reap-scm-tag +7 -0
  36. data/bin/reap-spec +7 -0
  37. data/bin/reap-spec-doc +8 -0
  38. data/bin/reap-stamp +7 -0
  39. data/bin/reap-stats +7 -0
  40. data/bin/reap-test +7 -0
  41. data/bin/reap-test-cross +7 -0
  42. data/bin/reap-test-load +9 -0
  43. data/bin/reap-test-solo +7 -0
  44. data/bin/reap-uninstall +7 -0
  45. data/bin/reap-uninstall-gem +7 -0
  46. data/data/reap/base/CHANGES +19 -0
  47. data/data/reap/base/COPYING +674 -0
  48. data/data/reap/base/NOTES +12 -0
  49. data/data/reap/base/README +8 -0
  50. data/data/reap/build/rake/Rakefile +130 -0
  51. data/{forge/reference/installers → data/reap/build/rake}/setup.rb +155 -97
  52. data/data/reap/build/rake-lite/install.rb +79 -0
  53. data/data/reap/build/tasks/task/rdoc +211 -0
  54. data/data/reap/{setup.rb → build/tasks/task/setup} +248 -200
  55. data/data/reap/build/tasks/task/test +38 -0
  56. data/data/reap/init/meta/project.yaml +21 -0
  57. data/demo/README +15 -0
  58. data/demo/lib/foo/foo.rb +7 -0
  59. data/demo/meta/VERSION +1 -0
  60. data/demo/meta/project.yaml +21 -0
  61. data/lib/reap/application.rb +80 -0
  62. data/lib/reap/default.yaml +77 -0
  63. data/lib/reap/extensions/array.rb +50 -0
  64. data/lib/reap/extensions/hash.rb +63 -0
  65. data/lib/reap/extensions/string.rb +31 -0
  66. data/lib/reap/extensions.rb +6 -0
  67. data/lib/reap/iobject.rb +264 -0
  68. data/lib/reap/manager/announce.rb +193 -0
  69. data/lib/reap/manager/check.rb +109 -0
  70. data/lib/reap/manager/clean.rb +58 -0
  71. data/lib/reap/manager/gem.rb +200 -0
  72. data/lib/reap/manager/html.rb +69 -0
  73. data/lib/reap/manager/log.rb +214 -0
  74. data/lib/reap/manager/make.rb +109 -0
  75. data/lib/reap/manager/pack.rb +232 -0
  76. data/lib/reap/manager/publish.rb +72 -0
  77. data/lib/reap/manager/rdoc.rb +194 -0
  78. data/lib/reap/manager/release.rb +78 -0
  79. data/lib/reap/manager/rubyforge.rb +44 -0
  80. data/lib/reap/manager/scaffold.rb +138 -0
  81. data/lib/reap/manager/scm.rb +66 -0
  82. data/lib/reap/manager/site.rb +27 -0
  83. data/lib/reap/manager/spec.rb +94 -0
  84. data/lib/reap/manager/stats.rb +145 -0
  85. data/lib/reap/manager/svn.rb +76 -0
  86. data/lib/reap/manager/test.rb +389 -0
  87. data/lib/reap/manager.rb +74 -0
  88. data/lib/reap/metadata.rb +603 -0
  89. data/lib/reap/project.rb +165 -0
  90. data/lib/reap/settings.rb +67 -0
  91. data/lib/reap/systems/rubyforge.rb +737 -0
  92. data/lib/reap/systems/subversion.rb +333 -0
  93. data/lib/reap/utilities/fileutils.rb +304 -0
  94. data/lib/reap/utilities/netutils.rb +221 -0
  95. data/lib/reap/utilities/setuputils.rb +124 -0
  96. data/lib/reap/utilities/shellutils.rb +175 -0
  97. data/log/Changelog.txt +107 -0
  98. data/log/FIXME.txt +25 -0
  99. data/log/TODO.txt +72 -0
  100. data/meta/VERSION +1 -0
  101. data/meta/description +4 -0
  102. data/meta/project.yaml +20 -0
  103. data/task/man +14 -0
  104. data/task/rdoc +20 -0
  105. data/{data/reap/scaffold/standard/setup.rb → task/setup} +248 -200
  106. metadata +225 -153
  107. data/ProjectInfo +0 -105
  108. data/bin/reap +0 -5
  109. data/bin/rubytest +0 -5
  110. data/data/reap/install.rb +0 -62
  111. data/data/reap/scaffold/standard/COPYING +0 -403
  112. data/data/reap/scaffold/standard/ChangeLog +0 -0
  113. data/data/reap/scaffold/standard/INSTALL +0 -14
  114. data/data/reap/scaffold/standard/ProjectInfo +0 -77
  115. data/data/reap/scaffold/standard/README +0 -3
  116. data/data/reap/scaffold/standard/Rakefile +0 -10
  117. data/data/reap/scaffold/standard/TODO +0 -0
  118. data/data/reap/scaffold/subversion/trunk/COPYING +0 -403
  119. data/data/reap/scaffold/subversion/trunk/ChangeLog +0 -0
  120. data/data/reap/scaffold/subversion/trunk/INSTALL +0 -14
  121. data/data/reap/scaffold/subversion/trunk/ProjectInfo +0 -76
  122. data/data/reap/scaffold/subversion/trunk/README +0 -3
  123. data/data/reap/scaffold/subversion/trunk/Rakefile +0 -10
  124. data/data/reap/scaffold/subversion/trunk/TODO +0 -0
  125. data/data/reap/scaffold/subversion/trunk/setup.rb +0 -1568
  126. data/forge/ProjectInfo +0 -38
  127. data/forge/ProjectInfo.rb +0 -76
  128. data/forge/TODO +0 -10
  129. data/forge/installer.rb +0 -250
  130. data/forge/reference/Rakefile +0 -124
  131. data/forge/reference/Rakefile.htm +0 -69
  132. data/forge/reference/aRakefile +0 -60
  133. data/forge/reference/compositepublisher.rb +0 -24
  134. data/forge/reference/ftptools.rb +0 -139
  135. data/forge/reference/installers/package.rb +0 -629
  136. data/forge/reference/license-each.rb +0 -85
  137. data/forge/reference/publisher.rb +0 -75
  138. data/forge/reference/rubyforge.rb +0 -247
  139. data/forge/reference/rubyforgepublisher.rb +0 -18
  140. data/forge/reference/sshpublisher.rb +0 -47
  141. data/forge/reference/suby-cvs.rb +0 -46
  142. data/forge/scaffold.rb +0 -126
  143. data/forge/unit_runner/README +0 -6
  144. data/forge/unit_runner/commentrunner.rb +0 -62
  145. data/forge/unit_runner/cunit.rb +0 -17
  146. data/forge/unit_runner/forkedrunner.rb +0 -91
  147. data/forge/unit_runner/sample.rb +0 -16
  148. data/lib/reap/bin/reap.rb +0 -230
  149. data/lib/reap/bin/rubytest.rb +0 -53
  150. data/lib/reap/class/announce.rb +0 -220
  151. data/lib/reap/class/doap.rb +0 -80
  152. data/lib/reap/class/extest.rb +0 -146
  153. data/lib/reap/class/filer.rb +0 -62
  154. data/lib/reap/class/manifest.rb +0 -68
  155. data/lib/reap/class/package.rb +0 -576
  156. data/lib/reap/class/publish.rb +0 -152
  157. data/lib/reap/class/rdoc.rb +0 -123
  158. data/lib/reap/class/test.rb +0 -264
  159. data/lib/reap/projectinfo.rb +0 -208
  160. data/lib/reap/rake.rb +0 -42
  161. data/lib/reap/reap.rb +0 -89
  162. data/lib/reap/tasks.rb +0 -756
  163. data/lib/reap/taskutils.rb +0 -122
  164. data/note/LATEST +0 -44
  165. data/note/doap.xml +0 -28
  166. data/note/history/Rakefile-0.1 +0 -308
  167. data/sample/ProjectInfo +0 -96
  168. data/sample/Rakefile +0 -9
  169. data/sample/Reapfile +0 -11
  170. data/sample/task/demo.rb +0 -15
  171. data/setup.rb +0 -1568
  172. data/web/ProjectInfo.html +0 -75
  173. data/web/images/grape.jpg +0 -0
  174. data/web/index.html +0 -312
@@ -0,0 +1,603 @@
1
+ # = TITLE:
2
+ #
3
+ # Project
4
+ #
5
+ # = COPYING:
6
+ #
7
+ # Copyright (c) 2007 Tiger Ops
8
+ #
9
+ # This file is part of the ProUtils' Ratch program.
10
+ #
11
+ # Ratch is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # (at your option) any later version.
15
+ #
16
+ # Ratch is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with Ratch. If not, see <http://www.gnu.org/licenses/>.
23
+
24
+ require 'facets/dir/multiglob'
25
+ require 'reap/iobject'
26
+
27
+ module Reap
28
+
29
+ class Project
30
+
31
+ # = Project Metadata
32
+ #
33
+ # The Project Metadata class stores project information. This information includes
34
+ # the general information about a project, such as title, description, homepage, etc.
35
+ # which is essentially static. Once set, it will probably will never change.
36
+ # The class also contains default settings for packaging; information that is
37
+ # usually static, but may vary for a partciular package platform or format.
38
+ #
39
+ # When utilizing this class it is important not confuse oneself thinking that a
40
+ # project is not a project just becuase it is a sub-project. A sub-project is a
41
+ # project, it just happens to belong to a master project.
42
+
43
+ class Metadata < InfoObject
44
+
45
+ PROJECT_FILE = '{,meta/}{project}{info,}{.yaml,.yml,}'
46
+ VERSION_FILE = '{,meta/}{version}{.text,.txt,}'
47
+
48
+ #
49
+
50
+ def self.read(location)
51
+ metadata = read_project(location)
52
+ versdata = read_version(location)
53
+
54
+ data = {}
55
+ data.update(metadata)
56
+ data.update(versdata)
57
+
58
+ new(location, data)
59
+ end
60
+
61
+ # Parse release file for release information.
62
+
63
+ def self.read_project(location)
64
+ glob = File.join(location, PROJECT_FILE)
65
+ file = Dir.glob(glob, File::FNM_CASEFOLD).first
66
+ if file
67
+ YAML::load(File.open(file))
68
+ else
69
+ raise LoadError, "project file not found"
70
+ end
71
+ end
72
+
73
+ # Parse version file for current release information.
74
+
75
+ def self.read_version(location)
76
+ glob = File.join(location, VERSION_FILE)
77
+ file = Dir.glob(glob, File::FNM_CASEFOLD).first
78
+ if file
79
+ str = File.read(file)
80
+ version, status, date, *null = *str.strip.split(/\s+/)
81
+ date = Date.parse(date).strftime("%Y-%m-%d")
82
+ data = {'version' => version, 'status' => status, 'date' => date}
83
+ else
84
+ data = {}
85
+ end
86
+ return data
87
+ end
88
+
89
+ # New Project.
90
+
91
+ def initialize(location, data={})
92
+ @location = location
93
+ super(data)
94
+ end
95
+
96
+ # Location is needed to calculate some conventional defaults.
97
+
98
+ attr_accessor :location
99
+
100
+
101
+ # General
102
+ #------------------------------------------------------------------------
103
+
104
+ # The title of the project (free-form, defaults to name).
105
+ attr_accessor :title do
106
+ @title || (
107
+ name if respond_to?(:name)
108
+ )
109
+ end
110
+
111
+ # Subtitle is limited to 60 characters.
112
+ attr_accessor :subtitle do
113
+ @subtitle.to_s[0..59]
114
+ end
115
+
116
+ # Brief one-line description of the package (Max 80 chars.)
117
+ attr_accessor :summary, :brief do
118
+ if @summary
119
+ @summary.to_s[0..79]
120
+ else
121
+ i = @description.index('.') || 79
122
+ i = 79 if i > 79
123
+ @description[0..i]
124
+ end
125
+ end
126
+
127
+ # More detailed description of the package.
128
+ attr_accessor :description, :synopsis
129
+
130
+ # "Unix" name of this project.
131
+ attr_accessor :project, :name
132
+
133
+ # Overrides Project#name.
134
+ # TODO: Fit release name into name or package_name (?)
135
+ #def name
136
+ # @name ||= release.name
137
+ #end
138
+
139
+ # If this is a sub-project, then +master+ is the
140
+ # "Unix" name of the master project to which this
141
+ # sub-project belongs.
142
+ attr_accessor :master
143
+
144
+ # The date the project was started.
145
+ attr_accessor :created
146
+
147
+ # Copyright notice.
148
+ attr_accessor :copyright do
149
+ @copyright || "Copyright (c) #{Time.now.strftime('%Y')} #{author}"
150
+ end
151
+
152
+ # Distribution License.
153
+ attr_accessor :license do
154
+ @license || 'GPLv3'
155
+ end
156
+
157
+ # Slogan or "trademark" phrase.
158
+ attr_accessor :slogan
159
+
160
+ # General one-word software category.
161
+ attr_accessor :category
162
+
163
+ # Author(s) of this project.
164
+ # (Usually in "name <email>" format.)
165
+ attr_accessor :author
166
+
167
+ # Contact(s) (defaults to authors).
168
+ # TODO Move to Variants?
169
+ attr_accessor :contact do
170
+ @contact || author
171
+ end
172
+
173
+ # Gerneral email address.
174
+ attr_accessor :email do
175
+ if md = /<(.*?)>/.match(contact)
176
+ md[1]
177
+ else
178
+ "ruby-talk@ruby-lang.org"
179
+ end
180
+ end
181
+
182
+ # Official domain associated with this package.
183
+ attr_accessor :domain
184
+
185
+ # Project's homepage.
186
+ attr_accessor :homepage, :website
187
+
188
+ # Project's development site.
189
+ attr_accessor :development, :devsite
190
+
191
+ # Internet address(es) to online documentation.
192
+ attr_accessor :documentation, :docs
193
+
194
+ # Internet address(es) to downloadable packages.
195
+ attr_accessor :download
196
+
197
+ # Internet address for project wiki.
198
+ attr_accessor :wiki
199
+
200
+ # Project's mailing list.
201
+ attr_accessor :userlist, :mailinglist, :list
202
+
203
+ # Developer's mailing list.
204
+ attr_accessor :devlist do
205
+ @devlist || @userlist
206
+ end
207
+
208
+ # Returns a standard taguri id for the library and release.
209
+ def project_taguri
210
+ "tag:#{name}.#{domain},#{created}" # or released?
211
+ end
212
+
213
+
214
+ # Version
215
+ #------------------------------------------------------------------------
216
+
217
+ # Version number (eg. '1.0.0').
218
+ attr_accessor :version
219
+
220
+ # Current version code name.
221
+ attr_accessor :codename
222
+
223
+ # Build number can br set to an arbitrar number, or if set to true,
224
+ # it will defaults to a number based on current date-time.
225
+ attr_accessor :buildno do
226
+ @buildno = Time.now.strftime("%y%m%d%H%M") if TrueClass === @buildno
227
+ @buildno
228
+ end
229
+
230
+ # Status of this release: alpha, beta, RC1, etc.
231
+ attr_accessor :status do
232
+ @stats || 'alpha'
233
+ end
234
+
235
+ # Date of release.
236
+ attr_accessor :date, :released do
237
+ @date
238
+ end
239
+
240
+
241
+ # Content Classification
242
+ #------------------------------------------------------------------------
243
+
244
+ # Files in this package that are executables.
245
+ # These files must in the packages bin/ directory.
246
+ # If left blank all bin/ files are included.
247
+
248
+ attr_accessor :executable, :executables do
249
+ return [@executable].flatten.compact if @executable
250
+ exes = []
251
+ dir = File.join(location, 'bin')
252
+ if File.directory?(dir)
253
+ Dir.chdir(dir) do
254
+ exes = Dir.glob('*')
255
+ end
256
+ end
257
+ @executable = exes
258
+ end
259
+
260
+ # Library files in this package that are *public*.
261
+ # This is akin to load_path but specifies specific files
262
+ # that can be loaded from the outside --where as those
263
+ # not listed are considerd *private*.
264
+ #
265
+ # NOTE: This is not enforced --and may never be. It
266
+ # complicates library loading. Ie. how to distinguish public
267
+ # loading from external loading. But it something that can be
268
+ # consider more carfully in the future. For now it can serve
269
+ # as an optional reference.
270
+ attr_accessor :library, :libraries do
271
+ [@library || 'lib/**/*'].flatten
272
+ end
273
+
274
+ # Location(s) of executables.
275
+ attr_accessor :bin_path, :bin_paths, :binpath, :binpaths
276
+
277
+ # Location(s) of libraries (used by Rolls).
278
+ # In most cases this is something like:
279
+ #
280
+ # 'lib/myapp'
281
+ #
282
+ # It would be nice if this could just be lib/ as it would mean one less
283
+ # layer in a project heirarchy. But RubyGems and traditional installers
284
+ # could not handle this, so this isn't a reasonable course at this point.
285
+ attr_accessor :lib_path, :lib_paths, :libpath, :libpaths do
286
+ [@lib_path || "lib/#{name}"].flatten
287
+ end
288
+
289
+ # The traditional load path(s) (used by Ruby's own site loading and RubyGems).
290
+ # The default is lib/, which is usually correct.
291
+ attr_accessor :load_path, :load_paths, :loadpath, :loadpaths, :gem_path, :gem_paths, :gempath, :gempaths do
292
+ [@load_path || "lib"].flatten
293
+ end
294
+
295
+ # This only applys to Rolls. It is the default file to load.
296
+ # TODO: Think of a more descirptive name than 'default'.
297
+ attr_accessor :default
298
+
299
+
300
+ # Security
301
+ #------------------------------------------------------------------------
302
+
303
+ # Encryption digest type used.
304
+ # (md5, sha1, sha128, sha256, sha512).
305
+ attr_accessor :digest do
306
+ @digest || 'md5'
307
+ end
308
+
309
+ # Public key file associated with this library. This is useful
310
+ # for security purposes especially remote loading. [pubkey.pem]
311
+ attr_accessor :public_key do
312
+ @public_key || 'pubkey.pem'
313
+ end
314
+
315
+ # Private key file associated with this library. This is useful
316
+ # for security purposes especially remote loading. [_privkey.pem]
317
+ attr_accessor :private_key
318
+ # @private_key || '_privkey.pem'
319
+ # end
320
+
321
+
322
+ # Source Management
323
+ #------------------------------------------------------------------------
324
+
325
+ # Specify which verison control system is being used.
326
+ # Sometimes this is autmatically detectable, but it
327
+ # is better to specify it.
328
+
329
+ # Specifices the type of revision control system used.
330
+ # darcs, svn, cvs, etc.
331
+ # Will try to determine which version control system is being used.
332
+ attr_accessor :scm do
333
+ return @scm unless @scm.nil?
334
+ @scm = if File.directory?('.svn')
335
+ 'svn'
336
+ elsif File.directory?('_darcs')
337
+ 'darcs'
338
+ else
339
+ false
340
+ end
341
+ end
342
+
343
+ # Files that are tracked under revision control.
344
+ # Default is all less standard exceptions.
345
+ # '+' and '-' prefixes can be used to augment the list
346
+ # rather than fully override it.
347
+ attr_accessor :track, :scm_files
348
+
349
+ # Internet address to source code repository.
350
+ # (http://, ftp://, etc.)
351
+ attr_accessor :repository, :repo
352
+
353
+ # Changelog file.
354
+ attr_accessor :changelog
355
+
356
+ # Manifest file. Defaults to 'MANIFEST'.
357
+ # (I like to put it in meta/MANIFEST, personally.)
358
+ attr_accessor :manifest do
359
+ @manifest ||= 'MANIFEST'
360
+ end
361
+
362
+
363
+ # Dependencies
364
+ #------------------------------------------------------------------------
365
+ # Package inter-relationship data. Generally refered to as package
366
+ # "dependencies", but also includes +recommendations+, +suggestions+,
367
+ # +replacements+, +provisions+, and +build-dependencies+, as well
368
+ # as a few other fields that set a package apart.
369
+ #------------------------------------------------------------------------
370
+
371
+ # What other packages *must* this package have in order to function.
372
+ attr_accessor :dependency, :dependencies do
373
+ @dependency || []
374
+ end
375
+
376
+ # What other packages *should* be used with this package.
377
+ attr_accessor :recommend, :recommends, :recommendations do
378
+ @recommend || []
379
+ end
380
+
381
+ # What other packages *could* be useful with this package.
382
+ attr_accessor :suggest, :suggests, :suggestions do
383
+ @suggest || []
384
+ end
385
+
386
+ # What other packages does this package conflict.
387
+ attr_accessor :conflict, :conflicts do
388
+ @conflict || []
389
+ end
390
+
391
+ # What other packages does this package replace.
392
+ attr_accessor :replace, :replaces, :replacements do
393
+ @replace || []
394
+ end
395
+
396
+ # What other package(s) does this package provide the same dependency fulfilment.
397
+ # For example, a package 'bar-plus' might fulfill the same dependency criteria
398
+ # as package 'bar', so 'bar-plus' is said to provide 'bar'.
399
+ attr_accessor :provide, :provides, :provisions do
400
+ @provide || []
401
+ end
402
+
403
+ # Abirtary information about what might be needed to use this package.
404
+ # This is strictly information for the end-user to consider.
405
+ # Eg. "Fast graphics card"
406
+ attr_accessor :requirement, :requirements do
407
+ @requirement || []
408
+ end
409
+
410
+ # What packages does this package need to build? (eg. 'rake', 'reap', etc.)
411
+ attr_accessor :build_dependency, :build_dependencies do
412
+ @build_dependency || []
413
+ end
414
+
415
+ # Abirtary information about what might be needed to build this package.
416
+ attr_accessor :build_requirement, :build_requirements do
417
+ @build_requirement || []
418
+ end
419
+
420
+
421
+ # Packaging
422
+ #------------------------------------------------------------------------
423
+
424
+ # Package name. This defaults to project name, but it may vary under
425
+ # different package formats --deb vs. gem, for instance.
426
+ attr_accessor :package do
427
+ @package || name
428
+ #@package || (
429
+ # name if respond_to?(:name)
430
+ #)
431
+ end
432
+
433
+ # Platform. The default is nil, which is considered cross-platform.
434
+ # This tends to only change for special builds.
435
+ #
436
+ # TODO: if current?
437
+
438
+ attr_accessor :platform
439
+
440
+ # Architecture(s) this package can be run on: any, i386, i686, ppc, etc.
441
+ # This is strictly informational and is inteded to indicate the possiblities,
442
+ # not the particular platform this package runs on.
443
+
444
+ #attr_accessor :arch, :architecture do
445
+ # @arch || "any"
446
+ #end
447
+
448
+ # Script to run prior to build. No entry indicates no compilation.
449
+ attr_accessor :compile
450
+
451
+ # Packages that are intended to compile on install may need this. It is a list
452
+ # of "extension scripts" which generate Makefiles for use in compilation.
453
+ attr_accessor :extensions do
454
+ [@extensions || Dir.glob(File.join(location, 'ext/**/extconf.rb'))].flatten.compact
455
+ end
456
+
457
+ #
458
+ #validate "compile script not found" do
459
+ # compile ? File.file?(compile) : true
460
+ #end
461
+
462
+ # Generate documentation on installation?
463
+ attr_accessor :document, :has_rdoc
464
+
465
+ #
466
+ #attr_accessor :package_directory, :package_store do
467
+ # @package_directory || 'pkg'
468
+ #end
469
+
470
+ # Package name is generally in the form of +name-version+, or
471
+ # +name-version-platform+ if +platform+ is specified.
472
+ #
473
+ # TODO: Improve buildno support.
474
+
475
+ def package_name
476
+ if buildno
477
+ buildno = Time.now.strftime("%H*60+%M")
478
+ versnum = "#{version}.#{buildno}"
479
+ else
480
+ versnum = version
481
+ end
482
+
483
+ if platform
484
+ "#{package}-#{versnum}-#{platform}"
485
+ else
486
+ "#{package}-#{versnum}"
487
+ end
488
+ end
489
+
490
+ alias_method :stage_name, :package_name
491
+
492
+
493
+ # Distribution
494
+ #------------------------------------------------------------------------
495
+
496
+ # Files to be distributed in a package. Defaults to all files.
497
+ # If an entry is a directory then all it's contents are also included.
498
+ # This along with @exclude@ and @ignore@ is used to generate a manifest.
499
+ attr_accessor :distribute, :include do
500
+ [@distribute || '**/*'].flatten.compact
501
+ end
502
+
503
+ # File to exclude from package. This is usually more useful than
504
+ # @distribute@, as it allows you to remove from all files, rather then
505
+ # explicitly designate everything to be included. Exlcusions have priority
506
+ # over dsitribute's inclusions. If an entry is a directory then all
507
+ # it's contents are also excluded.
508
+ attr_accessor :exclude do
509
+ [@exclude].flatten.compact
510
+ end
511
+
512
+ # Files to generally ignore, mainly used for manifest collection. Ignore
513
+ # has priority over @exclude@ and @distribute@.
514
+ attr_accessor :ignore do
515
+ @ignore || %w{ **/.svn _darcs .config .installed }
516
+ end
517
+
518
+ # Manifest file.
519
+ #def manifest
520
+ # @manifest #||= Manifest.open
521
+ #end
522
+
523
+ # Set manifest file, which will load it.
524
+ #def manifest=(file)
525
+ # @manifest = file
526
+ # @filelist = File.read_list(file) #Manifest.open(file)
527
+ # return file
528
+ #end
529
+
530
+ # List of file included in a package. This is generated using
531
+ # @distribute@, @exlude@ and @ignore@.
532
+ def filelist
533
+ @filelist ||= collect_files(true)
534
+ end
535
+
536
+ # Validate that the files in the manifest actually exist.
537
+ #def validate_manifest
538
+ # missing = []
539
+ # filelist.each do |f|
540
+ # missing << f unless File.exist?(f)
541
+ # end
542
+ # unless missing.empty?
543
+ # raise ValidationError, "manifest lists non-existent files -- " + missing.join(" ")
544
+ # end
545
+ #end
546
+
547
+ private
548
+
549
+ # Collect distribution files.
550
+
551
+ def collect_files(with_dirs=false)
552
+ files = []
553
+
554
+ Dir.chdir(location) do
555
+ files += Dir.multiglob_r(*distribute)
556
+ files -= Dir.multiglob_r(*exclude)
557
+ files -= Dir.multiglob_r(*ignore)
558
+ files -= Dir.multiglob_r('pkg') #package_directory
559
+ end
560
+
561
+ files = files.to_a
562
+
563
+ unless with_dirs
564
+ files = files.select{ |f| !File.directory?(f) }
565
+ end
566
+
567
+ return files
568
+ end
569
+
570
+
571
+ # Validation
572
+ #------------------------------------------------------------------------
573
+
574
+ public
575
+
576
+ #
577
+ validate "version is required" do
578
+ version
579
+ end
580
+
581
+ #
582
+ validate "location is required" do
583
+ location
584
+ end
585
+
586
+ #
587
+ validate "executables do not exist" do
588
+ exes = []
589
+ dir = File.join(location, 'bin')
590
+ if File.directory?(dir)
591
+ Dir.chdir(dir) do
592
+ exes = Dir.glob('*')
593
+ end
594
+ end
595
+ (executables - exes).empty?
596
+ end
597
+
598
+ end
599
+
600
+ end
601
+
602
+ end
603
+