raven 1.1.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/raven.rb +18 -4
- data/lib/raven/java_tasks.rb +296 -285
- data/lib/raven/repo_builder.rb +10 -6
- data/lib/raven/search_install.rb +21 -9
- data/lib/raven/search_install.rb~ +247 -0
- metadata +3 -2
data/lib/raven.rb
CHANGED
@@ -30,8 +30,9 @@ module Raven
|
|
30
30
|
def self.run(args)
|
31
31
|
opts = OptionParser.new
|
32
32
|
opts.banner = "Usage: raven [options] (import | repository * | server | install *)"
|
33
|
-
repo_url, index_url, all, groupId, allver = '', '', false, nil, false
|
33
|
+
repo_url, proxy_url, index_url, all, groupId, allver = '', '', '', false, nil, false
|
34
34
|
opts.on('-m=ARG', '--mavenrepo repo_url', '[repository] Maven repository to build your gem repository from.') { |val| repo_url = val }
|
35
|
+
opts.on('-p=ARG', '--proxy proxy_url', '[repository|install] Proxy url (http://<p_user>:<p_pwd>@<p_host>:<p_port>) for access outside corporate firewalls.') { |val| proxy_url = val }
|
35
36
|
opts.on('-i=ARG', '--index index_url', '[install] URL of a directory containing repository indices.') { |val| index_url = val }
|
36
37
|
opts.on('-g=ARG', '--group', '[install] Install artifacts in the provided group.') { |val| groupId = val }
|
37
38
|
opts.on('-a', '--all', '[install] Install all selected artifacts.') { |val| all = true }
|
@@ -60,7 +61,7 @@ module Raven
|
|
60
61
|
rel_url = '/maven2/'
|
61
62
|
end
|
62
63
|
puts "Using server #{server} and url #{rel_url}"
|
63
|
-
builder = Raven::GemRepoBuilder.new(server, rel_url)
|
64
|
+
builder = Raven::GemRepoBuilder.new(server, 80, rel_url, Raven::Command.parse_proxy(proxy_url))
|
64
65
|
if (rest.size > 1)
|
65
66
|
rest.shift
|
66
67
|
puts "Packages #{rest}"
|
@@ -77,11 +78,12 @@ module Raven
|
|
77
78
|
trap("INT") { s.shutdown }
|
78
79
|
s.start
|
79
80
|
when 'install'
|
80
|
-
params = ['raven.rubyforge.org',
|
81
|
+
params = ['raven.rubyforge.org', 80, '/indices/']
|
81
82
|
if (index_url.length > 0)
|
82
83
|
params = Raven::Command.parse_url(index_url)
|
83
84
|
params[2] = '/' if params[2].empty?
|
84
85
|
end
|
86
|
+
params << Raven::Command.parse_proxy(proxy_url)
|
85
87
|
installer = Raven::GemSearchInstaller.new(*params)
|
86
88
|
# Refreshes local gem indices if needed
|
87
89
|
installer.get_indices
|
@@ -108,7 +110,7 @@ module Raven
|
|
108
110
|
end
|
109
111
|
end
|
110
112
|
when 'build_index'
|
111
|
-
RepoIndexBuilder.new('m2_central', 'repo1.maven.org', '/maven2/').build_idx
|
113
|
+
RepoIndexBuilder.new('m2_central', 'repo1.maven.org', '/maven2/', Raven::Command.parse_proxy(proxy_url)).build_idx
|
112
114
|
else
|
113
115
|
puts opts.to_s
|
114
116
|
end
|
@@ -119,5 +121,17 @@ module Raven
|
|
119
121
|
parsed.shift
|
120
122
|
parsed
|
121
123
|
end
|
124
|
+
|
125
|
+
def self.parse_proxy(purl)
|
126
|
+
if (purl.length > 0)
|
127
|
+
match = purl.match('http://(.*):(.*)@([^/]*):([0-9]*)')
|
128
|
+
match = match.to_a
|
129
|
+
match.shift
|
130
|
+
puts "Using proxy #{match[2]} and port #{match[3]}"
|
131
|
+
[match[2], match[3], match[0], match[1].length == 0 ? 80 : Integer(match[1])]
|
132
|
+
else
|
133
|
+
nil
|
134
|
+
end
|
135
|
+
end
|
122
136
|
end
|
123
137
|
end
|
data/lib/raven/java_tasks.rb
CHANGED
@@ -60,340 +60,351 @@ module Raven
|
|
60
60
|
classfile = 'target/classes/' + java[d.length, (java.length - 5 - d.length)] + '.class'
|
61
61
|
File.exist?(classfile) ? File.stat(java).mtime > File.stat(classfile).mtime : true
|
62
62
|
end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
63
|
+
end.flatten
|
64
|
+
|
65
|
+
if (source_files.size > 0)
|
66
|
+
# Getting only package names, it shortens the command line
|
67
|
+
source_pkg = Set.new
|
68
|
+
source_files.each { |src| source_pkg << File.join(File.dirname(src), '*.java') }
|
69
|
+
# Executing javac
|
70
|
+
puts "javac -classpath \"#{classpath.join(CP_SEP)}\" -sourcepath \"#{@build_path.join(CP_SEP)}\" -d target/classes #{source_pkg.to_a.join(' ')}" if RakeFileUtils.verbose_flag
|
71
|
+
`javac -classpath "#{classpath.join(CP_SEP)}" -sourcepath "#{@build_path.join(CP_SEP)}" -d target/classes #{source_pkg.to_a.join(' ')}`
|
72
|
+
unless $? == 0
|
73
|
+
puts "Build failed, see above errors."
|
74
|
+
exit
|
75
|
+
end
|
76
|
+
else
|
77
|
+
puts 'All class files are up to date.' if RakeFileUtils.verbose_flag
|
75
78
|
end
|
76
|
-
|
77
|
-
|
79
|
+
end
|
80
|
+
|
81
|
+
def build_path
|
82
|
+
@build_path ||= []
|
83
|
+
end
|
84
|
+
|
85
|
+
def build_path=(p)
|
86
|
+
@build_path = [p]
|
78
87
|
end
|
79
88
|
end
|
80
89
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
if !File.exist?("target/#{name}") || File.stat("target/#{name}").ctime < latest
|
94
|
-
`jar -cf target/#{name} -C target/classes .`
|
95
|
-
else
|
96
|
-
puts 'Nothing to do, jar is fresh enough.' if RakeFileUtils.verbose_flag
|
90
|
+
# Builds a jar file from your compiled sources. The jarfile produced
|
91
|
+
# will have the same name as your jar task.
|
92
|
+
class JarTask < Rake::Task
|
93
|
+
def execute
|
94
|
+
super
|
95
|
+
latest = Raven.latest_file('target/classes')
|
96
|
+
|
97
|
+
if !File.exist?("target/#{name}") || File.stat("target/#{name}").ctime < latest
|
98
|
+
`jar -cf target/#{name} -C target/classes .`
|
99
|
+
else
|
100
|
+
puts 'Nothing to do, jar is fresh enough.' if RakeFileUtils.verbose_flag
|
101
|
+
end
|
97
102
|
end
|
98
103
|
end
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
104
|
+
|
105
|
+
# Builds a jar file from your sources. Customized by adding directories
|
106
|
+
# to the <em>source_path</em> just like the JavacTask.
|
107
|
+
class JarSourceTask < Rake::Task
|
108
|
+
def execute
|
109
|
+
super
|
110
|
+
# Checking if any of our prerequisites is a JavacTask, if
|
111
|
+
# so we'll just use the build path to construct the jar.
|
112
|
+
Raven.prereq_filter(prerequisites, :build_path) do |javac_task|
|
113
|
+
(@source_path ||= []) << javac_task.build_path
|
114
|
+
end
|
115
|
+
|
116
|
+
# Initializing source path
|
117
|
+
@source_path = ["src/main/java"] unless @source_path
|
118
|
+
@source_path.flatten!
|
119
|
+
|
120
|
+
latest = Time.at(0)
|
121
|
+
@source_path.each do |dir|
|
122
|
+
dir_latest = Raven.latest_file(dir)
|
123
|
+
latest = dir_latest if dir_latest > latest
|
124
|
+
end
|
125
|
+
|
126
|
+
# Manifest inclusion
|
127
|
+
mfest_param = @manifest ? "-m #{@manifest}" : ""
|
128
|
+
|
129
|
+
# Building the jar from all sources
|
130
|
+
if !File.exist?("target/#{name}") || File.stat("target/#{name}").ctime < latest
|
131
|
+
`jar -cf target/#{name} #{mfest_param} -C #{@source_path.pop} .`
|
132
|
+
while (p = @source_path.pop)
|
133
|
+
`jar -uf target/#{name} -C #{p} .`
|
134
|
+
end
|
135
|
+
end
|
110
136
|
end
|
111
137
|
|
112
|
-
|
113
|
-
|
114
|
-
@source_path.flatten!
|
115
|
-
|
116
|
-
latest = Time.at(0)
|
117
|
-
@source_path.each do |dir|
|
118
|
-
dir_latest = Raven.latest_file(dir)
|
119
|
-
latest = dir_latest if dir_latest > latest
|
138
|
+
def source_path
|
139
|
+
@source_path ||= []
|
120
140
|
end
|
121
141
|
|
122
|
-
|
123
|
-
|
124
|
-
`jar -cf target/#{name} -C #{@source_path.pop} .`
|
125
|
-
while (p = @source_path.pop)
|
126
|
-
`jar -uf target/#{name} -C #{p} .`
|
127
|
-
end
|
142
|
+
def manifest=(f)
|
143
|
+
@manifest = f
|
128
144
|
end
|
129
145
|
end
|
130
146
|
|
131
|
-
|
132
|
-
|
147
|
+
# Produces a WAR from a web application directory. Includes the libraries
|
148
|
+
# needed in WEB-INF/lib (as long as the corresponding dependency task is
|
149
|
+
# declared as a prerequisite) and the compiled classes (if there are).
|
150
|
+
#
|
151
|
+
# Can be customized by setting <em>webapp_dir</em> to the directory
|
152
|
+
# containing your web application resources (web.xml, jsp, images, ...).
|
153
|
+
# The default is src/main/webapp.
|
154
|
+
class WarTask < Rake::Task
|
155
|
+
DEFAULT_TARGET = 'target/webapp/'
|
156
|
+
LIB_SUBDIR = 'WEB-INF/lib/'
|
157
|
+
CLASSES_SUBDIR = 'WEB-INF/classes/'
|
158
|
+
|
159
|
+
def execute
|
160
|
+
super
|
161
|
+
|
162
|
+
# Build target structure
|
163
|
+
@webapp_dir = @webapp_dir || 'src/main/webapp'
|
164
|
+
Raven.mkdir_recurse(DEFAULT_TARGET)
|
165
|
+
|
166
|
+
puts "Using web application directory #{@webapp_dir}" if RakeFileUtils.verbose_flag
|
167
|
+
|
168
|
+
FileUtils.cp_r(@webapp_dir, DEFAULT_TARGET)
|
169
|
+
|
170
|
+
# Eventually add classes compiled by javac
|
171
|
+
if (File.exist?('target/classes'))
|
172
|
+
Raven.mkdir_recurse(DEFAULT_TARGET + CLASSES_SUBDIR)
|
173
|
+
FileUtils.cp_r('target/classes/.', DEFAULT_TARGET + CLASSES_SUBDIR)
|
174
|
+
end
|
175
|
+
|
176
|
+
# Make lib directory with all dependencies
|
177
|
+
Raven.mkdir_recurse(DEFAULT_TARGET + LIB_SUBDIR)
|
178
|
+
Raven.mk_libs(DEFAULT_TARGET + LIB_SUBDIR, prerequisites)
|
179
|
+
|
180
|
+
# Build the war
|
181
|
+
`jar -cf target/#{name} -C #{DEFAULT_TARGET} .`
|
182
|
+
end
|
183
|
+
|
184
|
+
def webapp_dir=(param)
|
185
|
+
@webapp_dir = param
|
186
|
+
end
|
133
187
|
end
|
134
|
-
end
|
135
|
-
|
136
|
-
# Produces a WAR from a web application directory. Includes the libraries
|
137
|
-
# needed in WEB-INF/lib (as long as the corresponding dependency task is
|
138
|
-
# declared as a prerequisite) and the compiled classes (if there are).
|
139
|
-
#
|
140
|
-
# Can be customized by setting <em>webapp_dir</em> to the directory
|
141
|
-
# containing your web application resources (web.xml, jsp, images, ...).
|
142
|
-
# The default is src/main/webapp.
|
143
|
-
class WarTask < Rake::Task
|
144
|
-
DEFAULT_TARGET = 'target/webapp/'
|
145
|
-
LIB_SUBDIR = 'WEB-INF/lib/'
|
146
|
-
CLASSES_SUBDIR = 'WEB-INF/classes/'
|
147
188
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
189
|
+
# Places all the dependencies in a given directory (useful mostly to
|
190
|
+
# build a distribution). The dependencies are selected from the
|
191
|
+
# prerequisites (using declared dependency tasks). The default
|
192
|
+
# directory is lib. Can be customized by setting <em>target</em>.
|
193
|
+
class LibDirTask < Rake::Task
|
194
|
+
def execute
|
195
|
+
super
|
196
|
+
puts "Copying libraries in #{@target}" if RakeFileUtils.verbose_flag
|
197
|
+
@target = @target || 'lib'
|
198
|
+
Raven.mk_libs(@target, prerequisites)
|
199
|
+
end
|
158
200
|
|
159
|
-
|
160
|
-
|
161
|
-
Raven.mkdir_recurse(DEFAULT_TARGET + CLASSES_SUBDIR)
|
162
|
-
FileUtils.cp_r('target/classes/.', DEFAULT_TARGET + CLASSES_SUBDIR)
|
201
|
+
def target=(param)
|
202
|
+
@target = param
|
163
203
|
end
|
204
|
+
end
|
205
|
+
|
206
|
+
# Executes JavaDoc by passing it everything it needs. Stuff like a
|
207
|
+
# classpath and sources. The result is generated in target/jdoc. Can
|
208
|
+
# be customized exactly in the same way as the javac task.
|
209
|
+
class JavaDocTask < Rake::Task
|
164
210
|
|
165
|
-
|
166
|
-
|
167
|
-
|
211
|
+
def execute
|
212
|
+
super
|
213
|
+
classpath = Raven.build_cp(prerequisites)
|
214
|
+
classpath << "target/classes"
|
215
|
+
@build_path = ["src/main/java"] unless @build_path
|
216
|
+
|
217
|
+
puts "Executing JavaDoc using source path #{@build_path.join(' ')}" if RakeFileUtils.verbose_flag
|
218
|
+
|
219
|
+
Dir.mkdir("target") unless File.exist?("target")
|
220
|
+
Dir.mkdir("target/jdoc") unless File.exist?("target/jdoc")
|
221
|
+
|
222
|
+
packages = Set[]
|
223
|
+
@build_path.each do |d|
|
224
|
+
Dir.glob("#{d}/**/*.java").each do |java|
|
225
|
+
packages << java[(d.length + 1)..(java.rindex('/') - 1)].gsub(%r{[\\/]}, '.')
|
226
|
+
end
|
227
|
+
end
|
228
|
+
packages = packages.to_a
|
229
|
+
|
230
|
+
if (packages.size > 0)
|
231
|
+
puts "javadoc -classpath #{classpath.join(CP_SEP)} -sourcepath #{@build_path.join(CP_SEP)} -d target/jdoc #{packages.join(' ')}" if RakeFileUtils.verbose_flag
|
232
|
+
`javadoc -classpath #{classpath.join(CP_SEP)} -sourcepath #{@build_path.join(CP_SEP)} -d target/jdoc #{packages.join(' ')}`
|
233
|
+
unless $? == 0
|
234
|
+
puts "Build failed, see above errors."
|
235
|
+
exit
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
168
239
|
|
169
|
-
|
170
|
-
|
240
|
+
def build_path
|
241
|
+
@build_path ||= []
|
242
|
+
end
|
171
243
|
end
|
172
244
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
245
|
+
# Wraps a jar file around a Gem. Useful for distributing it around.
|
246
|
+
# The jar is taken from the target directory. You must at least
|
247
|
+
# specify <em>version</em> to produce the Gem. The artifact name and
|
248
|
+
# group name default to the current directory name and its parent
|
249
|
+
# directory name respectively. Convenient if you follow the classic
|
250
|
+
# project/module directory structure. Otherwise, just set the
|
251
|
+
# <em>artifact</em> and <em>group</em> to any value that suits you.
|
252
|
+
class GemWrapTask < Rake::Task
|
253
|
+
attr_writer :version, :artifact, :group
|
254
|
+
|
255
|
+
def execute
|
256
|
+
super
|
257
|
+
puts "Wrapping jar in a Gem" if RakeFileUtils.verbose_flag
|
258
|
+
unless @version
|
259
|
+
puts "A version must be provided to produce a Gem!"
|
260
|
+
end
|
261
|
+
pwd = Dir.pwd
|
262
|
+
@artifact = pwd[(pwd.rindex('/') + 1)..pwd.length] unless @artifact
|
263
|
+
pwd = pwd[0..pwd.rindex('/') - 1]
|
264
|
+
@group = pwd[(pwd.rindex('/') + 1)..pwd.length] unless @group
|
265
|
+
Raven.mkdir_recurse('target/gem/ext')
|
266
|
+
FileUtils.cp(Dir.glob('target/*.jar'), 'target/gem/ext')
|
267
|
+
|
268
|
+
Dir.chdir('target/gem') do
|
269
|
+
spec = Gem::Specification.new do |s|
|
270
|
+
s.platform = Gem::Platform::JAVA
|
271
|
+
s.summary = "Raven wrapped library #{@artifact} from project #{@group}."
|
272
|
+
s.name = "#{@group}-#{@artifact}"
|
273
|
+
s.version = @version
|
274
|
+
s.requirements << 'none'
|
275
|
+
s.require_path = 'ext'
|
276
|
+
s.autorequire = 'rake'
|
277
|
+
s.files = Dir.glob("{ext}/**/*")
|
278
|
+
end
|
279
|
+
Gem::Builder.new(spec).build
|
280
|
+
end
|
281
|
+
FileUtils.mv("target/gem/#{@group}-#{@artifact}-#{@version}-java.gem", 'target')
|
282
|
+
end
|
188
283
|
end
|
189
284
|
|
190
|
-
|
191
|
-
|
285
|
+
# Wraps a jar file around a Gem and automatically installs it in your
|
286
|
+
# local Gem repository. See the gem wrap task for more info (same rules
|
287
|
+
# apply).
|
288
|
+
class GemInstallTask < GemWrapTask
|
289
|
+
def execute
|
290
|
+
super
|
291
|
+
params = [false]
|
292
|
+
params << RAVEN_HOME if defined?(GEMS_IN_HOME)
|
293
|
+
Gem::Installer.new("target/#{@group}-#{@artifact}-#{@version}-java.gem").install(*params)
|
294
|
+
end
|
192
295
|
end
|
193
|
-
end
|
194
|
-
|
195
|
-
# Executes JavaDoc by passing it everything it needs. Stuff like a
|
196
|
-
# classpath and sources. The result is generated in target/jdoc. Can
|
197
|
-
# be customized exactly in the same way as the javac task.
|
198
|
-
class JavaDocTask < Rake::Task
|
199
296
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
@build_path.each do |d|
|
213
|
-
Dir.glob("#{d}/**/*.java").each do |java|
|
214
|
-
packages << java[(d.length + 1)..(java.rindex('/') - 1)].gsub(%r{[\\/]}, '.')
|
297
|
+
private
|
298
|
+
|
299
|
+
# Builds the classpath by getting the path to the jars bundled
|
300
|
+
# in each gem dependency.
|
301
|
+
def self.build_cp(prerequisites)
|
302
|
+
classpath = []
|
303
|
+
Raven.prereq_filter(prerequisites, :gem_deps) do |dep_task|
|
304
|
+
dep_task.gem_deps.each do |gempath|
|
305
|
+
Dir.foreach(gempath + '/ext') do |file|
|
306
|
+
next if file == '.' || file == '..'
|
307
|
+
classpath << gempath + '/ext/' + file
|
308
|
+
end
|
215
309
|
end
|
216
310
|
end
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
311
|
+
classpath
|
312
|
+
end
|
313
|
+
|
314
|
+
# Copies the jars corresponding to each Gem dependency to a given
|
315
|
+
# directory.
|
316
|
+
def self.mk_libs(target, prereq)
|
317
|
+
Raven.mkdir_recurse(target)
|
318
|
+
Raven.prereq_filter(prereq, :gem_deps) do |dep_task|
|
319
|
+
dep_task.gem_deps.each do |gempath|
|
320
|
+
Dir.foreach(gempath + '/ext') do |file|
|
321
|
+
next if file == '.' || file == '..'
|
322
|
+
FileUtils.copy(gempath + '/ext/' + file, target)
|
323
|
+
end
|
225
324
|
end
|
226
325
|
end
|
227
326
|
end
|
228
327
|
|
229
|
-
|
230
|
-
|
328
|
+
# Duck typing selection of prerequisites
|
329
|
+
def self.prereq_filter(prerequisites, respond_to)
|
330
|
+
prerequisites.each do |prereq|
|
331
|
+
prereq_task = Rake::Task[prereq]
|
332
|
+
if prereq_task.respond_to?(respond_to)
|
333
|
+
yield(prereq_task)
|
334
|
+
end
|
335
|
+
end
|
231
336
|
end
|
232
|
-
end
|
233
|
-
|
234
|
-
# Wraps a jar file around a Gem. Useful for distributing it around.
|
235
|
-
# The jar is taken from the target directory. You must at least
|
236
|
-
# specify <em>version</em> to produce the Gem. The artifact name and
|
237
|
-
# group name default to the current directory name and its parent
|
238
|
-
# directory name respectively. Convenient if you follow the classic
|
239
|
-
# project/module directory structure. Otherwise, just set the
|
240
|
-
# <em>artifact</em> and <em>group</em> to any value that suits you.
|
241
|
-
class GemWrapTask < Rake::Task
|
242
|
-
attr_writer :version, :artifact, :group
|
243
337
|
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
338
|
+
# Recursively creates a directory
|
339
|
+
def self.mkdir_recurse(dir)
|
340
|
+
if dir.rindex('/')
|
341
|
+
parent = dir[0, dir.rindex('/')]
|
342
|
+
mkdir_recurse(parent) unless File.exist?(parent)
|
249
343
|
end
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
s.files = Dir.glob("{ext}/**/*")
|
344
|
+
Dir.mkdir(dir) unless File.exist?(dir)
|
345
|
+
end
|
346
|
+
|
347
|
+
# Receursively browse a directory yielding on each file found.
|
348
|
+
def self.browse_files(root)
|
349
|
+
queue = [root]
|
350
|
+
while !queue.empty?
|
351
|
+
filename = queue.pop
|
352
|
+
if File.file?(filename)
|
353
|
+
yield(filename)
|
354
|
+
else
|
355
|
+
Dir.new(filename).each do |child|
|
356
|
+
unless ['..', '.', '.svn', '.cvs'].include?(child)
|
357
|
+
queue.push(filename + "/" + child)
|
358
|
+
end
|
359
|
+
end
|
267
360
|
end
|
268
|
-
Gem::Builder.new(spec).build
|
269
361
|
end
|
270
|
-
FileUtils.mv("target/gem/#{@group}-#{@artifact}-#{@version}-java.gem", 'target')
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
# Wraps a jar file around a Gem and automatically installs it in your
|
275
|
-
# local Gem repository. See the gem wrap task for more info (same rules
|
276
|
-
# apply).
|
277
|
-
class GemInstallTask < GemWrapTask
|
278
|
-
def execute
|
279
|
-
super
|
280
|
-
params = [false]
|
281
|
-
params << RAVEN_HOME if defined?(GEMS_IN_HOME)
|
282
|
-
Gem::Installer.new("target/#{@group}-#{@artifact}-#{@version}-java.gem").install(*params)
|
283
362
|
end
|
363
|
+
|
364
|
+
# Returns the latest file timestamp in a directory structure
|
365
|
+
def self.latest_file(dir)
|
366
|
+
latest = Time.at(0)
|
367
|
+
Raven.browse_files(dir) do |f|
|
368
|
+
change = File.stat(f).ctime
|
369
|
+
latest = change if change > latest
|
370
|
+
end
|
371
|
+
latest
|
372
|
+
end
|
373
|
+
|
284
374
|
end
|
285
375
|
|
286
|
-
private
|
287
376
|
|
288
|
-
#
|
289
|
-
|
290
|
-
|
291
|
-
classpath = []
|
292
|
-
Raven.prereq_filter(prerequisites, :gem_deps) do |dep_task|
|
293
|
-
dep_task.gem_deps.each do |gempath|
|
294
|
-
Dir.foreach(gempath + '/ext') do |file|
|
295
|
-
next if file == '.' || file == '..'
|
296
|
-
classpath << gempath + '/ext/' + file
|
297
|
-
end
|
298
|
-
end
|
299
|
-
end
|
300
|
-
classpath
|
377
|
+
# Shortcut to the Javac task creation. Makes it handy.
|
378
|
+
def javac(args, &block)
|
379
|
+
Raven::JavacTask.define_task(args, &block)
|
301
380
|
end
|
302
381
|
|
303
|
-
#
|
304
|
-
|
305
|
-
|
306
|
-
Raven.mkdir_recurse(target)
|
307
|
-
Raven.prereq_filter(prereq, :gem_deps) do |dep_task|
|
308
|
-
dep_task.gem_deps.each do |gempath|
|
309
|
-
Dir.foreach(gempath + '/ext') do |file|
|
310
|
-
next if file == '.' || file == '..'
|
311
|
-
FileUtils.copy(gempath + '/ext/' + file, target)
|
312
|
-
end
|
313
|
-
end
|
314
|
-
end
|
382
|
+
# Shortcut to jar. Only 3 letters, isn't that beautiful?
|
383
|
+
def jar(args, &block)
|
384
|
+
Raven::JarTask.define_task(args, &block)
|
315
385
|
end
|
316
386
|
|
317
|
-
#
|
318
|
-
def
|
319
|
-
|
320
|
-
prereq_task = Rake::Task[prereq]
|
321
|
-
if prereq_task.respond_to?(respond_to)
|
322
|
-
yield(prereq_task)
|
323
|
-
end
|
324
|
-
end
|
387
|
+
# I think you've got it now.
|
388
|
+
def jar_source(args, &block)
|
389
|
+
Raven::JarSourceTask.define_task(args, &block)
|
325
390
|
end
|
326
391
|
|
327
|
-
|
328
|
-
|
329
|
-
if dir.rindex('/')
|
330
|
-
parent = dir[0, dir.rindex('/')]
|
331
|
-
mkdir_recurse(parent) unless File.exist?(parent)
|
332
|
-
end
|
333
|
-
Dir.mkdir(dir) unless File.exist?(dir)
|
392
|
+
def lib_dir(args, &block)
|
393
|
+
Raven::LibDirTask.define_task(args, &block)
|
334
394
|
end
|
335
395
|
|
336
|
-
|
337
|
-
|
338
|
-
queue = [root]
|
339
|
-
while !queue.empty?
|
340
|
-
filename = queue.pop
|
341
|
-
if File.file?(filename)
|
342
|
-
yield(filename)
|
343
|
-
else
|
344
|
-
Dir.new(filename).each do |child|
|
345
|
-
unless ['..', '.', '.svn', '.cvs'].include?(child)
|
346
|
-
queue.push(filename + "/" + child)
|
347
|
-
end
|
348
|
-
end
|
349
|
-
end
|
350
|
-
end
|
396
|
+
def war(args, &block)
|
397
|
+
Raven::WarTask.define_task(args, &block)
|
351
398
|
end
|
352
399
|
|
353
|
-
|
354
|
-
|
355
|
-
latest = Time.at(0)
|
356
|
-
Raven.browse_files(dir) do |f|
|
357
|
-
change = File.stat(f).ctime
|
358
|
-
latest = change if change > latest
|
359
|
-
end
|
360
|
-
latest
|
400
|
+
def javadoc(args, &block)
|
401
|
+
Raven::JavaDocTask.define_task(args, &block)
|
361
402
|
end
|
362
403
|
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
def
|
368
|
-
|
369
|
-
end
|
370
|
-
|
371
|
-
# Shortcut to jar. Only 3 letters, isn't that beautiful?
|
372
|
-
def jar(args, &block)
|
373
|
-
Raven::JarTask.define_task(args, &block)
|
374
|
-
end
|
375
|
-
|
376
|
-
# I think you've got it now.
|
377
|
-
def jar_source(args, &block)
|
378
|
-
Raven::JarSourceTask.define_task(args, &block)
|
379
|
-
end
|
380
|
-
|
381
|
-
def lib_dir(args, &block)
|
382
|
-
Raven::LibDirTask.define_task(args, &block)
|
383
|
-
end
|
384
|
-
|
385
|
-
def war(args, &block)
|
386
|
-
Raven::WarTask.define_task(args, &block)
|
387
|
-
end
|
388
|
-
|
389
|
-
def javadoc(args, &block)
|
390
|
-
Raven::JavaDocTask.define_task(args, &block)
|
391
|
-
end
|
392
|
-
|
393
|
-
def gem_wrap(args, &block)
|
394
|
-
Raven::GemWrapTask.define_task(args, &block)
|
395
|
-
end
|
396
|
-
|
397
|
-
def gem_wrap_inst(args, &block)
|
398
|
-
Raven::GemInstallTask.define_task(args, &block)
|
399
|
-
end
|
404
|
+
def gem_wrap(args, &block)
|
405
|
+
Raven::GemWrapTask.define_task(args, &block)
|
406
|
+
end
|
407
|
+
|
408
|
+
def gem_wrap_inst(args, &block)
|
409
|
+
Raven::GemInstallTask.define_task(args, &block)
|
410
|
+
end
|
data/lib/raven/repo_builder.rb
CHANGED
@@ -61,12 +61,16 @@ module Raven
|
|
61
61
|
@group_filters
|
62
62
|
end
|
63
63
|
|
64
|
-
def initialize(server, url,
|
65
|
-
@server, @url, @port = server, url, port
|
64
|
+
def initialize(server, port, url, proxy_info)
|
65
|
+
@server, @url, @port, @proxy_info = server, url, port, proxy_info
|
66
66
|
end
|
67
67
|
|
68
68
|
def each
|
69
|
-
|
69
|
+
if @proxy_info
|
70
|
+
http = Net::HTTP::Proxy(*@proxy_info).new(@server, @port)
|
71
|
+
else
|
72
|
+
http = Net::HTTP.new(@server, @port)
|
73
|
+
end
|
70
74
|
folder_regexp = /<img src="\/icons\/folder.gif" alt="\[DIR\]"> <a href="[^\/]*\/">/
|
71
75
|
file_regexp = /<img src="\/icons\/unknown.gif" alt="\[ \]"> <a href="[^"]*">/
|
72
76
|
read_page(http, @url, folder_regexp) do |url1, groupId|
|
@@ -104,12 +108,12 @@ module Raven
|
|
104
108
|
class GemRepoBuilder
|
105
109
|
attr_writer :group_filters
|
106
110
|
|
107
|
-
def initialize(server, port, url)
|
108
|
-
@server, @url = server, url
|
111
|
+
def initialize(server, port, url, proxy_info)
|
112
|
+
@server, @port, @url, @proxy_info = server, port, url, proxy_info
|
109
113
|
end
|
110
114
|
|
111
115
|
def build(overwrite = false)
|
112
|
-
repo = Maven2Repository.new(@server, @url)
|
116
|
+
repo = Maven2Repository.new(@server, @port, @url, @proxy_info)
|
113
117
|
repo.group_filters = @group_filters unless @group_filters.nil?
|
114
118
|
|
115
119
|
Dir.mkdir('gems') unless File.exist?('gems')
|
data/lib/raven/search_install.rb
CHANGED
@@ -19,8 +19,8 @@ require 'net/http'
|
|
19
19
|
module Raven
|
20
20
|
|
21
21
|
class RepoIndexBuilder
|
22
|
-
def initialize(name, server, base_url, port
|
23
|
-
@name, @server, @base_url, @port = name, server, base_url, port
|
22
|
+
def initialize(name, server, base_url, port, proxy_info)
|
23
|
+
@name, @server, @base_url, @port, @proxy_info = name, server, base_url, port, proxy_info
|
24
24
|
end
|
25
25
|
|
26
26
|
def build_idx
|
@@ -28,7 +28,7 @@ module Raven
|
|
28
28
|
require 'zlib'
|
29
29
|
Zlib::GzipWriter.open("#{@name}.mvnidx.gz") do |f|
|
30
30
|
f << @server + "#" + @port + "#" + @base_url + "\n"
|
31
|
-
Raven::Maven2Repository.new(@server, @base_url, @port).each do |artifact, http|
|
31
|
+
Raven::Maven2Repository.new(@server, @base_url, @port, @proxy_info).each do |artifact, http|
|
32
32
|
f << YAML.dump(artifact)
|
33
33
|
end
|
34
34
|
end
|
@@ -36,15 +36,19 @@ module Raven
|
|
36
36
|
end
|
37
37
|
|
38
38
|
class GemSearchInstaller
|
39
|
-
def initialize(server, port, base_url)
|
40
|
-
@server, @base_url, @port = server, base_url, port
|
39
|
+
def initialize(server, port, base_url, proxy_info)
|
40
|
+
@server, @base_url, @port, @proxy_info = server, base_url, port, proxy_info
|
41
41
|
end
|
42
42
|
|
43
43
|
def list_indices
|
44
44
|
indices = []
|
45
|
-
|
45
|
+
if @proxy_info
|
46
|
+
http = Net::HTTP::Proxy(*@proxy_info).new(@server, @port)
|
47
|
+
else
|
48
|
+
http = Net::HTTP.new(@server, @port)
|
49
|
+
end
|
46
50
|
response = http.get(@base_url, nil)
|
47
|
-
expr = /HREF="([^"]*idx.gz)"/
|
51
|
+
expr = /href="([^"]*idx.gz)"|HREF="([^"]*idx.gz)"/
|
48
52
|
if response.message.strip == "OK"
|
49
53
|
response.body.each_line do |line|
|
50
54
|
if expr =~ line
|
@@ -59,7 +63,11 @@ module Raven
|
|
59
63
|
|
60
64
|
def get_indices
|
61
65
|
require 'stringio'
|
62
|
-
|
66
|
+
if @proxy_info
|
67
|
+
http = Net::HTTP::Proxy(*@proxy_info).new(@server, @port)
|
68
|
+
else
|
69
|
+
http = Net::HTTP.new(@server, @port)
|
70
|
+
end
|
63
71
|
|
64
72
|
list_indices.each do |file|
|
65
73
|
http_fn, fs_fn = @base_url + file, RAVEN_HOME + file[0..-4]
|
@@ -153,7 +161,11 @@ module Raven
|
|
153
161
|
FileUtils.mkdir('ext')
|
154
162
|
puts "Installing Gems:"
|
155
163
|
artifacts.each do |artifact|
|
156
|
-
|
164
|
+
if @proxy_info
|
165
|
+
http = Net::HTTP::Proxy(*@proxy_info).new(artifact.server[0], artifact.server[1])
|
166
|
+
else
|
167
|
+
http = Net::HTTP.new(artifact.server[0], artifact.server[1])
|
168
|
+
end
|
157
169
|
puts " - #{artifact.to_s}"
|
158
170
|
gemname = Raven.install_remote_gem(artifact, http, artifact.server[2], true)
|
159
171
|
params = [false]
|
@@ -0,0 +1,247 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Copyright 2006 Matthieu Riou
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require 'net/http'
|
18
|
+
|
19
|
+
module Raven
|
20
|
+
|
21
|
+
class RepoIndexBuilder
|
22
|
+
def initialize(name, server, base_url, port, proxy_info)
|
23
|
+
@name, @server, @base_url, @port, @proxy_info = name, server, base_url, port, proxy_info
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_idx
|
27
|
+
require 'yaml'
|
28
|
+
require 'zlib'
|
29
|
+
Zlib::GzipWriter.open("#{@name}.mvnidx.gz") do |f|
|
30
|
+
f << @server + "#" + @port + "#" + @base_url + "\n"
|
31
|
+
Raven::Maven2Repository.new(@server, @base_url, @port, @proxy_info).each do |artifact, http|
|
32
|
+
f << YAML.dump(artifact)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class GemSearchInstaller
|
39
|
+
def initialize(server, port, base_url, proxy_info)
|
40
|
+
@server, @base_url, @port, @proxy_info = server, base_url, port, proxy_info
|
41
|
+
end
|
42
|
+
|
43
|
+
def list_indices
|
44
|
+
indices = []
|
45
|
+
if @proxy_info
|
46
|
+
http = Net::HTTP::Proxy(*@proxy_info).new(@server, @port)
|
47
|
+
else
|
48
|
+
http = Net::HTTP.new(@server, @port)
|
49
|
+
end
|
50
|
+
response = http.get(@base_url, nil)
|
51
|
+
puts "RESPONSE #{response}"
|
52
|
+
puts "BODY #{response.body}"
|
53
|
+
expr = /href="([^"]*idx.gz)"|HREF="([^"]*idx.gz)"/
|
54
|
+
if response.message.strip == "OK"
|
55
|
+
response.body.each_line do |line|
|
56
|
+
if expr =~ line
|
57
|
+
indices << expr.match(line)[1]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
else
|
61
|
+
puts "Got a bad response from server http://#{@server}:#{@port}/#{@base_url}, couldn't update local index"
|
62
|
+
end
|
63
|
+
indices
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_indices
|
67
|
+
require 'stringio'
|
68
|
+
if @proxy_info
|
69
|
+
http = Net::HTTP::Proxy(*@proxy_info).new(@server, @port)
|
70
|
+
else
|
71
|
+
http = Net::HTTP.new(@server, @port)
|
72
|
+
end
|
73
|
+
|
74
|
+
list_indices.each do |file|
|
75
|
+
http_fn, fs_fn = @base_url + file, RAVEN_HOME + file[0..-4]
|
76
|
+
|
77
|
+
# Checking file size to see if it changed
|
78
|
+
header = http.head(http_fn)
|
79
|
+
zipsize = header["content-length"]
|
80
|
+
oldsize = File.exist?(fs_fn) ? File.new(fs_fn).readline.chomp : '0'
|
81
|
+
|
82
|
+
unless (zipsize.to_i == oldsize.to_i)
|
83
|
+
puts "Refreshing index file #{file[0..-4]}"
|
84
|
+
response = StringIO.new(http.get(@base_url + file, nil).body)
|
85
|
+
zlib = Zlib::GzipReader.new(response)
|
86
|
+
file = File.new(RAVEN_HOME + file[0..-4], 'wb')
|
87
|
+
file << zipsize + "\n"
|
88
|
+
file.write(zlib.read)
|
89
|
+
file.close
|
90
|
+
zlib.close
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def search(artifactId, groupId=nil, versionId=nil)
|
96
|
+
idx_files = Dir[RAVEN_HOME + '*.mvnidx']
|
97
|
+
found = []
|
98
|
+
idx_files.each do |idx_file|
|
99
|
+
puts "Searching in #{idx_file}..."
|
100
|
+
f = File.new(idx_file)
|
101
|
+
found.concat(search_index(f, artifactId, groupId, versionId))
|
102
|
+
end
|
103
|
+
found
|
104
|
+
end
|
105
|
+
|
106
|
+
def search_index(idx_file, artifactId, groupId, versionId)
|
107
|
+
# Removing gz file size header
|
108
|
+
idx_file.gets
|
109
|
+
# Getting server name and gz file size header
|
110
|
+
server_addr = idx_file.gets.chomp.split("#")
|
111
|
+
aid_line = /artifactId: (.*#{artifactId}.*)/
|
112
|
+
gid_line = /groupId: (.*#{groupId}.*)/
|
113
|
+
vid_line = /versionId: "?(#{versionId})"?/
|
114
|
+
|
115
|
+
# a, a+v, a+g, g, v+g, a+v+g
|
116
|
+
found = []
|
117
|
+
while (lines = read_lines(idx_file, 5))
|
118
|
+
ma, mg, mv = false, false, false
|
119
|
+
ma = lines[2].strip =~ aid_line if artifactId
|
120
|
+
mg = lines[1].strip =~ gid_line if groupId
|
121
|
+
mv = lines[3].strip =~ vid_line if versionId
|
122
|
+
if ((ma && groupId.nil? && versionId.nil?) ||
|
123
|
+
(ma && mg && versionId.nil?) ||
|
124
|
+
(ma && mv && groupId.nil?) ||
|
125
|
+
(ma && mg && mv) ||
|
126
|
+
(mg && mv && artifactId.nil?) ||
|
127
|
+
(mg && artifactId.nil? && versionId.nil?))
|
128
|
+
artifact = YAML.load(lines.join("\n"))
|
129
|
+
artifact.server = server_addr
|
130
|
+
found << artifact
|
131
|
+
end
|
132
|
+
end
|
133
|
+
found
|
134
|
+
end
|
135
|
+
|
136
|
+
def read_lines(file, size)
|
137
|
+
lines = []
|
138
|
+
0.upto(size-1) { |m| lines[m] = file.gets }
|
139
|
+
return nil if lines[size-1].nil?
|
140
|
+
lines
|
141
|
+
end
|
142
|
+
|
143
|
+
def install(artifactId, groupId, versionId, all=false, all_versions=false)
|
144
|
+
artifacts = search(artifactId, groupId, versionId).uniq
|
145
|
+
|
146
|
+
if (versionId.nil? && !all_versions)
|
147
|
+
artifacts = filtrate_latest(artifacts)
|
148
|
+
puts artifacts
|
149
|
+
end
|
150
|
+
|
151
|
+
# Selected several artifacts but supposed to have only one
|
152
|
+
if (artifacts.nil?)
|
153
|
+
puts "Gem indices couldn't be found properly (either you provided a wrong URL or the main site is down)."
|
154
|
+
return
|
155
|
+
end
|
156
|
+
raise GemTooManyInstallError.new(artifacts), "Too many artifacts" if (!all && artifacts.size > 1)
|
157
|
+
|
158
|
+
if (artifacts.empty?)
|
159
|
+
puts "Nothing found."
|
160
|
+
else
|
161
|
+
# TODO install from the servers returned by search
|
162
|
+
# Proceeding with installation
|
163
|
+
FileUtils.mkdir('ext')
|
164
|
+
puts "Installing Gems:"
|
165
|
+
artifacts.each do |artifact|
|
166
|
+
if @proxy_info
|
167
|
+
http = Net::HTTP::Proxy(*@proxy_info).new(artifact.server[0], artifact.server[1])
|
168
|
+
else
|
169
|
+
http = Net::HTTP.new(artifact.server[0], artifact.server[1])
|
170
|
+
end
|
171
|
+
puts " - #{artifact.to_s}"
|
172
|
+
gemname = Raven.install_remote_gem(artifact, http, artifact.server[2], true)
|
173
|
+
params = [false]
|
174
|
+
params << RAVEN_HOME if defined?(GEMS_IN_HOME)
|
175
|
+
Gem::Installer.new(gemname).install(*params)
|
176
|
+
FileUtils.rm(gemname)
|
177
|
+
end
|
178
|
+
FileUtils.rm_rf('ext')
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def filtrate_latest(artifacts)
|
183
|
+
# Create a hash with all versions of each artifact
|
184
|
+
arth = {}
|
185
|
+
artifacts.each do |art|
|
186
|
+
key = "#{art.groupId}%#{art.artifactId}"
|
187
|
+
arth[key] ||= []
|
188
|
+
arth[key] << Version.new(art.versionId)
|
189
|
+
end
|
190
|
+
|
191
|
+
arth.keys.collect do |key|
|
192
|
+
last_ver = arth[key].sort[-1].version
|
193
|
+
find_artifact(artifacts, *(key.split('%') << last_ver))
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def find_artifact(artifacts, groupId, artifactId, versionId)
|
198
|
+
artifacts.select do |art|
|
199
|
+
art if art.artifactId == artifactId &&
|
200
|
+
art.groupId == groupId && art.versionId == versionId
|
201
|
+
end[0]
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
# Structured version class used to try to make some sense
|
206
|
+
# out of Maven version numbers. A difficult task indeed.
|
207
|
+
class Version
|
208
|
+
include Comparable
|
209
|
+
attr_reader :timestamp, :ver_struct, :version
|
210
|
+
|
211
|
+
def initialize(version)
|
212
|
+
@version = version
|
213
|
+
elmts = @version.split(/\.|-/)
|
214
|
+
@timestamp = elmts[0].length > 3 ? true : false
|
215
|
+
@ver_struct = elmts.collect do |elmt|
|
216
|
+
val = ''
|
217
|
+
begin
|
218
|
+
val = Integer(elmt)
|
219
|
+
rescue ArgumentError
|
220
|
+
val = elmt
|
221
|
+
end
|
222
|
+
val
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def <=>(ver)
|
227
|
+
false if !(Version === ver)
|
228
|
+
return -1 if @timestamp && !ver.timestamp
|
229
|
+
return 1 if !@timestamp && ver.timestamp
|
230
|
+
# Setting string elements to 0 (mostly weaker) if they need
|
231
|
+
# to be compared to an int otherwise <=> could produce nil
|
232
|
+
@me, you = @ver_struct.dup, ver.ver_struct.dup
|
233
|
+
(0..@me.size).each do |m|
|
234
|
+
if (m < you.size && @me[m].class != you[m].class)
|
235
|
+
@me[m] = 0 if String === @me[m]
|
236
|
+
you[m] = 0 if String === you[m]
|
237
|
+
end
|
238
|
+
end
|
239
|
+
@me <=> you
|
240
|
+
end
|
241
|
+
|
242
|
+
def to_s
|
243
|
+
puts "v#{@version}, ts #{timestamp}, #{ @ver_struct.collect{ |v| v.class }.join('/') }"
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: raven
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.1.
|
7
|
-
date: 2006-11-
|
6
|
+
version: 1.1.2
|
7
|
+
date: 2006-11-23 00:00:00 -08:00
|
8
8
|
summary: Java build system based on Rake and Gem.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -33,6 +33,7 @@ files:
|
|
33
33
|
- bin/raven
|
34
34
|
- lib/raven
|
35
35
|
- lib/raven.rb
|
36
|
+
- lib/raven/search_install.rb~
|
36
37
|
- lib/raven/deps_tasks.rb
|
37
38
|
- lib/raven/gem_init.rb
|
38
39
|
- lib/raven/java_tasks.rb
|