raven 1.1.1 → 1.1.2
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/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
|