reap 9.3.5 → 9.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. data/CHANGES +10 -0
  2. data/MANIFEST +37 -21
  3. data/NOTES +13 -11
  4. data/bin/reap-announce +40 -2
  5. data/bin/reap-check-load +20 -2
  6. data/bin/reap-check-syntax +20 -2
  7. data/bin/reap-clean +24 -2
  8. data/bin/reap-clobber +17 -2
  9. data/bin/reap-doc +12 -2
  10. data/bin/reap-doc-rdoc +17 -2
  11. data/bin/reap-doc-ri +16 -2
  12. data/bin/reap-doc-spec +18 -0
  13. data/bin/reap-init +9 -0
  14. data/bin/reap-inspect +20 -2
  15. data/bin/reap-install +13 -2
  16. data/bin/reap-install-gem +14 -2
  17. data/bin/reap-log +15 -2
  18. data/bin/reap-log-changes +15 -2
  19. data/bin/reap-log-notes +20 -2
  20. data/bin/reap-make +16 -2
  21. data/bin/reap-make-clean +10 -2
  22. data/bin/reap-make-distclean +18 -2
  23. data/bin/reap-make-extconf +14 -2
  24. data/bin/reap-make-static +14 -2
  25. data/bin/reap-package +25 -2
  26. data/bin/reap-package-gem +14 -2
  27. data/bin/reap-package-tgz +14 -2
  28. data/bin/reap-package-zip +14 -2
  29. data/bin/reap-prepare +21 -2
  30. data/bin/reap-publish +25 -2
  31. data/bin/reap-release +22 -2
  32. data/bin/reap-rollout +32 -2
  33. data/bin/reap-scaffold +16 -2
  34. data/bin/reap-scm-branch +13 -2
  35. data/bin/reap-scm-tag +13 -2
  36. data/bin/reap-spec +14 -2
  37. data/bin/reap-stats +21 -2
  38. data/bin/reap-test +14 -2
  39. data/bin/reap-test-cross +23 -2
  40. data/bin/reap-test-load +17 -2
  41. data/bin/reap-test-solo +19 -2
  42. data/bin/reap-uninstall +14 -2
  43. data/bin/reap-uninstall-gem +17 -2
  44. data/bin/reap-version +10 -2
  45. data/lib/reap/announcement.rb +136 -0
  46. data/lib/reap/application.rb +3 -1
  47. data/lib/reap/default.yaml +12 -12
  48. data/lib/reap/defaults.rb +49 -0
  49. data/lib/reap/emailer.rb +189 -0
  50. data/lib/reap/extensions.rb +1 -2
  51. data/lib/reap/hosts.rb +4 -0
  52. data/lib/reap/hosts/host.rb +69 -0
  53. data/lib/reap/hosts/mailinglist.rb +83 -0
  54. data/lib/reap/{systems → hosts}/rubyforge.rb +72 -60
  55. data/lib/reap/hosts/rubytalk.rb +39 -0
  56. data/lib/reap/iobject.rb +5 -3
  57. data/lib/reap/metadata.rb +31 -4
  58. data/lib/reap/project.rb +101 -41
  59. data/lib/reap/project/announce.rb +50 -180
  60. data/lib/reap/project/check.rb +1 -1
  61. data/lib/reap/project/gem.rb +32 -68
  62. data/lib/reap/project/log.rb +12 -7
  63. data/lib/reap/project/make.rb +0 -1
  64. data/lib/reap/project/package.rb +228 -75
  65. data/lib/reap/project/rdoc.rb +9 -8
  66. data/lib/reap/project/release.rb +52 -6
  67. data/lib/reap/project/scm.rb +40 -25
  68. data/lib/reap/project/spec.rb +3 -3
  69. data/lib/reap/project/test.rb +1 -2
  70. data/lib/reap/project/version.rb +18 -4
  71. data/lib/reap/runmodes.rb +24 -0
  72. data/lib/reap/settings.rb +3 -14
  73. data/lib/reap/systems.rb +4 -0
  74. data/lib/reap/systems/git.rb +0 -0
  75. data/lib/reap/systems/hg.rb +0 -0
  76. data/lib/reap/systems/{subversion.rb → svn.rb} +47 -16
  77. data/lib/reap/systems/system.rb +53 -0
  78. data/lib/reap/tool.rb +38 -0
  79. data/lib/reap/utilities.rb +43 -86
  80. data/log/{Changelog.txt → changelog.rdoc} +56 -0
  81. data/log/fixme.rdoc +25 -0
  82. data/log/todo.rdoc +85 -0
  83. data/meta/project.yaml +13 -2
  84. data/meta/version +1 -0
  85. data/setup.rb +74 -64
  86. data/task/allshare.rb +109 -0
  87. data/task/clean +13 -0
  88. data/task/compile +28 -0
  89. data/task/configure +372 -0
  90. data/task/install +1481 -0
  91. data/test/case/test_init.rb +32 -0
  92. data/test/case/test_scaffold.rb +32 -0
  93. data/test/data/scaffold/meta/project.yaml +28 -0
  94. data/test/lib/case_testable.rb +23 -0
  95. metadata +64 -31
  96. data/bin/reap-spec-doc +0 -8
  97. data/demo/README +0 -15
  98. data/demo/lib/foo/foo.rb +0 -7
  99. data/demo/meta/VERSION +0 -1
  100. data/demo/meta/project.yaml +0 -21
  101. data/lib/reap/project/rubyforge.rb +0 -71
  102. data/lib/reap/project/svn.rb +0 -76
  103. data/log/Fixme.txt +0 -22
  104. data/log/Todo.txt +0 -84
  105. data/meta/VERSION +0 -1
