maven-tools 0.32.5 → 0.33.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/maven/tools/artifact.rb +142 -0
- data/lib/maven/tools/coordinate.rb +48 -9
- data/lib/maven/tools/dsl.rb +757 -0
- data/lib/maven/tools/gemspec_dependencies.rb +52 -0
- data/lib/maven/tools/jarfile.rb +94 -20
- data/lib/maven/tools/model.rb +359 -0
- data/lib/maven/tools/pom.rb +103 -0
- data/lib/maven/tools/version.rb +1 -1
- data/lib/maven/tools/versions.rb +3 -2
- data/lib/maven/tools/visitor.rb +160 -0
- data/spec/artifact_spec.rb +39 -0
- data/spec/coordinate_spec.rb +7 -2
- data/spec/gemfile/bouncy-castle-version.rb +4 -0
- data/spec/gemfile_include_jars/bouncy-castle-version.rb +4 -0
- data/spec/gemfile_with_extras/bouncy-castle-version.rb +4 -0
- data/spec/gemfile_with_source/bouncy-castle-version.rb +4 -0
- data/spec/gemspec/bouncy-castle-version.rb +4 -0
- data/spec/gemspec_dependencies_spec.rb +41 -0
- data/spec/gemspec_in_profile/bouncy-castle-version.rb +4 -0
- data/spec/gemspec_include_jars/bouncy-castle-version.rb +4 -0
- data/spec/gemspec_with_extras/bouncy-castle-version.rb +4 -0
- data/spec/gemspec_with_source/bouncy-castle-version.rb +4 -0
- data/spec/jarfile_spec.rb +2 -1
- data/spec/pom_spec.rb +20 -0
- data/spec/spec_helper.rb +5 -0
- metadata +109 -89
@@ -0,0 +1,142 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2013 Christian Meier
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
5
|
+
# this software and associated documentation files (the "Software"), to deal in
|
6
|
+
# the Software without restriction, including without limitation the rights to
|
7
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
8
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in all
|
12
|
+
# copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
16
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
17
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
18
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
19
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
#
|
21
|
+
require 'maven/tools/coordinate'
|
22
|
+
module Maven
|
23
|
+
module Tools
|
24
|
+
class Artifact < Hash
|
25
|
+
|
26
|
+
class Helper
|
27
|
+
include Coordinate
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.new_local( path, type, options = {} )
|
31
|
+
name = File.basename( path ).sub( /.#{type}$/, '' )
|
32
|
+
if ind = name.rindex( '-' )
|
33
|
+
version = name[ind + 1..-1]
|
34
|
+
name = name[0..ind - 1]
|
35
|
+
else
|
36
|
+
version = '0'
|
37
|
+
end
|
38
|
+
self.new( "ruby.maven-tools.#{type}", name, type,
|
39
|
+
nil, version, nil,
|
40
|
+
options.merge( { :system_path => path,
|
41
|
+
:scope => :system } ) )
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.from( type, *args )
|
45
|
+
if args.last.is_a? Hash
|
46
|
+
options = args.last.dup
|
47
|
+
args = args[0..-2]
|
48
|
+
end
|
49
|
+
helper = Helper.new
|
50
|
+
case args.size
|
51
|
+
when 1
|
52
|
+
# jar "asd:Asd:123
|
53
|
+
# jar "asd:Asd:123:test"
|
54
|
+
# jar "asd:Asd:123:[dsa:rew,fe:fer]"
|
55
|
+
# jar "asd:Asd:123:test:[dsa:rew,fe:fer]"
|
56
|
+
group_id, artifact_id, version, classifier, exclusions = args[0].split( /:/ )
|
57
|
+
self.new( group_id, artifact_id, type,
|
58
|
+
version, classifier, exclusions,
|
59
|
+
options )
|
60
|
+
when 2
|
61
|
+
# jar "asd:Asd", 123
|
62
|
+
# jar "asd:Asd:test", 123
|
63
|
+
# jar "asd:Asd:[dsa:rew,fe:fer]", 123
|
64
|
+
# jar "asd:Asd:test:[dsa:rew,fe:fer]", 123
|
65
|
+
group_id, artifact_id, classifier, exclusions = args[0].split( /:/ )
|
66
|
+
self.new( group_id, artifact_id, type,
|
67
|
+
helper.to_version( args[ 1 ] ),
|
68
|
+
classifier, exclusions,
|
69
|
+
options )
|
70
|
+
when 3
|
71
|
+
# jar "asd:Asd",'>123', '<345'
|
72
|
+
# jar "asd:Asd:test",'>123', '<345'
|
73
|
+
# jar "asd:Asd:[dsa:rew,fe:fer]",'>123', '<345'
|
74
|
+
# jar "asd:Asd:test:[dsa:rew,fe:fer]",'>123', '<345'
|
75
|
+
# jar "asd:Asd:test:[dsa:rew,fe:fer]", '123', 'source'
|
76
|
+
v = helper.to_version( *args[1..-1] )
|
77
|
+
case v
|
78
|
+
when String
|
79
|
+
group_id, artifact_id, classifier, exclusions = args[0].split( /:/ )
|
80
|
+
self.new( group_id, artifact_id, type,
|
81
|
+
v, classifier, exclusions,
|
82
|
+
options )
|
83
|
+
else
|
84
|
+
group_id, artifact_id = args[0].split( /:/ )
|
85
|
+
self.new( group_id, artifact_id, type,
|
86
|
+
args[1], args[2], nil,
|
87
|
+
options )
|
88
|
+
end
|
89
|
+
else
|
90
|
+
nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.from_coordinate( coord )
|
95
|
+
args = coord.split( /:/ )
|
96
|
+
new( *args )
|
97
|
+
end
|
98
|
+
|
99
|
+
def initialize( group_id, artifact_id, type,
|
100
|
+
version = nil, classifier = nil, exclusions = nil,
|
101
|
+
options = {} )
|
102
|
+
if exclusions.nil?
|
103
|
+
if version.nil? and !classifier.nil?
|
104
|
+
version = classifier
|
105
|
+
classifier = nil
|
106
|
+
elsif classifier.is_a?( Array )
|
107
|
+
exclusions = classifier#version
|
108
|
+
#version = classifier
|
109
|
+
classifier = nil
|
110
|
+
end
|
111
|
+
end
|
112
|
+
self[ :type ] = type
|
113
|
+
self[ :group_id ] = group_id
|
114
|
+
self[ :artifact_id ] = artifact_id
|
115
|
+
self[ :version ] = version
|
116
|
+
self[ :classifier ] = classifier if classifier
|
117
|
+
self[ :exclusions ] = exclusions if exclusions
|
118
|
+
if options
|
119
|
+
self[ :group_id ] ||= options[ :group_id ]
|
120
|
+
self[ :artifact_id ] ||= options[ :artifact_id ]
|
121
|
+
self[ :version ] ||= options[ :version ]
|
122
|
+
self[ :classifier ] ||= options[ :classifier ] if options[ :classifier ]
|
123
|
+
self[ :exclusions ] ||= options[ :exclusions ] if options[ :exclusions ]
|
124
|
+
options.delete( :group_id )
|
125
|
+
options.delete( :artifact_id )
|
126
|
+
options.delete( :version )
|
127
|
+
options.delete( :classifier )
|
128
|
+
options.delete( :exclusions )
|
129
|
+
self.merge!( options )
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def gav
|
134
|
+
[ self[:group_id], self[:artifact_id], self[:version], self[:classifier] ].select { |o| o }.join( ':' )
|
135
|
+
end
|
136
|
+
|
137
|
+
def to_s
|
138
|
+
[ self[:group_id], self[:artifact_id], self[:type], self[:classifier], self[:version], key?( :exclusions )? self[:exclusions].inspect.gsub( /[" ]/, '' ) : nil ].select { |o| o }.join( ':' )
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -21,25 +21,64 @@
|
|
21
21
|
module Maven
|
22
22
|
module Tools
|
23
23
|
module Coordinate
|
24
|
-
|
25
|
-
def to_coordinate(line)
|
24
|
+
def to_split_coordinate( line )
|
26
25
|
if line =~ /^\s*(jar|pom)\s/
|
27
26
|
packaging = line.strip.sub(/\s+.*/, '')
|
28
27
|
|
29
28
|
# Remove packaging, comments and whitespaces
|
30
29
|
sanitized_line = line.sub(/\s*[a-z]+\s+/, '').sub(/#.*/,'').gsub(/\s+/,'')
|
31
30
|
|
32
|
-
# Remove version(s) and quotes to find the group id, artifact id and classifier
|
33
|
-
group_id, artifact_id, classifier = sanitized_line.split(',')[0].gsub(/['"]/, '').split(/:/)
|
34
31
|
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
exclusions = nil
|
33
|
+
sanitized_line.gsub!( /[,:](\[.+:.+\]|'\[.+:.+\]'|"\[.+:.+\]")/ ) do |match|
|
34
|
+
exclusions = match.gsub( /['"]/, '' )[2..-2].split( /,\s*/ )
|
35
|
+
nil
|
36
|
+
end
|
38
37
|
|
39
|
-
|
38
|
+
# split to compartments
|
39
|
+
parts = sanitized_line.split( /[,]/ ).collect{|o| o.gsub( /['"]/, '' ) }
|
40
|
+
# fix no version on one argument
|
41
|
+
if parts.size == 1
|
42
|
+
parts << '[0,)'
|
43
|
+
end
|
44
|
+
|
45
|
+
# split first argument
|
46
|
+
parts[ 0 ] = parts[ 0 ].split( /:/ )
|
47
|
+
parts.flatten!
|
48
|
+
|
49
|
+
# convert ruby version to maven version
|
50
|
+
versions = parts.select { |i| i.match( /[~><=!]/ ) }
|
51
|
+
if ! versions.empty?
|
52
|
+
version = to_version( *versions )
|
53
|
+
parts = parts - versions
|
54
|
+
parts << version
|
55
|
+
else
|
56
|
+
# concat maven version ranges
|
57
|
+
versions = parts.select { |i| i.match( /[\[\]()]/ ) }
|
58
|
+
if ! versions.empty?
|
59
|
+
version = versions.join( ',' )
|
60
|
+
parts = parts - versions
|
61
|
+
parts << version
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# insert packing and exclusion
|
66
|
+
parts.insert( 2, packaging )
|
67
|
+
parts << exclusions
|
68
|
+
|
69
|
+
# make sure there are not nils
|
70
|
+
parts.select { |o| !o.nil? }
|
40
71
|
end
|
41
72
|
end
|
42
73
|
|
74
|
+
def to_coordinate( line )
|
75
|
+
result = to_split_coordinate( line )
|
76
|
+
if result
|
77
|
+
exclusion = result.last.inspect.gsub( /[" ]/, '' )
|
78
|
+
( result[0..-2] + [ exclusion ] ).join( ':' )
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
43
82
|
def group_artifact(*args)
|
44
83
|
case args.size
|
45
84
|
when 1
|
@@ -109,4 +148,4 @@ module Maven
|
|
109
148
|
end
|
110
149
|
end
|
111
150
|
end
|
112
|
-
end
|
151
|
+
end
|
@@ -0,0 +1,757 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'maven/tools/gemspec_dependencies'
|
3
|
+
require 'maven/tools/artifact'
|
4
|
+
require 'maven/tools/jarfile'
|
5
|
+
require 'maven/tools/versions'
|
6
|
+
|
7
|
+
module Maven
|
8
|
+
module Tools
|
9
|
+
module DSL
|
10
|
+
|
11
|
+
def tesla( &block )
|
12
|
+
@model = Model.new
|
13
|
+
@model.model_version = '4.0.0'
|
14
|
+
@model.name = File.basename( basedir )
|
15
|
+
@model.group_id = 'dummy'
|
16
|
+
@model.artifact_id = model.name
|
17
|
+
@model.version = '0.0.0'
|
18
|
+
@context = :project
|
19
|
+
nested_block( :project, @model, block ) if block
|
20
|
+
result = @model
|
21
|
+
@context = nil
|
22
|
+
@model = nil
|
23
|
+
result
|
24
|
+
end
|
25
|
+
alias :maven :tesla
|
26
|
+
|
27
|
+
def model
|
28
|
+
@model
|
29
|
+
end
|
30
|
+
|
31
|
+
def eval_pom( src, reference_file = '.' )
|
32
|
+
@source = reference_file
|
33
|
+
eval( src )
|
34
|
+
ensure
|
35
|
+
@source = nil
|
36
|
+
@basedir = nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def basedir( basedir = nil )
|
40
|
+
@basedir ||= basedir if basedir
|
41
|
+
if @source
|
42
|
+
@basedir ||= File.directory?( @source ) ? @source :
|
43
|
+
File.dirname( File.expand_path( @source ) )
|
44
|
+
end
|
45
|
+
@basedir ||= File.expand_path( '.' )
|
46
|
+
end
|
47
|
+
|
48
|
+
def artifact( a )
|
49
|
+
if a.is_a?( String )
|
50
|
+
a = Maven::Tools::Artifact.from_coordinate( a )
|
51
|
+
end
|
52
|
+
self.send a[:type].to_sym, a
|
53
|
+
end
|
54
|
+
|
55
|
+
def source(*args)
|
56
|
+
warn "ignore source #{args}" if !(args[0].to_s =~ /^https?:\/\/rubygems.org/) && args[0] != :rubygems
|
57
|
+
end
|
58
|
+
|
59
|
+
def ruby( *args )
|
60
|
+
# ignore
|
61
|
+
end
|
62
|
+
|
63
|
+
def path( *args )
|
64
|
+
warn 'path block not implemented'
|
65
|
+
end
|
66
|
+
|
67
|
+
def git( *args )
|
68
|
+
warn 'git block not implemented'
|
69
|
+
end
|
70
|
+
|
71
|
+
def is_jruby_platform( *args )
|
72
|
+
args.detect { |a| :jruby == a.to_sym }
|
73
|
+
end
|
74
|
+
private :is_jruby_platform
|
75
|
+
|
76
|
+
def platforms( *args )
|
77
|
+
if is_jruby_platform( *args )
|
78
|
+
yield
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def group( *args )
|
83
|
+
yield
|
84
|
+
end
|
85
|
+
|
86
|
+
def gemfile( name = 'Gemfile', options = {} )
|
87
|
+
if name.is_a? Hash
|
88
|
+
options = name
|
89
|
+
name = 'Gemfile'
|
90
|
+
end
|
91
|
+
name = File.join( basedir, name ) unless File.exists?( name )
|
92
|
+
basedir = File.dirname( name ) unless basedir
|
93
|
+
|
94
|
+
@gemfile_options = options
|
95
|
+
FileUtils.cd( basedir ) do
|
96
|
+
eval( File.read( File.expand_path( name ) ) )
|
97
|
+
end
|
98
|
+
|
99
|
+
if @gemfile_options
|
100
|
+
@gemfile_options = nil
|
101
|
+
setup_gem_support( options )
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def setup_gem_support( options, spec = nil, config = {} )
|
106
|
+
if spec.nil?
|
107
|
+
require_path = '.'
|
108
|
+
name = File.basename( File.expand_path( '.' ) )
|
109
|
+
else
|
110
|
+
require_path = spec.require_path
|
111
|
+
name = spec.name
|
112
|
+
end
|
113
|
+
|
114
|
+
unless model.repositories.detect { |r| r.id == 'rubygems-releases' }
|
115
|
+
repository( 'http://rubygems-proxy.torquebox.org/releases',
|
116
|
+
:id => 'rubygems-releases' )
|
117
|
+
end
|
118
|
+
|
119
|
+
properties( 'jruby.plugins.version' => VERSIONS[ :jruby_plugins ] )
|
120
|
+
|
121
|
+
if options.key?( :jar ) || options.key?( 'jar' )
|
122
|
+
jarpath = options[ :jar ] || options[ 'jar' ]
|
123
|
+
if jarpath
|
124
|
+
jar = File.basename( jarpath ).sub( /.jar$/, '' )
|
125
|
+
output = "#{require_path}/#{jarpath.sub( /#{jar}/, '' )}".sub( /\/$/, '' )
|
126
|
+
end
|
127
|
+
else
|
128
|
+
jar = "#{name}"
|
129
|
+
output = "#{require_path}"
|
130
|
+
end
|
131
|
+
if options.key?( :source ) || options.key?( 'source' )
|
132
|
+
source = options[ :source ] || options[ 'source' ]
|
133
|
+
build do
|
134
|
+
source_directory source
|
135
|
+
end
|
136
|
+
end
|
137
|
+
if jar && ( source ||
|
138
|
+
File.exists?( File.join( basedir, 'src', 'main', 'java' ) ) )
|
139
|
+
plugin( :jar, VERSIONS[ :jar_plugin ],
|
140
|
+
:outputDirectory => output,
|
141
|
+
:finalName => jar ) do
|
142
|
+
execute_goals :jar, :phase => 'prepare-package'
|
143
|
+
end
|
144
|
+
plugin( :clean, VERSIONS[ :clean_plugin ],
|
145
|
+
:filesets => [ { :directory => output,
|
146
|
+
:includes => [ "#{jar}.jar" ] } ] )
|
147
|
+
end
|
148
|
+
end
|
149
|
+
private :setup_gem_support
|
150
|
+
|
151
|
+
def setup_jruby( jruby, jruby_scope = :provided )
|
152
|
+
jruby ||= VERSIONS[ :jruby_version ]
|
153
|
+
scope( jruby_scope ) do
|
154
|
+
if ( jruby < '1.7' )
|
155
|
+
warn 'jruby version below 1.7 uses jruby-complete'
|
156
|
+
jar 'org.jruby:jruby-core', jruby
|
157
|
+
elsif ( jruby < '1.7.5' )
|
158
|
+
jar 'org.jruby:jruby-core', jruby
|
159
|
+
else
|
160
|
+
jar 'org.jruby:jruby', jruby
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
private :setup_jruby
|
165
|
+
|
166
|
+
def jarfile( file = 'Jarfile', options = {} )
|
167
|
+
if file.is_a? Hash
|
168
|
+
options = file
|
169
|
+
file = 'Jarfile'
|
170
|
+
end
|
171
|
+
unless file.is_a?( Maven::Tools::Jarfile )
|
172
|
+
file = Maven::Tools::Jarfile.new( File.expand_path( file ) )
|
173
|
+
end
|
174
|
+
|
175
|
+
if options[ :skip_locked ] or not file.exists_lock?
|
176
|
+
file.populate_unlocked do |dsl|
|
177
|
+
setup_jruby( dsl.jruby )
|
178
|
+
dsl.artifacts.each do |a|
|
179
|
+
dependency a
|
180
|
+
end
|
181
|
+
end
|
182
|
+
else
|
183
|
+
file.locked.each do |dep|
|
184
|
+
artifact( dep )
|
185
|
+
end
|
186
|
+
file.populate_unlocked do |dsl|
|
187
|
+
setup_jruby( dsl.jruby )
|
188
|
+
dsl.artifacts.each do |a|
|
189
|
+
if a[ :system_path ]
|
190
|
+
dependeny a
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def gemspec( name = nil, options = @gemfile_options || {} )
|
198
|
+
properties( 'project.build.sourceEncoding' => 'utf-8' ) unless model.properties.member?( 'project.build.sourceEncoding' )
|
199
|
+
|
200
|
+
@gemfile_options = nil
|
201
|
+
if name.is_a? Hash
|
202
|
+
options = name
|
203
|
+
name = nil
|
204
|
+
end
|
205
|
+
if name
|
206
|
+
name = File.join( basedir, name )
|
207
|
+
else name
|
208
|
+
gemspecs = Dir[ File.join( basedir, "*.gemspec" ) ]
|
209
|
+
raise "more then one gemspec file found" if gemspecs.size > 1
|
210
|
+
raise "no gemspec file found" if gemspecs.size == 0
|
211
|
+
name = gemspecs.first
|
212
|
+
end
|
213
|
+
spec = nil
|
214
|
+
FileUtils.cd( basedir ) do
|
215
|
+
spec = eval( File.read( File.expand_path( name ) ) )
|
216
|
+
end
|
217
|
+
|
218
|
+
if @context == :project
|
219
|
+
build.directory = '${basedir}/pkg'
|
220
|
+
id "rubygems:#{spec.name}:#{spec.version}"
|
221
|
+
name( spec.summary || spec.name )
|
222
|
+
description spec.description
|
223
|
+
packaging 'gem'
|
224
|
+
url spec.homepage
|
225
|
+
extension 'de.saumya.mojo:gem-extension:${jruby.plugins.version}'
|
226
|
+
end
|
227
|
+
|
228
|
+
setup_gem_support( options, spec )
|
229
|
+
|
230
|
+
config = { :gemspec => name.sub( /^#{basedir}\/?/, '' ) }
|
231
|
+
if options[ :include_jars ] || options[ 'include_jars' ]
|
232
|
+
config[ :includeDependencies ] = true
|
233
|
+
end
|
234
|
+
plugin( 'de.saumya.mojo:gem-maven-plugin:${jruby.plugins.version}',
|
235
|
+
config )
|
236
|
+
|
237
|
+
deps = Maven::Tools::GemspecDependencies.new( spec )
|
238
|
+
deps.runtime.each do |d|
|
239
|
+
gem d
|
240
|
+
end
|
241
|
+
unless deps.development.empty?
|
242
|
+
scope :test do
|
243
|
+
deps.development.each do |d|
|
244
|
+
gem d
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
unless deps.java_runtime.empty?
|
249
|
+
deps.java_runtime.each do |d|
|
250
|
+
dependency Maven::Tools::Artifact.new( *d )
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def build( &block )
|
256
|
+
build = @current.build ||= Build.new
|
257
|
+
nested_block( :build, build, block ) if block
|
258
|
+
build
|
259
|
+
end
|
260
|
+
|
261
|
+
def project( name, url = nil, &block )
|
262
|
+
raise 'mixed up hierachy' unless @current == model
|
263
|
+
@current.name = name
|
264
|
+
@current.url = url
|
265
|
+
|
266
|
+
nested_block(:project, @current, block)
|
267
|
+
end
|
268
|
+
|
269
|
+
def id(*value)
|
270
|
+
value = value.join( ':' )
|
271
|
+
if @context == :project
|
272
|
+
fill_gav(@current, value)
|
273
|
+
reduce_id
|
274
|
+
else
|
275
|
+
@current.id = value
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
def site( url = nil, options = {} )
|
280
|
+
site = Site.new
|
281
|
+
fill_options( site, url, options )
|
282
|
+
@current.site = site
|
283
|
+
end
|
284
|
+
|
285
|
+
def source_control( url = nil, options = {} )
|
286
|
+
scm = Scm.new
|
287
|
+
fill_options( scm, url, options )
|
288
|
+
@current.scm = scm
|
289
|
+
end
|
290
|
+
alias :scm :source_control
|
291
|
+
|
292
|
+
def issue_management( url, system = nil )
|
293
|
+
issues = IssueManagement.new
|
294
|
+
issues.url = url
|
295
|
+
issues.system = system
|
296
|
+
@current.issue_management = issues
|
297
|
+
end
|
298
|
+
|
299
|
+
def mailing_list( name = nil, &block )
|
300
|
+
list = MailingList.new
|
301
|
+
list.name = name
|
302
|
+
nested_block( :mailing_list, list, block )
|
303
|
+
@current.mailing_lists << list
|
304
|
+
end
|
305
|
+
|
306
|
+
def archives( *archives )
|
307
|
+
@current.archive = archives.shift
|
308
|
+
@current.other_archives = archives
|
309
|
+
end
|
310
|
+
|
311
|
+
def developer( id = nil, &block )
|
312
|
+
dev = Developer.new
|
313
|
+
dev.id = id
|
314
|
+
nested_block( :developer, dev, block )
|
315
|
+
@current.developers << dev
|
316
|
+
end
|
317
|
+
|
318
|
+
def roles( *roles )
|
319
|
+
@current.roles = roles
|
320
|
+
end
|
321
|
+
|
322
|
+
def property( options )
|
323
|
+
prop = ActivationProperty.new
|
324
|
+
prop.name = options[ :name ] || options[ 'name' ]
|
325
|
+
prop.value = options[ :value ] || options[ 'value' ]
|
326
|
+
@current.property = prop
|
327
|
+
end
|
328
|
+
|
329
|
+
def file( options )
|
330
|
+
file = ActivationFile.new
|
331
|
+
file.missing = options[ :missing ] || options[ 'missing' ]
|
332
|
+
file.exists = options[ :exists ] || options[ 'exists' ]
|
333
|
+
@current.file = file
|
334
|
+
end
|
335
|
+
|
336
|
+
def activation( &block )
|
337
|
+
activation = Activation.new
|
338
|
+
nested_block( :activation, activation, block )
|
339
|
+
@current.activation = activation
|
340
|
+
end
|
341
|
+
|
342
|
+
def distribution( &block )
|
343
|
+
dist = DistributionManagement.new
|
344
|
+
nested_block( :distribution, dist, block )
|
345
|
+
@current.distribution_management = dist
|
346
|
+
end
|
347
|
+
|
348
|
+
def includes( *items )
|
349
|
+
@current.includes = items.flatten
|
350
|
+
end
|
351
|
+
|
352
|
+
def excludes( *items )
|
353
|
+
@current.excludes = items.flatten
|
354
|
+
end
|
355
|
+
|
356
|
+
def test_resource( &block )
|
357
|
+
# strange behaviour when calling specs from Rakefile
|
358
|
+
return if @current.nil?
|
359
|
+
resource = Resource.new
|
360
|
+
nested_block( :resource, resource, block )
|
361
|
+
if @context == :project
|
362
|
+
( @current.build ||= Build.new ).test_resources << resource
|
363
|
+
else
|
364
|
+
@current.test_resources << resource
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
def resource( &block )
|
369
|
+
resource = Resource.new
|
370
|
+
nested_block( :resource, resource, block )
|
371
|
+
if @context == :project
|
372
|
+
( @current.build ||= Build.new ).resources << resource
|
373
|
+
else
|
374
|
+
@current.resources << resource
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
def repository( url, options = {}, &block )
|
379
|
+
do_repository( :repository=, url, options, block )
|
380
|
+
end
|
381
|
+
|
382
|
+
def plugin_repository( url, options = {}, &block )
|
383
|
+
do_repository( :plugin, url, options, block )
|
384
|
+
end
|
385
|
+
|
386
|
+
def snapshot_repository( url, options = {}, &block )
|
387
|
+
do_repository( :snapshot_repository=, url, options, block )
|
388
|
+
end
|
389
|
+
|
390
|
+
def releases( config )
|
391
|
+
respository_policy( :releases=, config )
|
392
|
+
end
|
393
|
+
|
394
|
+
def snapshots( config )
|
395
|
+
respository_policy( :snapshots=, config )
|
396
|
+
end
|
397
|
+
|
398
|
+
def respository_policy( method, config )
|
399
|
+
rp = RepositoryPolicy.new
|
400
|
+
case config
|
401
|
+
when Hash
|
402
|
+
rp.enabled = snapshot[ :enabled ]
|
403
|
+
rp.update_policy = snapshot[ :update ]
|
404
|
+
rp.checksum_policy = snapshot[ :checksum ]
|
405
|
+
when TrueClass
|
406
|
+
rp.enabled = true
|
407
|
+
when FalseClass
|
408
|
+
rp.enabled = false
|
409
|
+
else
|
410
|
+
rp.enabled = 'true' == config
|
411
|
+
end
|
412
|
+
@current.send( method, rp )
|
413
|
+
end
|
414
|
+
|
415
|
+
def inherit( *value )
|
416
|
+
@current.parent = fill_gav( Parent, value.join( ':' ) )
|
417
|
+
reduce_id
|
418
|
+
end
|
419
|
+
alias :parent :inherit
|
420
|
+
|
421
|
+
def properties(props)
|
422
|
+
props.each do |k,v|
|
423
|
+
@current.properties[k.to_s] = v.to_s
|
424
|
+
end
|
425
|
+
@current.properties
|
426
|
+
end
|
427
|
+
|
428
|
+
def extension( *gav )
|
429
|
+
@current.build ||= Build.new
|
430
|
+
gav = gav.join( ':' )
|
431
|
+
ext = fill_gav( Extension, gav)
|
432
|
+
@current.build.extensions << ext
|
433
|
+
end
|
434
|
+
|
435
|
+
def plugin( *gav, &block )
|
436
|
+
if gav.last.is_a? Hash
|
437
|
+
options = gav.last
|
438
|
+
gav = gav[ 0..-2 ]
|
439
|
+
else
|
440
|
+
options = {}
|
441
|
+
end
|
442
|
+
unless gav.first.match( /:/ )
|
443
|
+
gav[ 0 ] = "org.apache.maven.plugins:maven-#{gav.first}-plugin"
|
444
|
+
end
|
445
|
+
gav = gav.join( ':' )
|
446
|
+
plugin = fill_gav( @context == :reporting ? ReportPlugin : Plugin,
|
447
|
+
gav)
|
448
|
+
set_config( plugin, options )
|
449
|
+
if @current.respond_to? :build
|
450
|
+
@current.build ||= Build.new
|
451
|
+
if @context == :overrides
|
452
|
+
@current.build.plugin_management ||= PluginManagement.new
|
453
|
+
@current.build.plugin_management.plugins << plugin
|
454
|
+
else
|
455
|
+
@current.build.plugins << plugin
|
456
|
+
end
|
457
|
+
else
|
458
|
+
@current.plugins << plugin
|
459
|
+
end
|
460
|
+
nested_block(:plugin, plugin, block) if block
|
461
|
+
plugin
|
462
|
+
end
|
463
|
+
|
464
|
+
def overrides(&block)
|
465
|
+
nested_block(:overrides, @current, block)
|
466
|
+
end
|
467
|
+
alias :plugin_management :overrides
|
468
|
+
alias :dependency_management :overrides
|
469
|
+
|
470
|
+
def execute( options )
|
471
|
+
execute_goals( options )
|
472
|
+
end
|
473
|
+
|
474
|
+
def execute_goal( goal, options = {} )
|
475
|
+
if goal.is_a? Hash
|
476
|
+
execute_goals( goal )
|
477
|
+
else
|
478
|
+
execute_goals( goal, options )
|
479
|
+
end
|
480
|
+
end
|
481
|
+
|
482
|
+
def execute_goals( *goals )
|
483
|
+
if goals.last.is_a? Hash
|
484
|
+
options = goals.last
|
485
|
+
goals = goals[ 0..-2 ]
|
486
|
+
else
|
487
|
+
options = {}
|
488
|
+
end
|
489
|
+
exec = Execution.new
|
490
|
+
# keep the original default of id
|
491
|
+
id = options.delete( :id ) || options.delete( 'id' )
|
492
|
+
exec.id = id if id
|
493
|
+
if @phase
|
494
|
+
if options[ :phase ] || options[ 'phase' ]
|
495
|
+
raise 'inside phase block and phase option given'
|
496
|
+
end
|
497
|
+
exec.phase = @phase
|
498
|
+
else
|
499
|
+
exec.phase = options.delete( :phase ) || options.delete( 'phase' )
|
500
|
+
end
|
501
|
+
exec.goals = goals.collect { |g| g.to_s }
|
502
|
+
set_config( exec, options )
|
503
|
+
@current.executions << exec
|
504
|
+
# nested_block(:execution, exec, block) if block
|
505
|
+
exec
|
506
|
+
end
|
507
|
+
|
508
|
+
def dependency( type, *args )
|
509
|
+
if args.empty?
|
510
|
+
a = type
|
511
|
+
type = a[ :type ]
|
512
|
+
options = a
|
513
|
+
elsif args[ 0 ].is_a?( ::Maven::Tools::Artifact )
|
514
|
+
a = args[ 0 ]
|
515
|
+
type = a[ :type ]
|
516
|
+
options = a
|
517
|
+
else
|
518
|
+
a = ::Maven::Tools::Artifact.from( type, *args )
|
519
|
+
end
|
520
|
+
d = fill_gav( Dependency,
|
521
|
+
a ? a.gav : args.join( ':' ) )
|
522
|
+
d.type = type.to_s
|
523
|
+
if @context == :overrides
|
524
|
+
@current.dependency_management ||= DependencyManagement.new
|
525
|
+
@current.dependency_management.dependencies << d
|
526
|
+
else
|
527
|
+
@current.dependencies << d
|
528
|
+
end
|
529
|
+
if args.last.is_a?( Hash )
|
530
|
+
options = args.last
|
531
|
+
end
|
532
|
+
if options || @scope
|
533
|
+
options ||= {}
|
534
|
+
if @scope
|
535
|
+
if options[ :scope ] || options[ 'scope' ]
|
536
|
+
raise "scope block and scope option given"
|
537
|
+
end
|
538
|
+
options[ :scope ] = @scope
|
539
|
+
end
|
540
|
+
exclusions = options.delete( :exclusions ) ||
|
541
|
+
options.delete( "exclusions" )
|
542
|
+
case exclusions
|
543
|
+
when Array
|
544
|
+
exclusions.each do |v|
|
545
|
+
d.exclusions << fill_gav( Exclusion, v )
|
546
|
+
end
|
547
|
+
when String
|
548
|
+
d.exclusions << fill_gav( Exclusion, exclusions )
|
549
|
+
end
|
550
|
+
options.each do |k,v|
|
551
|
+
d.send( "#{k}=".to_sym, v ) unless d.send( k.to_sym )
|
552
|
+
end
|
553
|
+
end
|
554
|
+
d
|
555
|
+
end
|
556
|
+
|
557
|
+
def scope( name )
|
558
|
+
@scope = name
|
559
|
+
yield
|
560
|
+
@scope = nil
|
561
|
+
end
|
562
|
+
|
563
|
+
def phase( name )
|
564
|
+
@phase = name
|
565
|
+
yield
|
566
|
+
@phase = nil
|
567
|
+
end
|
568
|
+
|
569
|
+
def profile( id, &block )
|
570
|
+
profile = Profile.new
|
571
|
+
profile.id = id if id
|
572
|
+
@current.profiles << profile
|
573
|
+
nested_block( :profile, profile, block )
|
574
|
+
end
|
575
|
+
|
576
|
+
def report_set( *reports, &block )
|
577
|
+
set = ReportSet.new
|
578
|
+
case reports.last
|
579
|
+
when Hash
|
580
|
+
options = reports.last
|
581
|
+
reports = reports[ 0..-2 ]
|
582
|
+
id = options.delete( :id ) || options.delete( 'id' )
|
583
|
+
set.id = id if id
|
584
|
+
inherited = options.delete( :inherited ) ||
|
585
|
+
options.delete( 'inherited' )
|
586
|
+
set.inherited = inherited if inherited
|
587
|
+
end
|
588
|
+
set_config( set, options )
|
589
|
+
set.reports = reports#.to_java
|
590
|
+
@current.report_sets << set
|
591
|
+
end
|
592
|
+
|
593
|
+
def reporting( &block )
|
594
|
+
reporting = Reporting.new
|
595
|
+
@current.reporting = reporting
|
596
|
+
nested_block( :reporting, reporting, block )
|
597
|
+
end
|
598
|
+
|
599
|
+
def gem( *args )
|
600
|
+
# in some setup that gem could overload the Kernel gem
|
601
|
+
return if @current.nil?
|
602
|
+
unless args[ 0 ].match( /:/ )
|
603
|
+
args[ 0 ] = "rubygems:#{args[ 0 ] }"
|
604
|
+
end
|
605
|
+
if args.last.is_a?(Hash)
|
606
|
+
options = args.last
|
607
|
+
unless options.key?(:git) || options.key?(:path)
|
608
|
+
platform = options.delete( :platforms ) || options.delete( 'platforms' )
|
609
|
+
group = options.delete( :group ) || options.delete( 'group' )
|
610
|
+
if group.to_sym == :test
|
611
|
+
options[ :scope ] = :test
|
612
|
+
else
|
613
|
+
warn "TODO implement groups"
|
614
|
+
end
|
615
|
+
if platform.nil? || is_jruby_platform( platform )
|
616
|
+
dependency( :gem, *args )
|
617
|
+
end
|
618
|
+
end
|
619
|
+
else
|
620
|
+
#args = args + [ { :group_id => 'rubygems', :version => '[0,)' } ]
|
621
|
+
dependency( :gem, *args )
|
622
|
+
end
|
623
|
+
end
|
624
|
+
|
625
|
+
def local( path, options = {} )
|
626
|
+
path = File.expand_path( path )
|
627
|
+
dependency( :jar,
|
628
|
+
Maven::Tools::Artifact.new_local( path, :jar, options ) )
|
629
|
+
end
|
630
|
+
|
631
|
+
def method_missing( method, *args, &block )
|
632
|
+
if @context
|
633
|
+
m = "#{method}=".to_sym
|
634
|
+
if @current.respond_to? m
|
635
|
+
#p @context
|
636
|
+
#p m
|
637
|
+
#p args
|
638
|
+
begin
|
639
|
+
@current.send( m, *args )
|
640
|
+
rescue ArgumentError
|
641
|
+
if @current.respond_to? method
|
642
|
+
@current.send( method, *args )
|
643
|
+
end
|
644
|
+
end
|
645
|
+
@current
|
646
|
+
else
|
647
|
+
if ( args.size > 0 &&
|
648
|
+
args[0].is_a?( String ) &&
|
649
|
+
args[0] =~ /^[${}0-9a-zA-Z._-]+(:[${}0-9a-zA-Z._-]+)+$/ ) ||
|
650
|
+
( args.size == 1 && args[0].is_a?( Hash ) )
|
651
|
+
dependency( method, *args )
|
652
|
+
# elsif @current.respond_to? method
|
653
|
+
# @current.send( method, *args )
|
654
|
+
# @current
|
655
|
+
else
|
656
|
+
p @context
|
657
|
+
p m
|
658
|
+
p args
|
659
|
+
end
|
660
|
+
end
|
661
|
+
else
|
662
|
+
super
|
663
|
+
end
|
664
|
+
end
|
665
|
+
|
666
|
+
def xml( xml )
|
667
|
+
raise 'Xpp3DomBuilder.build( java.io.StringReader.new( xml ) )'
|
668
|
+
end
|
669
|
+
|
670
|
+
def set_config( receiver, options )
|
671
|
+
receiver.configuration = options
|
672
|
+
end
|
673
|
+
|
674
|
+
private
|
675
|
+
|
676
|
+
def do_repository( method, url = nil, options = {}, block = nil )
|
677
|
+
if @current.respond_to?( method )
|
678
|
+
r = DeploymentRepository.new
|
679
|
+
else
|
680
|
+
r = Repository.new
|
681
|
+
end
|
682
|
+
# if config = ( options.delete( :snapshot ) ||
|
683
|
+
# options.delete( 'snapshot' ) )
|
684
|
+
# r.snapshot( repository_policy( config ) )
|
685
|
+
# end
|
686
|
+
# if config = ( options.delete( :release ) ||
|
687
|
+
# options.delete( 'release' ) )
|
688
|
+
# r.snapshot( repository_policy( config ) )
|
689
|
+
# end
|
690
|
+
nested_block( :repository, r, block ) if block
|
691
|
+
fill_options( r, url, options )
|
692
|
+
case method
|
693
|
+
when :plugin
|
694
|
+
@current.plugin_repositories << r
|
695
|
+
else
|
696
|
+
if @current.respond_to?( method )
|
697
|
+
@current.send method, r
|
698
|
+
else
|
699
|
+
@current.repositories << r
|
700
|
+
end
|
701
|
+
end
|
702
|
+
end
|
703
|
+
|
704
|
+
def fill_options( receiver, url, options )
|
705
|
+
url ||= options.delete( :url ) || options.delete( 'url' )
|
706
|
+
options.each do |k,v|
|
707
|
+
receiver.send "#{k}=".to_sym, v
|
708
|
+
end
|
709
|
+
receiver.url = url
|
710
|
+
end
|
711
|
+
|
712
|
+
def reduce_id
|
713
|
+
if parent = @current.parent
|
714
|
+
@current.version = nil if parent.version == @current.version
|
715
|
+
@current.group_id = nil if parent.group_id == @current.group_id
|
716
|
+
end
|
717
|
+
end
|
718
|
+
|
719
|
+
def nested_block(context, receiver, block)
|
720
|
+
old_ctx = @context
|
721
|
+
old = @current
|
722
|
+
|
723
|
+
@context = context
|
724
|
+
@current = receiver
|
725
|
+
|
726
|
+
block.call
|
727
|
+
|
728
|
+
@current = old
|
729
|
+
@context = old_ctx
|
730
|
+
end
|
731
|
+
|
732
|
+
def fill_gav(receiver, gav)
|
733
|
+
if gav
|
734
|
+
if receiver.is_a? Class
|
735
|
+
receiver = receiver.new
|
736
|
+
end
|
737
|
+
gav = gav.split(':')
|
738
|
+
case gav.size
|
739
|
+
when 0
|
740
|
+
# do nothing - will be filled later
|
741
|
+
when 1
|
742
|
+
receiver.artifact_id = gav[0]
|
743
|
+
when 2
|
744
|
+
receiver.group_id, receiver.artifact_id = gav
|
745
|
+
when 3
|
746
|
+
receiver.group_id, receiver.artifact_id, receiver.version = gav
|
747
|
+
when 4
|
748
|
+
receiver.group_id, receiver.artifact_id, receiver.version, receiver.classifier = gav
|
749
|
+
else
|
750
|
+
raise "can not assign such an array #{gav.inspect}"
|
751
|
+
end
|
752
|
+
end
|
753
|
+
receiver
|
754
|
+
end
|
755
|
+
end
|
756
|
+
end
|
757
|
+
end
|