reap 4.0 → 4.3.1
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/ProjectInfo +18 -6
- data/lib/reap/bin/reap.rb +47 -16
- data/lib/reap/interface/interface.rb +0 -0
- data/lib/reap/interface/rubyforge.rb +247 -0
- data/lib/reap/lint.rb +1 -0
- data/lib/reap/projectinfo.rb +47 -18
- data/lib/reap/reap.rb +0 -0
- data/lib/reap/task/announce.rb +11 -13
- data/lib/reap/task/fileperm.rb +2 -5
- data/lib/reap/task/info.rb +2 -4
- data/lib/reap/task/install.rb +1 -3
- data/lib/reap/task/noop.rb +1 -3
- data/lib/reap/task/package.rb +163 -65
- data/lib/reap/task/publish.rb +2 -4
- data/lib/reap/task/rdoc.rb +1 -3
- data/lib/reap/task/release.rb +273 -0
- data/lib/reap/task/test.rb +19 -5
- data/lib/reap/task/testext.rb +5 -5
- data/lib/reap/task.rb +94 -69
- metadata +70 -256
- data/dev/Rakefile +0 -60
- data/dev/composite_task.rb +0 -27
- data/dev/compositepublisher.rb +0 -24
- data/dev/ftptools.rb +0 -139
- data/dev/license-each.rb +0 -85
- data/dev/publisher.rb +0 -75
- data/dev/rubyforgepublisher.rb +0 -18
- data/dev/sshpublisher.rb +0 -47
- data/dev/suby-cvs.rb +0 -46
- data/dev/template.rb +0 -72
- data/lib/reap/readymade.rb +0 -21
- data/lib/reap/task/webpublish.rb +0 -43
- data/lib/reap/tasks.rb +0 -13
- data/lib/reap/test.rb +0 -138
- data/web/ProjectInfo +0 -57
- data/web/images/appleboy.jpg +0 -0
- data/web/images/grape.jpg +0 -0
- data/web/index.html +0 -124
- data/web/rdoc/classes/Object.html +0 -121
- data/web/rdoc/classes/ProjectInfo.html +0 -207
- data/web/rdoc/classes/ProjectInfo.src/M000094.html +0 -18
- data/web/rdoc/classes/ProjectInfo.src/M000095.html +0 -24
- data/web/rdoc/classes/ProjectInfo.src/M000096.html +0 -22
- data/web/rdoc/classes/ProjectInfo.src/M000097.html +0 -21
- data/web/rdoc/classes/ProjectInfo.src/M000098.html +0 -18
- data/web/rdoc/classes/Reap/Announce.html +0 -262
- data/web/rdoc/classes/Reap/Announce.src/M000030.html +0 -18
- data/web/rdoc/classes/Reap/Announce.src/M000031.html +0 -114
- data/web/rdoc/classes/Reap/Announce.src/M000032.html +0 -46
- data/web/rdoc/classes/Reap/Info.html +0 -176
- data/web/rdoc/classes/Reap/Info.src/M000033.html +0 -18
- data/web/rdoc/classes/Reap/Info.src/M000034.html +0 -17
- data/web/rdoc/classes/Reap/Info.src/M000035.html +0 -18
- data/web/rdoc/classes/Reap/Install.html +0 -193
- data/web/rdoc/classes/Reap/Install.src/M000036.html +0 -18
- data/web/rdoc/classes/Reap/Install.src/M000037.html +0 -20
- data/web/rdoc/classes/Reap/Install.src/M000038.html +0 -26
- data/web/rdoc/classes/Reap/Noop.html +0 -192
- data/web/rdoc/classes/Reap/Noop.src/M000027.html +0 -18
- data/web/rdoc/classes/Reap/Noop.src/M000028.html +0 -17
- data/web/rdoc/classes/Reap/Noop.src/M000029.html +0 -18
- data/web/rdoc/classes/Reap/Package.html +0 -310
- data/web/rdoc/classes/Reap/Package.src/M000055.html +0 -18
- data/web/rdoc/classes/Reap/Package.src/M000056.html +0 -68
- data/web/rdoc/classes/Reap/Package.src/M000057.html +0 -84
- data/web/rdoc/classes/Reap/Package.src/M000058.html +0 -61
- data/web/rdoc/classes/Reap/Perm.html +0 -236
- data/web/rdoc/classes/Reap/Perm.src/M000078.html +0 -18
- data/web/rdoc/classes/Reap/Perm.src/M000079.html +0 -21
- data/web/rdoc/classes/Reap/Perm.src/M000080.html +0 -42
- data/web/rdoc/classes/Reap/Perm.src/M000081.html +0 -26
- data/web/rdoc/classes/Reap/Perm.src/M000082.html +0 -18
- data/web/rdoc/classes/Reap/Publish.html +0 -213
- data/web/rdoc/classes/Reap/Publish.src/M000070.html +0 -18
- data/web/rdoc/classes/Reap/Publish.src/M000071.html +0 -22
- data/web/rdoc/classes/Reap/Publish.src/M000072.html +0 -37
- data/web/rdoc/classes/Reap/RDoc.html +0 -218
- data/web/rdoc/classes/Reap/RDoc.src/M000059.html +0 -18
- data/web/rdoc/classes/Reap/RDoc.src/M000060.html +0 -24
- data/web/rdoc/classes/Reap/RDoc.src/M000061.html +0 -70
- data/web/rdoc/classes/Reap/Task.html +0 -396
- data/web/rdoc/classes/Reap/Task.src/M000039.html +0 -18
- data/web/rdoc/classes/Reap/Task.src/M000040.html +0 -16
- data/web/rdoc/classes/Reap/Task.src/M000041.html +0 -16
- data/web/rdoc/classes/Reap/Task.src/M000042.html +0 -16
- data/web/rdoc/classes/Reap/Task.src/M000043.html +0 -16
- data/web/rdoc/classes/Reap/Task.src/M000044.html +0 -22
- data/web/rdoc/classes/Reap/Task.src/M000045.html +0 -16
- data/web/rdoc/classes/Reap/Task.src/M000046.html +0 -16
- data/web/rdoc/classes/Reap/Task.src/M000047.html +0 -16
- data/web/rdoc/classes/Reap/Task.src/M000048.html +0 -16
- data/web/rdoc/classes/Reap/Task.src/M000049.html +0 -16
- data/web/rdoc/classes/Reap/Task.src/M000050.html +0 -27
- data/web/rdoc/classes/Reap/Task.src/M000051.html +0 -19
- data/web/rdoc/classes/Reap/Task.src/M000052.html +0 -18
- data/web/rdoc/classes/Reap/Task.src/M000053.html +0 -18
- data/web/rdoc/classes/Reap/Task.src/M000054.html +0 -19
- data/web/rdoc/classes/Reap/Test/TestResults.html +0 -205
- data/web/rdoc/classes/Reap/Test/TestResults.src/M000067.html +0 -21
- data/web/rdoc/classes/Reap/Test/TestResults.src/M000068.html +0 -21
- data/web/rdoc/classes/Reap/Test/TestResults.src/M000069.html +0 -23
- data/web/rdoc/classes/Reap/Test.html +0 -253
- data/web/rdoc/classes/Reap/Test.src/M000062.html +0 -18
- data/web/rdoc/classes/Reap/Test.src/M000063.html +0 -26
- data/web/rdoc/classes/Reap/Test.src/M000064.html +0 -77
- data/web/rdoc/classes/Reap/Test.src/M000065.html +0 -27
- data/web/rdoc/classes/Reap/Test.src/M000066.html +0 -50
- data/web/rdoc/classes/Reap/TestExt.html +0 -234
- data/web/rdoc/classes/Reap/TestExt.src/M000073.html +0 -18
- data/web/rdoc/classes/Reap/TestExt.src/M000074.html +0 -20
- data/web/rdoc/classes/Reap/TestExt.src/M000075.html +0 -49
- data/web/rdoc/classes/Reap/TestExt.src/M000076.html +0 -34
- data/web/rdoc/classes/Reap/TestExt.src/M000077.html +0 -27
- data/web/rdoc/classes/Reap/WebPublish.html +0 -213
- data/web/rdoc/classes/Reap/WebPublish.src/M000083.html +0 -18
- data/web/rdoc/classes/Reap/WebPublish.src/M000084.html +0 -21
- data/web/rdoc/classes/Reap/WebPublish.src/M000085.html +0 -32
- data/web/rdoc/classes/Reap.html +0 -248
- data/web/rdoc/classes/Reap.src/M000023.html +0 -16
- data/web/rdoc/classes/Reap.src/M000024.html +0 -21
- data/web/rdoc/classes/Reap.src/M000025.html +0 -16
- data/web/rdoc/classes/Reap.src/M000026.html +0 -21
- data/web/rdoc/classes/ReapCommand.html +0 -425
- data/web/rdoc/classes/ReapCommand.src/M000001.html +0 -16
- data/web/rdoc/classes/ReapCommand.src/M000003.html +0 -16
- data/web/rdoc/classes/ReapCommand.src/M000005.html +0 -16
- data/web/rdoc/classes/ReapCommand.src/M000007.html +0 -16
- data/web/rdoc/classes/ReapCommand.src/M000009.html +0 -16
- data/web/rdoc/classes/ReapCommand.src/M000011.html +0 -16
- data/web/rdoc/classes/ReapCommand.src/M000013.html +0 -18
- data/web/rdoc/classes/ReapCommand.src/M000014.html +0 -19
- data/web/rdoc/classes/ReapCommand.src/M000015.html +0 -19
- data/web/rdoc/classes/ReapCommand.src/M000016.html +0 -24
- data/web/rdoc/classes/ReapCommand.src/M000018.html +0 -29
- data/web/rdoc/classes/Scaffold.html +0 -211
- data/web/rdoc/classes/Scaffold.src/M000086.html +0 -16
- data/web/rdoc/classes/Scaffold.src/M000087.html +0 -28
- data/web/rdoc/classes/Scaffold.src/M000088.html +0 -32
- data/web/rdoc/classes/Scaffold.src/M000089.html +0 -18
- data/web/rdoc/classes/UnitTestKernel.html +0 -176
- data/web/rdoc/classes/UnitTestKernel.src/M000019.html +0 -18
- data/web/rdoc/classes/UnitTestKernel.src/M000020.html +0 -18
- data/web/rdoc/classes/UnitTestKernel.src/M000021.html +0 -22
- data/web/rdoc/classes/UnitTestKernel.src/M000022.html +0 -22
- data/web/rdoc/classes/UnitTesting/Failure.html +0 -156
- data/web/rdoc/classes/UnitTesting/Failure.src/M000092.html +0 -18
- data/web/rdoc/classes/UnitTesting/Failure.src/M000093.html +0 -21
- data/web/rdoc/classes/UnitTesting.html +0 -165
- data/web/rdoc/classes/UnitTesting.src/M000090.html +0 -34
- data/web/rdoc/classes/UnitTesting.src/M000091.html +0 -18
- data/web/rdoc/created.rid +0 -1
- data/web/rdoc/files/ANN.html +0 -107
- data/web/rdoc/files/COPYING.html +0 -119
- data/web/rdoc/files/ChangeLog.html +0 -144
- data/web/rdoc/files/ProjectInfo.html +0 -190
- data/web/rdoc/files/README.html +0 -274
- data/web/rdoc/files/Rakefile.html +0 -101
- data/web/rdoc/files/lib/reap/bin/reap_rb.html +0 -129
- data/web/rdoc/files/lib/reap/lint_rb.html +0 -101
- data/web/rdoc/files/lib/reap/projectinfo_rb.html +0 -110
- data/web/rdoc/files/lib/reap/readymade_rb.html +0 -123
- data/web/rdoc/files/lib/reap/task/announce_rb.html +0 -114
- data/web/rdoc/files/lib/reap/task/fileperm_rb.html +0 -108
- data/web/rdoc/files/lib/reap/task/info_rb.html +0 -108
- data/web/rdoc/files/lib/reap/task/install_rb.html +0 -108
- data/web/rdoc/files/lib/reap/task/noop_rb.html +0 -108
- data/web/rdoc/files/lib/reap/task/package_rb.html +0 -109
- data/web/rdoc/files/lib/reap/task/publish_rb.html +0 -108
- data/web/rdoc/files/lib/reap/task/rdoc_rb.html +0 -108
- data/web/rdoc/files/lib/reap/task/scaffold_rb.html +0 -107
- data/web/rdoc/files/lib/reap/task/test_rb.html +0 -110
- data/web/rdoc/files/lib/reap/task/testext_rb.html +0 -109
- data/web/rdoc/files/lib/reap/task/webpublish_rb.html +0 -108
- data/web/rdoc/files/lib/reap/task_rb.html +0 -120
- data/web/rdoc/files/lib/reap/tasks_rb.html +0 -116
- data/web/rdoc/files/lib/reap/test_rb.html +0 -109
- data/web/rdoc/fr_class_index.html +0 -47
- data/web/rdoc/fr_file_index.html +0 -51
- data/web/rdoc/fr_method_index.html +0 -124
- data/web/rdoc/index.html +0 -24
- data/web/rdoc/rdoc-style.css +0 -208
data/lib/reap/task/package.rb
CHANGED
|
@@ -3,7 +3,7 @@ require 'reap/task'
|
|
|
3
3
|
|
|
4
4
|
begin
|
|
5
5
|
require 'rubygems'
|
|
6
|
-
rescue
|
|
6
|
+
rescue LoadError
|
|
7
7
|
# no rubygems
|
|
8
8
|
end
|
|
9
9
|
|
|
@@ -15,90 +15,115 @@ end
|
|
|
15
15
|
#
|
|
16
16
|
class Reap::Package < Reap::Task
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
task_desc do
|
|
19
|
+
disttypes = $PROJECT_INFO['distribute'] || [ 'gem', 'tar.bz2', 'zip' ]
|
|
20
|
+
"Build distribution packages (#{disttypes.join(', ')})."
|
|
21
|
+
end
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
MUST_EXCLUDE = [ 'InstalledFiles', '**/CVS/**/*', '**/*~', 'dist', 'pkg' ]
|
|
24
|
+
LOCATIONS = [ '../leaf', '../dist', '../pkg', 'dist', 'pkg' ]
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
attr_master :name, :version, :date, :series, :status,
|
|
27
|
+
:author, :maintainer, :email, :homepage,
|
|
28
|
+
:summary, :description,
|
|
29
|
+
:dependencies, :executables, :requirements, :architecture,
|
|
30
|
+
:category, :recommends
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
end
|
|
32
|
+
attr_accessor :dir, :project, :exclude, :include, :format,
|
|
33
|
+
:autorequire, :platform, :require_paths
|
|
30
34
|
|
|
31
|
-
|
|
32
|
-
@dir ||= ( File.directory?('../leaf') ? '../leaf' : 'pkg')
|
|
35
|
+
attr_reader :package_name, :series_versioning
|
|
33
36
|
|
|
34
|
-
@name ||= master['name']
|
|
35
|
-
@status ||= master['status'] || 'beta/stable'
|
|
36
|
-
@date ||= master['date'] || Time.now.strftime("%Y-%m-%d")
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
@
|
|
38
|
+
def init( options={} )
|
|
39
|
+
@dir ||= LOCATIONS.find { |f| File.directory?(f) } || 'dist'
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
#@name ||= master['name']
|
|
42
|
+
#@status ||= master['status'] || 'beta/stable'
|
|
43
|
+
#@date ||= master['date'] || Time.now.strftime("%Y-%m-%d")
|
|
44
|
+
#@series ||= master['series'] || '1'
|
|
45
|
+
|
|
46
|
+
@maintainer ||= @author
|
|
47
|
+
@status ||= 'beta/stable'
|
|
48
|
+
@date ||= Time.now.strftime("%Y-%m-%d")
|
|
49
|
+
@series ||= '1'
|
|
50
|
+
@architecture ||= 'any'
|
|
51
|
+
|
|
52
|
+
d = @date.split('-').collect{ |e| e.to_i }
|
|
53
|
+
#d[0] = d[0] - 2000 # No need to keep the 2000
|
|
54
|
+
@version ||= d.join('.')
|
|
55
|
+
|
|
56
|
+
if $BUILD_VERSION
|
|
57
|
+
buildno = eval(Time.now.strftime("%H*60+%M"))
|
|
58
|
+
@version += ".#{buildno}"
|
|
44
59
|
end
|
|
45
60
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
@package_name ||= @name + ',' + @date
|
|
61
|
+
unless @series
|
|
62
|
+
puts "Series is required."
|
|
63
|
+
exit 0
|
|
50
64
|
end
|
|
51
65
|
|
|
52
|
-
@
|
|
53
|
-
|
|
54
|
-
|
|
66
|
+
@package_name ||= @name + '-' + @version
|
|
67
|
+
#@package_name ||= @name + ',' + @date # rubyforge doesn't allow commas
|
|
68
|
+
|
|
69
|
+
#@author ||= master['author']
|
|
70
|
+
#@email ||= master['email']
|
|
71
|
+
#@summary ||= master['summary']
|
|
55
72
|
@project ||= master['rubyforge']['project']
|
|
56
|
-
|
|
73
|
+
#@homepage ||= master['homepage'] || master['rubyforge']['homepage']
|
|
74
|
+
@homepage ||= master['rubyforge']['homepage']
|
|
57
75
|
|
|
58
76
|
@exclude ||= []
|
|
59
77
|
@exclude |= MUST_EXCLUDE
|
|
60
78
|
|
|
61
|
-
# types include 'tgz', 'tbz', 'zip', 'tar.gz' 'tar.bz2' and 'gem'.
|
|
62
|
-
@types ||= master['distribute'] || [ 'gem', 'tar.gz', 'zip' ]
|
|
63
|
-
@types.collect! { |t| t.to_s.strip.downcase }
|
|
64
|
-
|
|
65
|
-
# not setable
|
|
66
79
|
@include ||= ['**/*']
|
|
67
80
|
|
|
81
|
+
# format types include 'tgz', 'tbz', 'zip', 'tar.gz' 'tar.bz2', 'gem' and 'deb'.
|
|
82
|
+
@format ||= master['distribute'] || [ 'gem', 'tar.bz2', 'zip' ]
|
|
83
|
+
@format = [@format].flatten
|
|
84
|
+
@format.collect! { |t| t.to_s.strip.downcase }
|
|
85
|
+
|
|
86
|
+
@dependencies ||= []
|
|
87
|
+
@executables ||= []
|
|
88
|
+
@requirements ||= []
|
|
89
|
+
@recommends ||= []
|
|
90
|
+
|
|
68
91
|
# gem specific (at least in this context)
|
|
69
92
|
if defined?(Gem)
|
|
70
93
|
if @platform
|
|
71
94
|
begin
|
|
72
|
-
@
|
|
95
|
+
@platform = ::Gem.const_get(@platform)
|
|
73
96
|
rescue NameError
|
|
74
|
-
@platform =
|
|
97
|
+
@platform = ::Gem::Platform::RUBY
|
|
75
98
|
end
|
|
99
|
+
else
|
|
100
|
+
@platform ||= ::Gem::Platform::RUBY
|
|
76
101
|
end
|
|
77
|
-
@platform = ::Gem::Platform::RUBY unless @plaform
|
|
78
102
|
#@autorequire
|
|
79
|
-
@requirements ||= master['requirements'] || []
|
|
80
|
-
@dependencies ||= master['dependencies'] || []
|
|
81
|
-
@executables ||= master['executables'] || []
|
|
82
103
|
end
|
|
104
|
+
|
|
83
105
|
end
|
|
84
106
|
|
|
85
|
-
def run
|
|
107
|
+
def run( options={} )
|
|
108
|
+
puts "Creating #{@format.join(',')} packages..."
|
|
109
|
+
|
|
86
110
|
# create package image
|
|
87
|
-
|
|
111
|
+
group_dir_path = File.join( @dir, @package_name )
|
|
112
|
+
package_dir_path = File.join( @dir, @package_name, @package_name )
|
|
88
113
|
|
|
89
|
-
if FileTest.directory?(
|
|
90
|
-
print "Package '#{package_name}' already exists.
|
|
114
|
+
if FileTest.directory?(group_dir_path)
|
|
115
|
+
print "Package directory '#{package_name}' already exists. Conitnue anyway or [R]emove and continue? [y/r/N] "
|
|
91
116
|
until inp = $stdin.gets[0,1] ; sleep 1 ; end
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
#
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
117
|
+
inp = inp.to_s.downcase
|
|
118
|
+
case inp
|
|
119
|
+
when 'y'
|
|
120
|
+
# continue...
|
|
121
|
+
when 'r'
|
|
122
|
+
puts "Removing old directory '#{File.expand_path(group_dir_path)}'..."
|
|
123
|
+
FileUtils.rm_r(group_dir_path)
|
|
99
124
|
else
|
|
100
125
|
puts "Reap package task canceled."
|
|
101
|
-
|
|
126
|
+
return nil
|
|
102
127
|
end
|
|
103
128
|
end
|
|
104
129
|
package_files = FileList.new
|
|
@@ -118,8 +143,8 @@ class Reap::Package < Reap::Task
|
|
|
118
143
|
end
|
|
119
144
|
|
|
120
145
|
# create standard package files
|
|
121
|
-
FileUtils.chdir(@dir) do
|
|
122
|
-
@
|
|
146
|
+
FileUtils.chdir( File.join( @dir, @package_name ) ) do
|
|
147
|
+
@format.each do |t|
|
|
123
148
|
sh_cmd = nil
|
|
124
149
|
prefix = 'ERROR' # in case of unforseen bug
|
|
125
150
|
case t
|
|
@@ -135,7 +160,7 @@ class Reap::Package < Reap::Task
|
|
|
135
160
|
prefix = 'zip'
|
|
136
161
|
sh_cmd = 'zip -r'
|
|
137
162
|
puts "\nReap is shelling out work to zip..."
|
|
138
|
-
when 'gem'
|
|
163
|
+
when 'gem', 'deb'
|
|
139
164
|
sh_cmd = nil
|
|
140
165
|
else
|
|
141
166
|
puts "Unknown package type '#{t}' skipped."
|
|
@@ -147,23 +172,38 @@ class Reap::Package < Reap::Task
|
|
|
147
172
|
end
|
|
148
173
|
|
|
149
174
|
# create gem package
|
|
150
|
-
|
|
175
|
+
if @format.include?('gem')
|
|
176
|
+
if defined?(Gem)
|
|
177
|
+
run_gem
|
|
178
|
+
else
|
|
179
|
+
puts "Package .gem requested, but rubygems not found (skipped)."
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# create debian package
|
|
184
|
+
if @format.include?('deb')
|
|
185
|
+
if true # TODO ensure required debian tools here
|
|
186
|
+
run_deb
|
|
187
|
+
else
|
|
188
|
+
puts "Package .deb requested, but debian tools not found (skipped)."
|
|
189
|
+
end
|
|
190
|
+
end
|
|
151
191
|
|
|
152
192
|
return true
|
|
153
193
|
end
|
|
154
194
|
|
|
195
|
+
# support methods -------------------------------------------
|
|
196
|
+
|
|
197
|
+
private
|
|
198
|
+
|
|
199
|
+
# This builds the gem package.
|
|
200
|
+
|
|
155
201
|
def run_gem
|
|
156
202
|
spec = Gem::Specification.new { |s|
|
|
157
|
-
|
|
158
203
|
s.name = @name
|
|
159
|
-
|
|
160
|
-
if @version
|
|
161
|
-
s.version = @version
|
|
162
|
-
else
|
|
163
|
-
s.version = @series
|
|
164
|
-
end
|
|
204
|
+
s.version = @version
|
|
165
205
|
|
|
166
|
-
@dependencies.each{ |d,v|
|
|
206
|
+
@dependencies.each { |d,v|
|
|
167
207
|
if v
|
|
168
208
|
s.add_dependency(d, v)
|
|
169
209
|
else
|
|
@@ -189,14 +229,72 @@ class Reap::Package < Reap::Task
|
|
|
189
229
|
s.rubyforge_project = @project
|
|
190
230
|
s.homepage = @homepage
|
|
191
231
|
s.executables = @executables
|
|
232
|
+
s.require_paths = @require_paths if @require_paths
|
|
192
233
|
s.bindir = "bin"
|
|
193
|
-
|
|
234
|
+
s.has_rdoc = true
|
|
194
235
|
}
|
|
195
236
|
|
|
196
237
|
puts "Reap is shelling out work to the Gem Package Manager..."
|
|
197
238
|
Gem.manage_gems
|
|
198
239
|
Gem::Builder.new(spec).build
|
|
199
|
-
|
|
240
|
+
gems = Dir.glob( './*.gem' )
|
|
241
|
+
gems.each{ |f|
|
|
242
|
+
FileUtils.mv( f, File.join( @dir, @package_name ) )
|
|
243
|
+
}
|
|
244
|
+
#sh %{mv ./*.gem #{@dir}/}
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
# This build the Debiam package.
|
|
249
|
+
|
|
250
|
+
def run_deb
|
|
251
|
+
|
|
252
|
+
# build the debian control file
|
|
253
|
+
|
|
254
|
+
dep = dependencies.collect{ |d, v|
|
|
255
|
+
if v
|
|
256
|
+
"#{d} (#{v})"
|
|
257
|
+
else
|
|
258
|
+
d
|
|
259
|
+
end
|
|
260
|
+
}.join(', ')
|
|
261
|
+
|
|
262
|
+
# Some debian fields not yet used:
|
|
263
|
+
# Installed-Size: 1024
|
|
264
|
+
# Conflicts: wile-e-coyote, ...
|
|
265
|
+
# Replaces: sam-sheepdog
|
|
266
|
+
# Pre-Depends: perl, ...
|
|
267
|
+
# Suggests: docbook
|
|
268
|
+
|
|
269
|
+
ctrl = %{
|
|
270
|
+
Package: #{name}
|
|
271
|
+
Version: #{version}
|
|
272
|
+
Priority: optional
|
|
273
|
+
Architecture: #{architecture}
|
|
274
|
+
Essential: no
|
|
275
|
+
}.tabto(0)
|
|
276
|
+
ctrl << "Section: #{category}" if category
|
|
277
|
+
ctrl << "Depends: #{dep}" unless dep.empty?
|
|
278
|
+
ctrl << "Recommends: #{recommends.join(' | ')}" unless recommends.empty?
|
|
279
|
+
ctrl << %{
|
|
280
|
+
Maintainer: #{maintainer} [#{email}]
|
|
281
|
+
Provides: #{name}
|
|
282
|
+
Description: #{summary}
|
|
283
|
+
.
|
|
284
|
+
#{description}
|
|
285
|
+
}.tabto(0)
|
|
286
|
+
|
|
287
|
+
debname = architecture == 'any' ? "ruby_#{name}_#{version}.deb" : "ruby_#{name}_#{version}_#{architecture}.deb"
|
|
288
|
+
debdir = File.join( @dir, @package_name, 'debian' )
|
|
289
|
+
debdebdir = File.join( debdir, 'DEBIAN' )
|
|
290
|
+
debfile = File.join( debdir, debname )
|
|
291
|
+
|
|
292
|
+
puts "Reap is shelling out work to the deb-pkg..."
|
|
293
|
+
FileUtils.mkdir_p(debdir)
|
|
294
|
+
sh %{ruby setup.rb all --prefix=#{debdir}}
|
|
295
|
+
FileUtils.mkdir_p(debdebdir)
|
|
296
|
+
File.open( File.join(debdebdir, 'control'), 'w') { |f| f << ctrl }
|
|
297
|
+
#sh %{dpkg-deb -b #{debdir} #{debfile}}
|
|
200
298
|
end
|
|
201
299
|
|
|
202
300
|
end
|
data/lib/reap/task/publish.rb
CHANGED
|
@@ -6,11 +6,9 @@ require 'reap/task'
|
|
|
6
6
|
#
|
|
7
7
|
class Reap::Publish < Reap::Task
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
task_desc "Publish documents to the web."
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
"Publish documents to the web."
|
|
13
|
-
end
|
|
11
|
+
section_required true
|
|
14
12
|
|
|
15
13
|
attr_accessor :host, :type, :dir, :project, :username
|
|
16
14
|
attr_accessor :exclude # not using yet
|
data/lib/reap/task/rdoc.rb
CHANGED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
require 'reap/task'
|
|
2
|
+
|
|
3
|
+
require "enumerator"
|
|
4
|
+
require "http-access2"
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# Release Task
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
# This Rake task releases files to RubyForge and other GForge instaces
|
|
12
|
+
# or SourceForge clones. In its most simple usage it looks like:
|
|
13
|
+
#
|
|
14
|
+
# project = MetaProject::Project::XForge::RubyForge.new('xforge')
|
|
15
|
+
# # Create a new release of the xforge project on Rubyforge.
|
|
16
|
+
# task :release => [:gem] do
|
|
17
|
+
# Rake::XForge::Release.new(project) {}
|
|
18
|
+
# end
|
|
19
|
+
#
|
|
20
|
+
# The previous example will use defaults where it can. It will prompt
|
|
21
|
+
# you for your xForge user name and password before it uploads all
|
|
22
|
+
# gems under the pkg folder and creates a RubyForge release.
|
|
23
|
+
#
|
|
24
|
+
# While defaults are nice, you may want a little more control. You can
|
|
25
|
+
# specify additional attributes:
|
|
26
|
+
#
|
|
27
|
+
# * #user_name
|
|
28
|
+
# * #password
|
|
29
|
+
# * #changes_file
|
|
30
|
+
# * #version
|
|
31
|
+
# * #files
|
|
32
|
+
# * #release_name
|
|
33
|
+
# * #release_notes
|
|
34
|
+
# * #release_changes
|
|
35
|
+
# * #package_name
|
|
36
|
+
#
|
|
37
|
+
# Example:
|
|
38
|
+
# project = MetaProject::Project::XForge::RubyForge.new('xforge')
|
|
39
|
+
# task :release => [:gem] do
|
|
40
|
+
# release_files = FileList[ 'pkg/*.gem', 'CHANGES' ]
|
|
41
|
+
#
|
|
42
|
+
# Rake::XForge::Release.new(project) do |xf|
|
|
43
|
+
# # Never hardcode user name and password in the Rakefile!
|
|
44
|
+
# xf.user_name = ENV['RUBYFORGE_USER']
|
|
45
|
+
# xf.password = ENV['RUBYFORGE_PASSWORD']
|
|
46
|
+
# xf.files = release_files.to_a
|
|
47
|
+
# xf.release_name = "XForge 0.1"
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
50
|
+
# This can be invoked from the command line:
|
|
51
|
+
#
|
|
52
|
+
# rake release RUBYFORGE_USER=myuser \
|
|
53
|
+
# RUBYFORGE_PASSWORD=mypassword
|
|
54
|
+
#
|
|
55
|
+
# If you don't like blocks, you can do like this:
|
|
56
|
+
#
|
|
57
|
+
# project = MetaProject::Project::XForge::RubyForge.new('xforge')
|
|
58
|
+
# task :release => [:gem] do
|
|
59
|
+
# xf = Rake::XForge::Release.new(project)
|
|
60
|
+
# ... # Set additional attributes
|
|
61
|
+
# xf.execute
|
|
62
|
+
# end
|
|
63
|
+
|
|
64
|
+
class Reap::Release < Reap::Task
|
|
65
|
+
|
|
66
|
+
task_desc "Release distribution files."
|
|
67
|
+
|
|
68
|
+
section_required true
|
|
69
|
+
|
|
70
|
+
attr_accessor :project, :version
|
|
71
|
+
attr_accessor :host, :username, :password
|
|
72
|
+
attr_accessor :package, :packageid, :groupid, :private, :processor
|
|
73
|
+
attr_accessor :name, :changes, :notes, :changelog, :notelog
|
|
74
|
+
attr_accessor :cookiejar
|
|
75
|
+
|
|
76
|
+
def init
|
|
77
|
+
@project ||= master['rubyforge']['project'] || master['name']
|
|
78
|
+
@version ||= master['version'] || master['date']
|
|
79
|
+
|
|
80
|
+
@host ||= 'rubyforge.org'
|
|
81
|
+
@username ||= master['rubyforge']['username']
|
|
82
|
+
@password ||= master['rubyforge']['password']
|
|
83
|
+
|
|
84
|
+
@package ||= master['rubyforge']['package']
|
|
85
|
+
@packageid ||= master['rubyforge']['packageid']
|
|
86
|
+
@groupid ||= master['rubyforge']['groupid']
|
|
87
|
+
@private ||= false
|
|
88
|
+
@processor ||= 'Any'
|
|
89
|
+
|
|
90
|
+
#@files ||= section['files']
|
|
91
|
+
@name ||= master['version'] || master['date']
|
|
92
|
+
@date ||= master['date'] || Time::now.strftime('%Y-%m-%d %H:%M')
|
|
93
|
+
|
|
94
|
+
@cookiejar ||= File::join(File::expand_path("~"), ".rubyforge.cookie_jar")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# run task
|
|
98
|
+
|
|
99
|
+
def run
|
|
100
|
+
abort "missing field -- package" unless @package
|
|
101
|
+
abort "missing field -- packageid" unless @packageid
|
|
102
|
+
abort "missing field -- groupid" unless @groupid
|
|
103
|
+
# add more...
|
|
104
|
+
|
|
105
|
+
case @host
|
|
106
|
+
when 'rubyforge', 'rubyforge.org'
|
|
107
|
+
else
|
|
108
|
+
puts %{Unrecognized release host '#{@host}'. Skipped.}
|
|
109
|
+
skip = true
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
unless skip
|
|
113
|
+
puts "Reap is preparing release ..."
|
|
114
|
+
@password = get_password
|
|
115
|
+
login
|
|
116
|
+
#create_package (doesn't fit)
|
|
117
|
+
add_release( @file.unshift )
|
|
118
|
+
@files.each { |f| add_file( f ) }
|
|
119
|
+
add_release
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
FILETYPES = {
|
|
124
|
+
".deb" => 1000,
|
|
125
|
+
".rpm" => 2000,
|
|
126
|
+
".zip" => 3000,
|
|
127
|
+
".bz2" => 3100,
|
|
128
|
+
".gz" => 3110,
|
|
129
|
+
".src.zip" => 5000,
|
|
130
|
+
".src.bz2" => 5010,
|
|
131
|
+
".src.gz" => 5020,
|
|
132
|
+
".src.rpm" => 5100,
|
|
133
|
+
".src" => 5900,
|
|
134
|
+
".jpg" => 8000,
|
|
135
|
+
".txt" => 8100,
|
|
136
|
+
".text" => 8100,
|
|
137
|
+
".htm" => 8200,
|
|
138
|
+
".html" => 8200,
|
|
139
|
+
".pdf" => 8300,
|
|
140
|
+
".oth" => 9999,
|
|
141
|
+
".ebuild" => 1300,
|
|
142
|
+
".exe" => 1100,
|
|
143
|
+
".dmg" => 1200,
|
|
144
|
+
".tar.gz" => 5000,
|
|
145
|
+
".tgz" => 5000,
|
|
146
|
+
".gem" => 1400,
|
|
147
|
+
".pgp" => 8150,
|
|
148
|
+
".sig" => 8150,
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
PROCESSORS = {
|
|
152
|
+
"i386" => 1000,
|
|
153
|
+
"IA64" => 6000,
|
|
154
|
+
"Alpha" => 7000,
|
|
155
|
+
"Any" => 8000,
|
|
156
|
+
"PPC" => 2000,
|
|
157
|
+
"MIPS" => 3000,
|
|
158
|
+
"Sparc" => 4000,
|
|
159
|
+
"UltraSparc" => 5000,
|
|
160
|
+
"Other" => 9999,
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
# login
|
|
165
|
+
|
|
166
|
+
def login
|
|
167
|
+
page = "/account/login.php"
|
|
168
|
+
method = "post_content"
|
|
169
|
+
form = {
|
|
170
|
+
"return_to" => "",
|
|
171
|
+
"form_loginname" => @username,
|
|
172
|
+
"form_pw" => @password,
|
|
173
|
+
"login" => "Login"
|
|
174
|
+
}
|
|
175
|
+
http_transaction( page, method, form )
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# create a new package ( should be another task )
|
|
179
|
+
|
|
180
|
+
def create_package
|
|
181
|
+
page = "/frs/admin/index.php"
|
|
182
|
+
method = "post_content"
|
|
183
|
+
form = {
|
|
184
|
+
"group_id" => @groupid,
|
|
185
|
+
"package_name" => @package,
|
|
186
|
+
"func" => "add_package",
|
|
187
|
+
"is_public" => (@private ? 0 : 1),
|
|
188
|
+
"submit" => "Create This Package",
|
|
189
|
+
}
|
|
190
|
+
http_transaction( page, method, form )
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# add a new release
|
|
194
|
+
|
|
195
|
+
def add_release( userfile )
|
|
196
|
+
page = "/frs/admin/qrs.php"
|
|
197
|
+
method = "post_content"
|
|
198
|
+
|
|
199
|
+
type_id = @type || userfile[%r|\.[^\./]+$|]
|
|
200
|
+
type_id = FILETYPES[type_id]
|
|
201
|
+
|
|
202
|
+
proc_id = PROCESSORS[@processor]
|
|
203
|
+
|
|
204
|
+
# how to use these?
|
|
205
|
+
notes = @notes ? @notes : ( @notelog ? open(@notelog) : nil )
|
|
206
|
+
changes = @changes ? @changes : ( @changelog ? open(@changelog) : nil )
|
|
207
|
+
|
|
208
|
+
userfile = open(userfile)
|
|
209
|
+
|
|
210
|
+
preformatted = '1'
|
|
211
|
+
|
|
212
|
+
form = {
|
|
213
|
+
"group_id" => @groupid,
|
|
214
|
+
"package_id" => @packageid,
|
|
215
|
+
"release_name" => @name,
|
|
216
|
+
"release_date" => @date,
|
|
217
|
+
"type_id" => type_id,
|
|
218
|
+
"processor_id" => proc_id,
|
|
219
|
+
"preformatted" => preformatted,
|
|
220
|
+
"userfile" => userfile,
|
|
221
|
+
"submit" => "Release File"
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
|
|
225
|
+
extheader = { 'content-type'=>"multipart/form-data; boundary=___#{ boundary }___" }
|
|
226
|
+
|
|
227
|
+
http_transaction( page, method, form, extheader )
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# add file to release
|
|
231
|
+
|
|
232
|
+
def add_file( userfile )
|
|
233
|
+
|
|
234
|
+
# to do
|
|
235
|
+
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# http transaction
|
|
239
|
+
|
|
240
|
+
def http_transaction( page, method, form, extheader={} )
|
|
241
|
+
client = HTTPAccess2::Client::new ENV['HTTP_PROXY']
|
|
242
|
+
client.debug_dev = STDERR if ENV['DEBUG']
|
|
243
|
+
client.set_cookie_store cookie_jar
|
|
244
|
+
# fixes http-access2 bug
|
|
245
|
+
client.redirect_uri_callback = lambda do |res|
|
|
246
|
+
page = res.header['location'].first
|
|
247
|
+
page = page =~ %r/http/ ? page : "#{ config['uri'] }/#{ page }"
|
|
248
|
+
page
|
|
249
|
+
end
|
|
250
|
+
response = client.send "#{ method }", "#{ config['uri'] }/#{ page }", form, extheader
|
|
251
|
+
client.save_cookie_store
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
# fixes http-access2 bug
|
|
256
|
+
BEGIN {
|
|
257
|
+
require "http-access2"
|
|
258
|
+
module WebAgent::CookieUtils
|
|
259
|
+
def domain_match(host, domain)
|
|
260
|
+
case domain
|
|
261
|
+
when /\d+\.\d+\.\d+\.\d+/
|
|
262
|
+
return (host == domain)
|
|
263
|
+
when '.'
|
|
264
|
+
return true
|
|
265
|
+
when /^\./
|
|
266
|
+
#return tail_match?(domain, host)
|
|
267
|
+
return tail_match?(host, domain)
|
|
268
|
+
else
|
|
269
|
+
return (host == domain)
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
}
|
data/lib/reap/task/test.rb
CHANGED
|
@@ -23,9 +23,7 @@ Test::Unit.run = true # don't run auto tests
|
|
|
23
23
|
#
|
|
24
24
|
class Reap::Test < Reap::Task
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
"Run unit-tests (each in a separate process)."
|
|
28
|
-
end
|
|
26
|
+
task_desc "Run unit-tests (each in a separate process)."
|
|
29
27
|
|
|
30
28
|
attr_accessor :libs, :files, :fixture, :against_installed
|
|
31
29
|
|
|
@@ -141,8 +139,17 @@ class Reap::Test < Reap::Task
|
|
|
141
139
|
tests = Test::Unit::Collector::ObjectSpace.new.collect
|
|
142
140
|
runner = Test::Unit::UI::TestRunnerMediator.new( tests )
|
|
143
141
|
result = runner.run_suite
|
|
144
|
-
output << Marshal.dump(result)
|
|
145
142
|
|
|
143
|
+
begin
|
|
144
|
+
marshalled = Marshal.dump(result)
|
|
145
|
+
rescue TypeError => e
|
|
146
|
+
$stderr << "MARSHAL ERROR\n"
|
|
147
|
+
$stderr << "TEST: #{testfile}\n"
|
|
148
|
+
$stderr << "DATA:" << result.inspect
|
|
149
|
+
exit 1
|
|
150
|
+
end
|
|
151
|
+
output << marshalled
|
|
152
|
+
|
|
146
153
|
STDOUT.reopen(output)
|
|
147
154
|
output.close
|
|
148
155
|
}
|
|
@@ -152,7 +159,14 @@ class Reap::Test < Reap::Task
|
|
|
152
159
|
ruby.read
|
|
153
160
|
end
|
|
154
161
|
p testfile if $VERBOSE
|
|
155
|
-
|
|
162
|
+
begin
|
|
163
|
+
marsh = Marshal.load(result)
|
|
164
|
+
rescue ArgumentError
|
|
165
|
+
$stderr << "\nCannot load marshalled test data."
|
|
166
|
+
$stderr << result << "\n"
|
|
167
|
+
exit 0
|
|
168
|
+
end
|
|
169
|
+
return marsh
|
|
156
170
|
end
|
|
157
171
|
|
|
158
172
|
#
|
data/lib/reap/task/testext.rb
CHANGED
|
@@ -11,9 +11,7 @@ require 'facet/string/margin'
|
|
|
11
11
|
#
|
|
12
12
|
class Reap::TestExt < Reap::Task
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
"Extract unit-tests from lib scripts."
|
|
16
|
-
end
|
|
14
|
+
task_desc "Extract unit-tests from lib scripts."
|
|
17
15
|
|
|
18
16
|
attr_accessor :dir, :files, :options
|
|
19
17
|
|
|
@@ -48,7 +46,9 @@ class Reap::TestExt < Reap::Task
|
|
|
48
46
|
testing = extract( file )
|
|
49
47
|
unless testing.strip.empty?
|
|
50
48
|
complete_test = create( testing, file )
|
|
51
|
-
|
|
49
|
+
libpath = File.dirname( file )
|
|
50
|
+
testfile = "test_" + File.basename( file )
|
|
51
|
+
fp = File.join(@dir,libpath,testfile)
|
|
52
52
|
unless File.directory?( File.dirname( fp ) )
|
|
53
53
|
FileUtils.mkdir_p( File.dirname(fp) )
|
|
54
54
|
end
|
|
@@ -63,7 +63,7 @@ class Reap::TestExt < Reap::Task
|
|
|
63
63
|
tests = ""; inside = false
|
|
64
64
|
fstr = File.read( file )
|
|
65
65
|
fstr.split(/\n/).each do |l|
|
|
66
|
-
if l =~ /^=
|
|
66
|
+
if l =~ /^=begin[ ]*test/i
|
|
67
67
|
tests << "\n"
|
|
68
68
|
inside = true
|
|
69
69
|
next
|