@@ -58,7 +58,7 @@ module Reap
58
58
  # This takes one option +:scripts+ which is a glob or list of globs
59
59
  # of the scripts to check. By default this is all scripts in the libpath(s).
60
60
  #
61
- # FIXME: This isn't routing output to dev/null as expected.
61
+ # FIXME: This isn't routing output to dev/null as expected ?
62
62
 
63
63
  def check_load(options=nil)
64
64
  options = configure_options(options, 'check-load', 'check')
@@ -1,3 +1,5 @@
1
+ #require 'facets/project/package'
2
+
1
3
  module Reap
2
4
 
3
5
  class Project
@@ -19,59 +21,7 @@ module Reap
19
21
  # TODO: Should this use staging too, like zip/tgz?
20
22
 
21
23
  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
- options = configure_options(options, 'package-gem', 'package')
30
-
31
- prepare(options)
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
24
+ return package_gem(options=nil)
75
25
  end
76
26
 
77
27
  # Install gem package, creating the package if not already created.
@@ -120,8 +70,7 @@ module Reap
120
70
  spec.rubyforge_project = rubyforge_project
121
71
  spec.homepage = package.homepage
122
72
 
123
- # Platform: ruby, mswin32, i586-linux, powerpc-darwin, current
124
- spec.platform = 'ruby' # TODO current support!
73
+ spec.platform = package.platform #'ruby'
125
74
 
126
75
  spec.require_paths = [package.loadpath].flatten
127
76
 
@@ -133,34 +82,49 @@ module Reap
133
82
  spec.executables = package.executables
134
83
  spec.requirements = package.requirements
135
84
 
136
- # TODO: Looks like there is no choice but to auto-rdoc gem install.
137
- spec.has_rdoc = !(FalseClass===package.document)
138
-
139
85
  if package.dependencies
140
86
  package.dependencies.each do |d,v|
141
87
  spec.add_dependency(*[d,v].compact)
142
88
  end
143
89
  end
144
90
 
145
- spec.extensions = package.compile
91
+ spec.extensions = [package.extensions].flatten.compact
92
+
93
+ # rdocs (argh!)
94
+
95
+ readme = Dir.glob('README{,.txt}', File::FNM_CASEFOLD).first
96
+
97
+ spec.has_rdoc = package.autodoc # Make true always?
98
+
99
+ rdocfiles = []
100
+ rdocfiles << readme if readme
101
+ rdocfiles.concat(Dir['[A-Z]*'] || []) # package.document
102
+ rdocfiles.uniq!
103
+ spec.extra_rdoc_files = rdocfiles
104
+
105
+ rdoc_options = ['--inline-source']
106
+ rdoc_options.concat ["--title", package.title] if package.title
107
+ rdoc_options.concat ["--main", readme] if readme
108
+ spec.rdoc_options = rdoc_options
146
109
 
