raven 1.1.2 → 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 +7 -5
- data/lib/raven/deps_tasks.rb +7 -1
- data/lib/raven/java_tasks.rb +60 -14
- data/lib/raven/java_tasks.rb~ +459 -0
- data/lib/raven/repo_builder.rb +1 -1
- data/lib/raven/search_install.rb +27 -9
- metadata +3 -3
- data/lib/raven/search_install.rb~ +0 -247
data/lib/raven.rb
CHANGED
@@ -34,7 +34,7 @@ module Raven
|
|
34
34
|
opts.on('-m=ARG', '--mavenrepo repo_url', '[repository] Maven repository to build your gem repository from.') { |val| repo_url = val }
|
35
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 }
|
36
36
|
opts.on('-i=ARG', '--index index_url', '[install] URL of a directory containing repository indices.') { |val| index_url = val }
|
37
|
-
opts.on('-
|
37
|
+
opts.on('-p=ARG', '--project group_id', '[install] Install artifacts in the provided project.') { |val| groupId = val }
|
38
38
|
opts.on('-a', '--all', '[install] Install all selected artifacts.') { |val| all = true }
|
39
39
|
opts.on('-v', '--allversions', '[install] Select all versions, not only the latest.') { |val| allver = true }
|
40
40
|
|
@@ -94,9 +94,11 @@ module Raven
|
|
94
94
|
av = artifact.match(/([^:]*):?(.*)/).to_a
|
95
95
|
# Trock to see if we've been passed a version number or an artifact
|
96
96
|
begin
|
97
|
-
Integer(av[1][0..0])
|
98
|
-
|
99
|
-
|
97
|
+
aint = Integer(av[1][0..0])
|
98
|
+
if aint != 0
|
99
|
+
av[2] = av[1]
|
100
|
+
av[1] = ''
|
101
|
+
end
|
100
102
|
rescue
|
101
103
|
end
|
102
104
|
begin
|
@@ -128,7 +130,7 @@ module Raven
|
|
128
130
|
match = match.to_a
|
129
131
|
match.shift
|
130
132
|
puts "Using proxy #{match[2]} and port #{match[3]}"
|
131
|
-
[match[2], match[3]
|
133
|
+
[match[2], match[3].length == 0 ? 80 : Integer(match[3]), match[0], match[1]]
|
132
134
|
else
|
133
135
|
nil
|
134
136
|
end
|
data/lib/raven/deps_tasks.rb
CHANGED
@@ -122,7 +122,13 @@ module Raven
|
|
122
122
|
local = select_gem(gemname, version, gems, true)
|
123
123
|
puts "Using local gem #{local[0].name} (#{local[0].version}) to satisfy dependency #{gemname}" if RakeFileUtils.verbose_flag && local
|
124
124
|
return local if local
|
125
|
-
|
125
|
+
begin
|
126
|
+
gems = Gem::RemoteInstaller.new().search(/.*#{gemname}$/)
|
127
|
+
rescue Exception => rt
|
128
|
+
puts "The gem #{gemname} from your dependencies couldn't be found locally"
|
129
|
+
puts "and the connection to a Gem repository failed."
|
130
|
+
exit
|
131
|
+
end
|
126
132
|
remote = select_gem(gemname, version, gems.flatten, false)
|
127
133
|
puts "Downloading remote gem #{remote[0].name} (#{remote[0].version}) to satisfy dependency #{gemname}" if RakeFileUtils.verbose_flag && remote
|
128
134
|
return remote if remote
|
data/lib/raven/java_tasks.rb
CHANGED
@@ -45,8 +45,8 @@ module Raven
|
|
45
45
|
|
46
46
|
def execute
|
47
47
|
super
|
48
|
-
classpath = Raven.build_cp(prerequisites)
|
49
|
-
classpath << "target/classes"
|
48
|
+
@classpath = Raven.build_cp(prerequisites)
|
49
|
+
@classpath << "target/classes"
|
50
50
|
@build_path = ["src/main/java"] unless @build_path
|
51
51
|
|
52
52
|
puts "Building path #{@build_path.join(' ')}" if RakeFileUtils.verbose_flag
|
@@ -67,9 +67,9 @@ module Raven
|
|
67
67
|
source_pkg = Set.new
|
68
68
|
source_files.each { |src| source_pkg << File.join(File.dirname(src), '*.java') }
|
69
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
|
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 $?.exitstatus == 0
|
73
73
|
puts "Build failed, see above errors."
|
74
74
|
exit
|
75
75
|
end
|
@@ -86,20 +86,58 @@ module Raven
|
|
86
86
|
@build_path = [p]
|
87
87
|
end
|
88
88
|
end
|
89
|
+
|
90
|
+
class JUnitTask < JavacTask
|
91
|
+
def execute
|
92
|
+
@build_path = ["src/test/java"] unless @build_path
|
93
|
+
super
|
94
|
+
unless @test_classes
|
95
|
+
tests = @build_path.collect { |d| Dir.glob("#{d}/**/Test*.java").collect { |sd| sd[d.size+1..-1] } }
|
96
|
+
@test_classes = tests.flatten.collect { |d| d.gsub('/', '.')[0..-6] }
|
97
|
+
end
|
98
|
+
failures = false
|
99
|
+
@test_classes.flatten.each do |tc|
|
100
|
+
puts "Running test #{tc}"
|
101
|
+
result = `java -classpath "#{@classpath.join(CP_SEP)}" junit.textui.TestRunner #{tc}`
|
102
|
+
puts result
|
103
|
+
failures = true if /FAILURES/ =~ result || /ERRORS/ =~ result
|
104
|
+
end
|
105
|
+
if failures
|
106
|
+
puts "There were failures!"
|
107
|
+
exit(1)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_classes
|
112
|
+
@test_classes ||= []
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_classes=(c)
|
116
|
+
@test_classes = [c]
|
117
|
+
end
|
118
|
+
end
|
89
119
|
|
90
120
|
# Builds a jar file from your compiled sources. The jarfile produced
|
91
121
|
# will have the same name as your jar task.
|
92
122
|
class JarTask < Rake::Task
|
93
123
|
def execute
|
94
|
-
super
|
124
|
+
super
|
95
125
|
latest = Raven.latest_file('target/classes')
|
96
|
-
|
97
|
-
|
98
|
-
|
126
|
+
|
127
|
+
# Manifest inclusion
|
128
|
+
mfest_param = @manifest ? "-m #{@manifest}" : ""
|
129
|
+
|
130
|
+
if !File.exist?("target/#{name}") || File.stat("target/#{name}").mtime < latest
|
131
|
+
`jar -cf target/#{name} #{mfest_param} -C target/classes .`
|
132
|
+
puts "Built jar file #{name}." if RakeFileUtils.verbose_flag
|
99
133
|
else
|
100
134
|
puts 'Nothing to do, jar is fresh enough.' if RakeFileUtils.verbose_flag
|
101
135
|
end
|
102
136
|
end
|
137
|
+
|
138
|
+
def manifest=(f)
|
139
|
+
@manifest = f
|
140
|
+
end
|
103
141
|
end
|
104
142
|
|
105
143
|
# Builds a jar file from your sources. Customized by adding directories
|
@@ -127,7 +165,7 @@ module Raven
|
|
127
165
|
mfest_param = @manifest ? "-m #{@manifest}" : ""
|
128
166
|
|
129
167
|
# Building the jar from all sources
|
130
|
-
if !File.exist?("target/#{name}") || File.stat("target/#{name}").
|
168
|
+
if !File.exist?("target/#{name}") || File.stat("target/#{name}").mtime < latest
|
131
169
|
`jar -cf target/#{name} #{mfest_param} -C #{@source_path.pop} .`
|
132
170
|
while (p = @source_path.pop)
|
133
171
|
`jar -uf target/#{name} -C #{p} .`
|
@@ -230,16 +268,20 @@ module Raven
|
|
230
268
|
if (packages.size > 0)
|
231
269
|
puts "javadoc -classpath #{classpath.join(CP_SEP)} -sourcepath #{@build_path.join(CP_SEP)} -d target/jdoc #{packages.join(' ')}" if RakeFileUtils.verbose_flag
|
232
270
|
`javadoc -classpath #{classpath.join(CP_SEP)} -sourcepath #{@build_path.join(CP_SEP)} -d target/jdoc #{packages.join(' ')}`
|
233
|
-
unless
|
234
|
-
puts "
|
271
|
+
unless $?.exitstatus == 0
|
272
|
+
puts "Javadoc failed, see above errors."
|
235
273
|
exit
|
236
274
|
end
|
237
275
|
end
|
238
276
|
end
|
239
|
-
|
277
|
+
|
240
278
|
def build_path
|
241
279
|
@build_path ||= []
|
242
280
|
end
|
281
|
+
|
282
|
+
def build_path=(p)
|
283
|
+
@build_path = [p]
|
284
|
+
end
|
243
285
|
end
|
244
286
|
|
245
287
|
# Wraps a jar file around a Gem. Useful for distributing it around.
|
@@ -365,7 +407,7 @@ module Raven
|
|
365
407
|
def self.latest_file(dir)
|
366
408
|
latest = Time.at(0)
|
367
409
|
Raven.browse_files(dir) do |f|
|
368
|
-
change = File.stat(f).
|
410
|
+
change = File.stat(f).mtime
|
369
411
|
latest = change if change > latest
|
370
412
|
end
|
371
413
|
latest
|
@@ -388,6 +430,10 @@ module Raven
|
|
388
430
|
def jar_source(args, &block)
|
389
431
|
Raven::JarSourceTask.define_task(args, &block)
|
390
432
|
end
|
433
|
+
|
434
|
+
def junit(args, &block)
|
435
|
+
Raven::JUnitTask.define_task(args, &block)
|
436
|
+
end
|
391
437
|
|
392
438
|
def lib_dir(args, &block)
|
393
439
|
Raven::LibDirTask.define_task(args, &block)
|
@@ -0,0 +1,459 @@
|
|
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 'rake'
|
18
|
+
require 'fileutils'
|
19
|
+
require 'set'
|
20
|
+
|
21
|
+
# Monkey patching FileUtils to support filtering in copy.
|
22
|
+
module FileUtils
|
23
|
+
class Entry_
|
24
|
+
alias original copy
|
25
|
+
def copy(dest)
|
26
|
+
unless path['.svn'] || path['.cvs']
|
27
|
+
original(dest)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
module Raven
|
34
|
+
CP_SEP = PLATFORM['mswin'] ? ';' : ':'
|
35
|
+
|
36
|
+
# Executes Javac by passing it everything it needs. Stuff like a
|
37
|
+
# classpath and sources. The classpath is built by checking the
|
38
|
+
# prerequisites of the javac task. When a prerequisite is a dependency
|
39
|
+
# declaration (dependency task), it takes each declared Gems and
|
40
|
+
# adds the jar files found in them to the classpath.
|
41
|
+
#
|
42
|
+
# Can be customized by adding directories to the <em>build_path</em>
|
43
|
+
# using the << operator (if none defined, default is src/main/java).
|
44
|
+
class JavacTask < Rake::Task
|
45
|
+
|
46
|
+
def execute
|
47
|
+
super
|
48
|
+
@classpath = Raven.build_cp(prerequisites)
|
49
|
+
@classpath << "target/classes"
|
50
|
+
@build_path = ["src/main/java"] unless @build_path
|
51
|
+
|
52
|
+
puts "Building path #{@build_path.join(' ')}" if RakeFileUtils.verbose_flag
|
53
|
+
|
54
|
+
Dir.mkdir("target") unless File.exist?("target")
|
55
|
+
Dir.mkdir("target/classes") unless File.exist?("target/classes")
|
56
|
+
# Getting the source files to compile. Filtrating sources already
|
57
|
+
# compiled having a fresh enough class
|
58
|
+
source_files = @build_path.collect do |d|
|
59
|
+
Dir.glob("#{d}/**/*.java").select do |java|
|
60
|
+
classfile = 'target/classes/' + java[d.length, (java.length - 5 - d.length)] + '.class'
|
61
|
+
File.exist?(classfile) ? File.stat(java).mtime > File.stat(classfile).mtime : true
|
62
|
+
end
|
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 $?.exitstatus == 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
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def build_path
|
82
|
+
@build_path ||= []
|
83
|
+
end
|
84
|
+
|
85
|
+
def build_path=(p)
|
86
|
+
@build_path = [p]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
class JUnitTask < JavacTask
|
91
|
+
def execute
|
92
|
+
@build_path = ["src/test/java"] unless @build_path
|
93
|
+
super
|
94
|
+
unless @test_classes
|
95
|
+
puts "IN"
|
96
|
+
tests = @build_path.collect { |d| Dir.glob("#{d}/**/Test*.java").collect { |sd| sd[d.size+1..-1] } }
|
97
|
+
puts tests
|
98
|
+
@test_classes = tests.flatten.collect { |d| d.gsub('/', '.')[0..-6] }
|
99
|
+
puts @test_classes
|
100
|
+
end
|
101
|
+
failures = false
|
102
|
+
@test_classes.flatten.each do |tc|
|
103
|
+
puts "Running test #{tc}"
|
104
|
+
result = `java -classpath "#{@classpath.join(CP_SEP)}" junit.textui.TestRunner #{tc}`
|
105
|
+
puts result
|
106
|
+
failures = true if /FAILURES/ =~ result || /ERRORS/ =~ result
|
107
|
+
end
|
108
|
+
if failures
|
109
|
+
puts "There were failures!"
|
110
|
+
exit(1)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_classes
|
115
|
+
@test_classes ||= []
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_classes=(c)
|
119
|
+
@test_classes = [c]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Builds a jar file from your compiled sources. The jarfile produced
|
124
|
+
# will have the same name as your jar task.
|
125
|
+
class JarTask < Rake::Task
|
126
|
+
def execute
|
127
|
+
super
|
128
|
+
latest = Raven.latest_file('target/classes')
|
129
|
+
|
130
|
+
# Manifest inclusion
|
131
|
+
mfest_param = @manifest ? "-m #{@manifest}" : ""
|
132
|
+
|
133
|
+
if !File.exist?("target/#{name}") || File.stat("target/#{name}").mtime < latest
|
134
|
+
`jar -cf target/#{name} #{mfest_param} -C target/classes .`
|
135
|
+
puts "Built jar file #{name}." if RakeFileUtils.verbose_flag
|
136
|
+
else
|
137
|
+
puts 'Nothing to do, jar is fresh enough.' if RakeFileUtils.verbose_flag
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def manifest=(f)
|
142
|
+
@manifest = f
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Builds a jar file from your sources. Customized by adding directories
|
147
|
+
# to the <em>source_path</em> just like the JavacTask.
|
148
|
+
class JarSourceTask < Rake::Task
|
149
|
+
def execute
|
150
|
+
super
|
151
|
+
# Checking if any of our prerequisites is a JavacTask, if
|
152
|
+
# so we'll just use the build path to construct the jar.
|
153
|
+
Raven.prereq_filter(prerequisites, :build_path) do |javac_task|
|
154
|
+
(@source_path ||= []) << javac_task.build_path
|
155
|
+
end
|
156
|
+
|
157
|
+
# Initializing source path
|
158
|
+
@source_path = ["src/main/java"] unless @source_path
|
159
|
+
@source_path.flatten!
|
160
|
+
|
161
|
+
latest = Time.at(0)
|
162
|
+
@source_path.each do |dir|
|
163
|
+
dir_latest = Raven.latest_file(dir)
|
164
|
+
latest = dir_latest if dir_latest > latest
|
165
|
+
end
|
166
|
+
|
167
|
+
# Manifest inclusion
|
168
|
+
mfest_param = @manifest ? "-m #{@manifest}" : ""
|
169
|
+
|
170
|
+
# Building the jar from all sources
|
171
|
+
if !File.exist?("target/#{name}") || File.stat("target/#{name}").mtime < latest
|
172
|
+
`jar -cf target/#{name} #{mfest_param} -C #{@source_path.pop} .`
|
173
|
+
while (p = @source_path.pop)
|
174
|
+
`jar -uf target/#{name} -C #{p} .`
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def source_path
|
180
|
+
@source_path ||= []
|
181
|
+
end
|
182
|
+
|
183
|
+
def manifest=(f)
|
184
|
+
@manifest = f
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
# Produces a WAR from a web application directory. Includes the libraries
|
189
|
+
# needed in WEB-INF/lib (as long as the corresponding dependency task is
|
190
|
+
# declared as a prerequisite) and the compiled classes (if there are).
|
191
|
+
#
|
192
|
+
# Can be customized by setting <em>webapp_dir</em> to the directory
|
193
|
+
# containing your web application resources (web.xml, jsp, images, ...).
|
194
|
+
# The default is src/main/webapp.
|
195
|
+
class WarTask < Rake::Task
|
196
|
+
DEFAULT_TARGET = 'target/webapp/'
|
197
|
+
LIB_SUBDIR = 'WEB-INF/lib/'
|
198
|
+
CLASSES_SUBDIR = 'WEB-INF/classes/'
|
199
|
+
|
200
|
+
def execute
|
201
|
+
super
|
202
|
+
|
203
|
+
# Build target structure
|
204
|
+
@webapp_dir = @webapp_dir || 'src/main/webapp'
|
205
|
+
Raven.mkdir_recurse(DEFAULT_TARGET)
|
206
|
+
|
207
|
+
puts "Using web application directory #{@webapp_dir}" if RakeFileUtils.verbose_flag
|
208
|
+
|
209
|
+
FileUtils.cp_r(@webapp_dir, DEFAULT_TARGET)
|
210
|
+
|
211
|
+
# Eventually add classes compiled by javac
|
212
|
+
if (File.exist?('target/classes'))
|
213
|
+
Raven.mkdir_recurse(DEFAULT_TARGET + CLASSES_SUBDIR)
|
214
|
+
FileUtils.cp_r('target/classes/.', DEFAULT_TARGET + CLASSES_SUBDIR)
|
215
|
+
end
|
216
|
+
|
217
|
+
# Make lib directory with all dependencies
|
218
|
+
Raven.mkdir_recurse(DEFAULT_TARGET + LIB_SUBDIR)
|
219
|
+
Raven.mk_libs(DEFAULT_TARGET + LIB_SUBDIR, prerequisites)
|
220
|
+
|
221
|
+
# Build the war
|
222
|
+
`jar -cf target/#{name} -C #{DEFAULT_TARGET} .`
|
223
|
+
end
|
224
|
+
|
225
|
+
def webapp_dir=(param)
|
226
|
+
@webapp_dir = param
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
# Places all the dependencies in a given directory (useful mostly to
|
231
|
+
# build a distribution). The dependencies are selected from the
|
232
|
+
# prerequisites (using declared dependency tasks). The default
|
233
|
+
# directory is lib. Can be customized by setting <em>target</em>.
|
234
|
+
class LibDirTask < Rake::Task
|
235
|
+
def execute
|
236
|
+
super
|
237
|
+
puts "Copying libraries in #{@target}" if RakeFileUtils.verbose_flag
|
238
|
+
@target = @target || 'lib'
|
239
|
+
Raven.mk_libs(@target, prerequisites)
|
240
|
+
end
|
241
|
+
|
242
|
+
def target=(param)
|
243
|
+
@target = param
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
# Executes JavaDoc by passing it everything it needs. Stuff like a
|
248
|
+
# classpath and sources. The result is generated in target/jdoc. Can
|
249
|
+
# be customized exactly in the same way as the javac task.
|
250
|
+
class JavaDocTask < Rake::Task
|
251
|
+
|
252
|
+
def execute
|
253
|
+
super
|
254
|
+
classpath = Raven.build_cp(prerequisites)
|
255
|
+
classpath << "target/classes"
|
256
|
+
@build_path = ["src/main/java"] unless @build_path
|
257
|
+
|
258
|
+
puts "Executing JavaDoc using source path #{@build_path.join(' ')}" if RakeFileUtils.verbose_flag
|
259
|
+
|
260
|
+
Dir.mkdir("target") unless File.exist?("target")
|
261
|
+
Dir.mkdir("target/jdoc") unless File.exist?("target/jdoc")
|
262
|
+
|
263
|
+
packages = Set[]
|
264
|
+
@build_path.each do |d|
|
265
|
+
Dir.glob("#{d}/**/*.java").each do |java|
|
266
|
+
packages << java[(d.length + 1)..(java.rindex('/') - 1)].gsub(%r{[\\/]}, '.')
|
267
|
+
end
|
268
|
+
end
|
269
|
+
packages = packages.to_a
|
270
|
+
|
271
|
+
if (packages.size > 0)
|
272
|
+
puts "javadoc -classpath #{classpath.join(CP_SEP)} -sourcepath #{@build_path.join(CP_SEP)} -d target/jdoc #{packages.join(' ')}" if RakeFileUtils.verbose_flag
|
273
|
+
`javadoc -classpath #{classpath.join(CP_SEP)} -sourcepath #{@build_path.join(CP_SEP)} -d target/jdoc #{packages.join(' ')}`
|
274
|
+
unless $?.exitstatus == 0
|
275
|
+
puts "Javadoc failed, see above errors."
|
276
|
+
exit
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def build_path
|
282
|
+
@build_path ||= []
|
283
|
+
end
|
284
|
+
|
285
|
+
def build_path=(p)
|
286
|
+
@build_path = [p]
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
# Wraps a jar file around a Gem. Useful for distributing it around.
|
291
|
+
# The jar is taken from the target directory. You must at least
|
292
|
+
# specify <em>version</em> to produce the Gem. The artifact name and
|
293
|
+
# group name default to the current directory name and its parent
|
294
|
+
# directory name respectively. Convenient if you follow the classic
|
295
|
+
# project/module directory structure. Otherwise, just set the
|
296
|
+
# <em>artifact</em> and <em>group</em> to any value that suits you.
|
297
|
+
class GemWrapTask < Rake::Task
|
298
|
+
attr_writer :version, :artifact, :group
|
299
|
+
|
300
|
+
def execute
|
301
|
+
super
|
302
|
+
puts "Wrapping jar in a Gem" if RakeFileUtils.verbose_flag
|
303
|
+
unless @version
|
304
|
+
puts "A version must be provided to produce a Gem!"
|
305
|
+
end
|
306
|
+
pwd = Dir.pwd
|
307
|
+
@artifact = pwd[(pwd.rindex('/') + 1)..pwd.length] unless @artifact
|
308
|
+
pwd = pwd[0..pwd.rindex('/') - 1]
|
309
|
+
@group = pwd[(pwd.rindex('/') + 1)..pwd.length] unless @group
|
310
|
+
Raven.mkdir_recurse('target/gem/ext')
|
311
|
+
FileUtils.cp(Dir.glob('target/*.jar'), 'target/gem/ext')
|
312
|
+
|
313
|
+
Dir.chdir('target/gem') do
|
314
|
+
spec = Gem::Specification.new do |s|
|
315
|
+
s.platform = Gem::Platform::JAVA
|
316
|
+
s.summary = "Raven wrapped library #{@artifact} from project #{@group}."
|
317
|
+
s.name = "#{@group}-#{@artifact}"
|
318
|
+
s.version = @version
|
319
|
+
s.requirements << 'none'
|
320
|
+
s.require_path = 'ext'
|
321
|
+
s.autorequire = 'rake'
|
322
|
+
s.files = Dir.glob("{ext}/**/*")
|
323
|
+
end
|
324
|
+
Gem::Builder.new(spec).build
|
325
|
+
end
|
326
|
+
FileUtils.mv("target/gem/#{@group}-#{@artifact}-#{@version}-java.gem", 'target')
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
# Wraps a jar file around a Gem and automatically installs it in your
|
331
|
+
# local Gem repository. See the gem wrap task for more info (same rules
|
332
|
+
# apply).
|
333
|
+
class GemInstallTask < GemWrapTask
|
334
|
+
def execute
|
335
|
+
super
|
336
|
+
params = [false]
|
337
|
+
params << RAVEN_HOME if defined?(GEMS_IN_HOME)
|
338
|
+
Gem::Installer.new("target/#{@group}-#{@artifact}-#{@version}-java.gem").install(*params)
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
private
|
343
|
+
|
344
|
+
# Builds the classpath by getting the path to the jars bundled
|
345
|
+
# in each gem dependency.
|
346
|
+
def self.build_cp(prerequisites)
|
347
|
+
classpath = []
|
348
|
+
Raven.prereq_filter(prerequisites, :gem_deps) do |dep_task|
|
349
|
+
dep_task.gem_deps.each do |gempath|
|
350
|
+
Dir.foreach(gempath + '/ext') do |file|
|
351
|
+
next if file == '.' || file == '..'
|
352
|
+
classpath << gempath + '/ext/' + file
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|
356
|
+
classpath
|
357
|
+
end
|
358
|
+
|
359
|
+
# Copies the jars corresponding to each Gem dependency to a given
|
360
|
+
# directory.
|
361
|
+
def self.mk_libs(target, prereq)
|
362
|
+
Raven.mkdir_recurse(target)
|
363
|
+
Raven.prereq_filter(prereq, :gem_deps) do |dep_task|
|
364
|
+
dep_task.gem_deps.each do |gempath|
|
365
|
+
Dir.foreach(gempath + '/ext') do |file|
|
366
|
+
next if file == '.' || file == '..'
|
367
|
+
FileUtils.copy(gempath + '/ext/' + file, target)
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
# Duck typing selection of prerequisites
|
374
|
+
def self.prereq_filter(prerequisites, respond_to)
|
375
|
+
prerequisites.each do |prereq|
|
376
|
+
prereq_task = Rake::Task[prereq]
|
377
|
+
if prereq_task.respond_to?(respond_to)
|
378
|
+
yield(prereq_task)
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
# Recursively creates a directory
|
384
|
+
def self.mkdir_recurse(dir)
|
385
|
+
if dir.rindex('/')
|
386
|
+
parent = dir[0, dir.rindex('/')]
|
387
|
+
mkdir_recurse(parent) unless File.exist?(parent)
|
388
|
+
end
|
389
|
+
Dir.mkdir(dir) unless File.exist?(dir)
|
390
|
+
end
|
391
|
+
|
392
|
+
# Receursively browse a directory yielding on each file found.
|
393
|
+
def self.browse_files(root)
|
394
|
+
queue = [root]
|
395
|
+
while !queue.empty?
|
396
|
+
filename = queue.pop
|
397
|
+
if File.file?(filename)
|
398
|
+
yield(filename)
|
399
|
+
else
|
400
|
+
Dir.new(filename).each do |child|
|
401
|
+
unless ['..', '.', '.svn', '.cvs'].include?(child)
|
402
|
+
queue.push(filename + "/" + child)
|
403
|
+
end
|
404
|
+
end
|
405
|
+
end
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
# Returns the latest file timestamp in a directory structure
|
410
|
+
def self.latest_file(dir)
|
411
|
+
latest = Time.at(0)
|
412
|
+
Raven.browse_files(dir) do |f|
|
413
|
+
change = File.stat(f).mtime
|
414
|
+
latest = change if change > latest
|
415
|
+
end
|
416
|
+
latest
|
417
|
+
end
|
418
|
+
|
419
|
+
end
|
420
|
+
|
421
|
+
|
422
|
+
# Shortcut to the Javac task creation. Makes it handy.
|
423
|
+
def javac(args, &block)
|
424
|
+
Raven::JavacTask.define_task(args, &block)
|
425
|
+
end
|
426
|
+
|
427
|
+
# Shortcut to jar. Only 3 letters, isn't that beautiful?
|
428
|
+
def jar(args, &block)
|
429
|
+
Raven::JarTask.define_task(args, &block)
|
430
|
+
end
|
431
|
+
|
432
|
+
# I think you've got it now.
|
433
|
+
def jar_source(args, &block)
|
434
|
+
Raven::JarSourceTask.define_task(args, &block)
|
435
|
+
end
|
436
|
+
|
437
|
+
def junit(args, &block)
|
438
|
+
Raven::JUnitTask.define_task(args, &block)
|
439
|
+
end
|
440
|
+
|
441
|
+
def lib_dir(args, &block)
|
442
|
+
Raven::LibDirTask.define_task(args, &block)
|
443
|
+
end
|
444
|
+
|
445
|
+
def war(args, &block)
|
446
|
+
Raven::WarTask.define_task(args, &block)
|
447
|
+
end
|
448
|
+
|
449
|
+
def javadoc(args, &block)
|
450
|
+
Raven::JavaDocTask.define_task(args, &block)
|
451
|
+
end
|
452
|
+
|
453
|
+
def gem_wrap(args, &block)
|
454
|
+
Raven::GemWrapTask.define_task(args, &block)
|
455
|
+
end
|
456
|
+
|
457
|
+
def gem_wrap_inst(args, &block)
|
458
|
+
Raven::GemInstallTask.define_task(args, &block)
|
459
|
+
end
|
data/lib/raven/repo_builder.rb
CHANGED
data/lib/raven/search_install.rb
CHANGED
@@ -107,11 +107,13 @@ module Raven
|
|
107
107
|
# Getting server name and gz file size header
|
108
108
|
server_addr = idx_file.gets.chomp.split("#")
|
109
109
|
aid_line = /artifactId: (.*#{artifactId}.*)/
|
110
|
+
aidx_line = /artifactId: (#{artifactId})$/
|
110
111
|
gid_line = /groupId: (.*#{groupId}.*)/
|
111
112
|
vid_line = /versionId: "?(#{versionId})"?/
|
112
113
|
|
113
114
|
# a, a+v, a+g, g, v+g, a+v+g
|
114
115
|
found = []
|
116
|
+
exact_match = false
|
115
117
|
while (lines = read_lines(idx_file, 5))
|
116
118
|
ma, mg, mv = false, false, false
|
117
119
|
ma = lines[2].strip =~ aid_line if artifactId
|
@@ -123,9 +125,18 @@ module Raven
|
|
123
125
|
(ma && mg && mv) ||
|
124
126
|
(mg && mv && artifactId.nil?) ||
|
125
127
|
(mg && artifactId.nil? && versionId.nil?))
|
126
|
-
|
127
|
-
|
128
|
-
|
128
|
+
artifact = YAML.load(lines.join("\n"))
|
129
|
+
artifact.server = server_addr
|
130
|
+
# We have an exact match, the rules change, only other exact matches
|
131
|
+
# get selected
|
132
|
+
if lines[2].strip =~ aidx_line
|
133
|
+
unless exact_match
|
134
|
+
exact_match = true
|
135
|
+
found = []
|
136
|
+
end
|
137
|
+
found << artifact
|
138
|
+
end
|
139
|
+
found << artifact unless exact_match
|
129
140
|
end
|
130
141
|
end
|
131
142
|
found
|
@@ -143,7 +154,6 @@ module Raven
|
|
143
154
|
|
144
155
|
if (versionId.nil? && !all_versions)
|
145
156
|
artifacts = filtrate_latest(artifacts)
|
146
|
-
puts artifacts
|
147
157
|
end
|
148
158
|
|
149
159
|
# Selected several artifacts but supposed to have only one
|
@@ -151,20 +161,20 @@ module Raven
|
|
151
161
|
puts "Gem indices couldn't be found properly (either you provided a wrong URL or the main site is down)."
|
152
162
|
return
|
153
163
|
end
|
154
|
-
raise GemTooManyInstallError.new(artifacts)
|
164
|
+
raise GemTooManyInstallError.new(artifacts) if (!all && artifacts.size > 1)
|
155
165
|
|
156
166
|
if (artifacts.empty?)
|
157
167
|
puts "Nothing found."
|
158
168
|
else
|
159
169
|
# TODO install from the servers returned by search
|
160
170
|
# Proceeding with installation
|
161
|
-
FileUtils.mkdir('ext')
|
171
|
+
FileUtils.mkdir('ext') unless File.exist?('ext')
|
162
172
|
puts "Installing Gems:"
|
163
173
|
artifacts.each do |artifact|
|
164
174
|
if @proxy_info
|
165
175
|
http = Net::HTTP::Proxy(*@proxy_info).new(artifact.server[0], artifact.server[1])
|
166
176
|
else
|
167
|
-
http = Net::HTTP.new(artifact.server[0], artifact.server[1])
|
177
|
+
http = Net::HTTP.new(artifact.server[0], Integer(artifact.server[1]))
|
168
178
|
end
|
169
179
|
puts " - #{artifact.to_s}"
|
170
180
|
gemname = Raven.install_remote_gem(artifact, http, artifact.server[2], true)
|
@@ -225,15 +235,23 @@ module Raven
|
|
225
235
|
false if !(Version === ver)
|
226
236
|
return -1 if @timestamp && !ver.timestamp
|
227
237
|
return 1 if !@timestamp && ver.timestamp
|
238
|
+
# Adding 0 to the end of the shortest one to get the same
|
239
|
+
# size, JRuby considers size first (even if size doesn't
|
240
|
+
# always matter)
|
241
|
+
@me, you = @ver_struct.dup, ver.ver_struct.dup
|
242
|
+
if (@me.size != you.size)
|
243
|
+
shorty = @me.size > you.size ? you : @me
|
244
|
+
biggy = @me.size > you.size ? @me : you
|
245
|
+
(shorty.size..biggy.size-1).each { |m| shorty[m] = 0 }
|
246
|
+
end
|
228
247
|
# Setting string elements to 0 (mostly weaker) if they need
|
229
248
|
# to be compared to an int otherwise <=> could produce nil
|
230
|
-
@me, you = @ver_struct.dup, ver.ver_struct.dup
|
231
249
|
(0..@me.size).each do |m|
|
232
250
|
if (m < you.size && @me[m].class != you[m].class)
|
233
251
|
@me[m] = 0 if String === @me[m]
|
234
252
|
you[m] = 0 if String === you[m]
|
235
253
|
end
|
236
|
-
end
|
254
|
+
end
|
237
255
|
@me <=> you
|
238
256
|
end
|
239
257
|
|
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.
|
7
|
-
date: 2006-
|
6
|
+
version: "1.2"
|
7
|
+
date: 2006-12-18 00:00:00 -08:00
|
8
8
|
summary: Java build system based on Rake and Gem.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -33,7 +33,7 @@ files:
|
|
33
33
|
- bin/raven
|
34
34
|
- lib/raven
|
35
35
|
- lib/raven.rb
|
36
|
-
- lib/raven/
|
36
|
+
- lib/raven/java_tasks.rb~
|
37
37
|
- lib/raven/deps_tasks.rb
|
38
38
|
- lib/raven/gem_init.rb
|
39
39
|
- lib/raven/java_tasks.rb
|
@@ -1,247 +0,0 @@
|
|
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
|