147
110
  spec.files = distribute
148
111
 
149
- spec.test_files = distribute.select{ |f| f =~ /^test\// } # TODO make test_files configurable
112
+ # TODO make test_files configurable (?)
113
+ spec.test_files = distribute.select{ |f| f =~ /^test\// }
150
114
  end
151
115
  end
152
116
 
153
117
  # Report that a package has been built.
154
118
  # FIXME
155
119
 
156
- def report_package_built(type, file)
157
- r = ''
158
- r << "\n Successfully built #{type}"
159
- r << "\n Name: #{package.name}"
160
- r << "\n Version: #{package.version}"
161
- r << "\n File: #{File.basename(file)}"
162
- say r
163
- end
120
+ #def report_package_built(type, file)
121
+ # r = ''
122
+ # r << "\n Successfully built #{type}"
123
+ # r << "\n Name: #{package.name}"
124
+ # r << "\n Version: #{package.version}"
125
+ # r << "\n File: #{File.basename(file)}"
126
+ # say r
127
+ #end
164
128
 
165
129
  end
166
130
  end
@@ -53,9 +53,11 @@ module Reap
53
53
  if records.empty?
54
54
  puts "No #{labels.join(', ')} notes."
55
55
  else
56
- log_notes_save(output, notes, labels)
56
+ files_saved = log_notes_save(output, notes, labels)
57
+ files_saved.each do |file|
58
+ puts "Updated #{file}"
59
+ end
57
60
  puts counts.collect{|l,n| "#{n} #{l}s"}.join(', ')
58
- puts "Notes saved in #{output} folder."
59
61
  end
60
62
  end
61
63
 
@@ -115,7 +117,7 @@ module Reap
115
117
  if last_file != record['file']
116
118
  out << "\n"
117
119
  last_file = record['file']
118
- out << "file://#{record['file']}\n"
120
+ out << "== file://#{record['file']}\n"
119
121
  end
120
122
  out << "* #{record['note'].rstrip} (#{record['line']})\n"
121
123
  end
@@ -127,6 +129,7 @@ module Reap
127
129
  # Save notes.
128
130
 
129
131
  def log_notes_save(dir, notes, labels)
132
+ files_saved = []
130
133
  mkdir_p(dir)
131
134
  # Remove empty note files.
132
135
  (labels - notes.keys).each do |label|
@@ -135,22 +138,24 @@ module Reap
135
138
  end
136
139
  # Create note files.
137
140
  notes.each do |label, note|
138
- file = apply_naming_policy(label, 'txt')
141
+ file = apply_naming_policy(label, 'rdoc')
139
142
  file = File.join(dir,file)
140
143
  if dryrun?
141
144
  puts "write #{file}"
142
145
  else
143
- File.open(file,'w') do |f| f << note end
146
+ files_saved << file
147
+ File.open(file,'w') do |f| f << note end
144
148
  end
145
149
  end
150
+ return files_saved
146
151
  end
147
152
 
148
153
  #
149
154
 
150
155
  def naming_policy
151
156
  @naming_policy ||= (
152
- logconfig = configuration['log'] || {}
153
- policy = logconfig['policy'] || ['cap', 'ext']
157
+ logconfig = settings['log'] || {}
158
+ policy = logconfig['policy'] || ['down', 'ext']
154
159
  list_option(policy)
155
160
  )
156
161
  end
@@ -27,7 +27,6 @@ module Reap
27
27
  @extensions ||= Dir['ext/**/*.c'].collect{ |file| File.dirname(file) }.uniq
28
28
  end
29
29
 
30
-
31
30
  # Compile extensions.
32
31
 
33
32
  def make
@@ -1,9 +1,25 @@
1
1
  require 'reap/project/gem'
2
+ require 'facets/platform'
3
+ #require 'facets/kernel/silence'
2
4
 
3
5
  module Reap
4
6
 
5
7
  class Project
6
8
 
9
+ PACKAGE_STORE = 'pkg'
10
+
11
+ # Returns the package storage directory (now constant 'pkg').
12
+
13
+ def package_store
14
+ PACKAGE_STORE
15
+ end
16
+
17
+ # Current platform.
18
+
19
+ def current_platform
20
+ Platform.local.to_s
21
+ end
22
+
7
23
  # Remove packages.
8
24
 
9
25
  def clobber_packages(options=nil)
@@ -19,7 +35,7 @@ module Reap
19
35
  end
20
36
  end
21
37
 
22
- # Prepare for packaging (clean, distclean, stamp).
38
+ # Prepare for packaging (clean, distclean, version stamp).
23
39
  #
24
40
  # TODO: When we add support for binary packages distclean
25
41
  # should not be done for them.
@@ -38,62 +54,99 @@ module Reap
38
54
  def package(options=nil)
39
55
  packopts = configure_options(options, 'package')
40
56
 
41
- formats = packopts['formats'] || ['zip']
57
+ formats = packopts['formats'] || ['gem', 'tgz']
42
58
  formats = [formats].flatten
43
59
 
44
60
  prepare(options)
45
61
 
46
62
  puts unless dryrun?
63
+
47
64
  formats.each do |format|
48
65
  send("package_#{format}", options)
49
- puts unless dryrun?
66
+ #puts unless dryrun?
50
67
  end
51
68
  end
52
69
 
53
- # Routes to $gem_package.
70
+ # Routes to #gem_package.
54
71
 
55
72
  def package_gem(options=nil)
56
- gem_package(options)
57
- end
58
-
59
- # Create a Tar'd Gzip package.
60
-
61
- def package_tgz(options=nil)
62
- options = configure_options(options, 'package-tgz', 'package')
63
-
64
- prepare(options)
73
+ begin
74
+ require 'rubygems/specification'
75
+ Gem::manage_gems
76
+ rescue LoadError
77
+ #raise LoadError, "RubyGems is not installed?"
78
+ end
65
79
 
66
- package = metadata.clone
67
- package.update(options)
80
+ options = configure_options(options, 'package-gem', 'package')
81
+ extension = '.gem'
82
+
83
+ platform = options.delete('platform') || 'none'
84
+
85
+ platforms = []
86
+ platforms << nil if platform != 'only'
87
+ platforms << 'current' if platform != 'none'
88
+
89
+ platforms.each do |pl|
90
+ options['platform'] = pl
91
+ fname, metadata = package_prepare_stage(extension, options)
92
+ next unless fname # if already built
93
+ stage = File.join(package_store, fname)
94
+ if dryrun?
95
+ status "gem build #{stage}"
96
+ else
97
+ file = nil
98
+ cd(stage) do
99
+ #status "vi #{metadata.name}.gemspec"
100
+ builder = ::Gem::Builder.new(gemspec(metadata))
101
+ status "gem build #{stage}"
102
+ unless dryrun?
103
+ file = builder.build
104
+ file = File.expand_path(file)
105
+ end
106
+ end
107
+ # transfer gem package to package store
108
+ mkdir_p(package_store)
109
+ destination = File.join(package_store, File.basename(file))
110
+ mv(file, package_store) unless File.expand_path(file) == File.expand_path(destination)
111
+ puts
112
+ end
113
+ end
114
+ end
68
115
 
69
- abort "No name" unless package.name
70
- abort "No version" unless package.version
116
+ # Create a Gem package.
117
+ #
118
+ # TODO: Should this use staging too, like zip/tgz?
71
119
 
72
- store = 'pkg' #package.package_directory
73
- fname = package.stage_name
74
- files = package.filelist
120
+ #def gem_package(options=nil)
121
+ #end
75
122
 
76
- stage = File.join(store, fname)
77
- pfile = stage + ".tgz"
78
123
 
79
- unless out_of_date?(pfile, *files) or force?
80
- report_package_already_built(pfile)
81
- return
82
- end
124
+ # Create a Tar'd Gzip package.
83
125
 
84
- rm_r(stage) if File.exist?(stage) # remove old stage
85
- stage(stage, files) # make new stage
86
- package_manifest(stage) # generate stage manifest
126
+ def package_tgz(options=nil)
127
+ options = configure_options(options, 'package-tgz', 'package')
87
128
 
88
- if dryrun?
89
- status "tar -cxf #{fname}.tgz"
90
- else
91
- file = nil
92
- cd(store) do
93
- file = tgz(fname) # FIXME: Prefer .tgz as extensions.
129
+ platform = options.delete('platform') || 'none'
130
+ extension = '.tgz'
131
+
132
+ platforms = []
133
+ platforms << nil if platform != 'only'
134
+ platforms << current_platform if platform != 'none'
135
+
136
+ platforms.each do |pl|
137
+ options['platform'] = pl
138
+ fname, metadata = package_prepare_stage(extension, options)
139
+ next unless fname # if already built
140
+ if dryrun?
141
+ status "tar -cxf #{fname}.tgz"
142
+ else
143
+ file = nil
144
+ cd(package_store) do
145
+ file = compress(:tgz, fname)
146
+ end
147
+ transfer(file, package_store)
148
+ report_package_built(file)
94
149
  end
95
- transfer(file, store)
96
- report_package_built(file)
97
150
  end
98
151
  end
99
152
 
@@ -102,59 +155,91 @@ module Reap
102
155
  def package_zip(options=nil)
103
156
  options = configure_options(options, 'package-zip', 'package')
104
157
 
105
- prepare(options)
158
+ platform = options.delete('platform') || 'none'
159
+ extension = '.zip'
160
+
161
+ platforms = []
162
+ platforms << nil if platform != 'only'
163
+ platforms << current_platform if platform != 'none'
164
+
165
+ platforms.each do |pl|
166
+ options['platform'] = pl
167
+ fname, metadata = package_prepare_stage(extension, options)
168
+ next unless fname # if already built
169
+ if dryrun?
170
+ status "zip -r #{fname}.zip ."
171
+ else
172
+ file = nil
173
+ cd(package_store) do
174
+ file = compress(:zip, fname)
175
+ end
176
+ transfer(file, package_store)
177
+ report_package_built(file)
178
+ end
179
+ end
180
+ end
106
181
 
107
- package = metadata.clone
108
- package.update(options)
182
+ # Create off-line documentation package.
183
+ #
184
+ # FIXME: package_docs is not yet ready for use.
185
+ #
186
+ #def package_docs(options=nil)
187
+ # options = configure_options(options, 'package-doc')
188
+ #
189
+ # dir = options['dir'] || 'doc'
190
+ # name = options['name'] || metadata.name
191
+ # ver = options['version'] || metadata.version
192
+ #
193
+ # cd(dir) do
194
+ # zip "-czhvf #{name}-docs-#{ver}.zip *"
195
+ # end
196
+ #end
109
197
 
110
- abort "No name" unless package.name
111
- abort "No version" unless package.version
198
+ private
112
199
 
113
- store = 'pkg' #package.package_directory
114
- fname = package.stage_name
115
- files = package.filelist
200
+ #
116
201
 
117
- stage = File.join(store, fname)
118
- pfile = stage + ".zip"
202
+ def package_prepare_stage(extension, options)
203
+ prepare(options)
119
204
 
120
- unless out_of_date?(pfile, *files) or force?
121
- report_package_already_built(pfile)
122
- return
123
- end
205
+ metadata = metadata().clone
206
+ metadata.update(options)
124
207
 
125
- rm_r(stage) if File.exist?(stage) # remove old stage
126
- stage(stage, files) # make new stage
127
- package_manifest(stage) # generate manifest
208
+ abort "No name" unless metadata.name
209
+ abort "No version" unless metadata.version
128
210
 
129
- if dryrun?
130
- status "zip -r #{fname}.zip ."
131
- else
132
- file = nil
133
- cd(store) do
134
- file = zip(fname)
211
+ fname = metadata.stage_name
212
+
213
+ if compiles?
214
+ streams = verbose? ? [] : [STDOUT, STDERR]
215
+ silence_stream(*streams) do
216
+ make_distclean
217
+ # If platform package then pre-compile
218
+ if options['platform']
219
+ make
220
+ end
135
221
  end
136
- transfer(file, store)
137
- report_package_built(file)
138
222
  end
139
- end
140
223
 
141
- # Create off-line documentation package.
142
- #
143
- # FIXME: package_docs is not yet ready for use.
224
+ stage = File.join(package_store, fname)
144
225
 
145
- def package_docs(options=nil)
146
- options = configure_options(options, 'package-doc')
226
+ pfile = stage + extension #".tgz"
147
227
 
148
- dir = options['dir'] || 'doc'
149
- name = options['name'] || metadata.name
150
- ver = options['version'] || metadata.version
228
+ files = metadata.filelist
151
229
 
152
- cd(dir) do
153
- zip "-czhvf #{name}-docs-#{ver}.zip *"
230
+ unless out_of_date?(pfile, *files) or force?
231
+ report_package_already_built(pfile)
232
+ return nil, metadata
154
233
  end
155
- end
156
234
 
157
- private
235
+ rm_r(stage) if File.exist?(stage) # remove old stage
236
+
237
+ stage(stage, files) # make new stage
238
+
239
+ package_manifest(stage) # generate stage manifest
240
+
241
+ return fname, metadata
242
+ end
158
243
 
159
244
  # Transfer package file to storage location.
160
245
 
@@ -191,6 +276,7 @@ module Reap
191
276
  puts " Name: #{name}"
192
277
  puts " Version: #{vers}"
193
278
  puts " File: #{file}"
279
+ puts
194
280
  end
195
281
 
196
282
  # Report that a package has been built.
@@ -203,6 +289,7 @@ module Reap
203
289
  vers = file[file.rindex('-')+1..-1].chomp(type)
204
290
 
205
291
  puts " Package #{file} is already current."
292
+ puts
206
293
  #puts " Name: #{name}"
207
294
  #puts " Version: #{vers}"
208
295
  #puts " File: #{file}"
@@ -246,3 +333,69 @@ end
246
333
  # def report_packaging_complete(size)
247
334
  # say "\nSuccessfully built #{size} packages at #{store}/."
248
335
  # end
336
+
337
+
338
+ =begin
339
+ prepare(options)
340
+
341
+ package = metadata.clone
342
+ package.update(options)
343
+
344
+ abort "No name" unless package.name
345
+ abort "No version" unless package.version
346
+
347
+ fname = package.stage_name
348
+ files = package.filelist
349
+
350
+ stage = File.join(package_store, fname)
351
+ pfile = stage + ".zip"
352
+
353
+ unless out_of_date?(pfile, *files) or force?
354
+ report_package_already_built(pfile)
355
+ return
356
+ end
357
+
358
+ rm_r(stage) if File.exist?(stage) # remove old stage
359
+ stage(stage, files) # make new stage
360
+ package_manifest(stage) # generate manifest
361
+
362
+ if dryrun?
363
+ status "zip -r #{fname}.zip ."
364
+ else
365
+ file = nil
366
+ cd(package_store) do
367
+ file = zip(fname)
368
+ end
369
+ transfer(file, package_store)
370
+ report_package_built(file)
371
+ end
372
+ =end
373
+
374
+ =begin
375
+ prepare(options)
376
+
377
+ package = metadata.clone
378
+ package.update(options)
379
+
380
+ abort "No name" unless package.name
381
+ abort "No version" unless package.version
382
+
383
+ store = 'pkg' #package.package_directory
384
+ fname = package.stage_name
385
+ files = package.filelist
386
+
387
+ stage = File.join(store, fname)
388
+
389
+ pfile = stage + ".tgz"
390
+
391
+ unless out_of_date?(pfile, *files) or force?
392
+ report_package_already_built(pfile)
393
+ return
394
+ end
395
+
396
+ rm_r(stage) if File.exist?(stage) # remove old stage
397
+ stage(stage, files) # make new stage
398
+
399
+ package_manifest(stage) # generate stage manifest
400
+ =end
401
+