/
ruby_maven.rb
227 lines (204 loc) · 6.17 KB
/
ruby_maven.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
require 'fileutils'
require 'maven/tools/rails_project'
require 'java' if defined? JRUBY_VERSION
module Maven
class RubyMaven
# make the command line for the goals of the jruby-maven-plugins nicer
PLUGINS = {
:rake => [:rake],
:jruby => [:jruby, :compile],
:gem => [:package, :install, :push, :exec, :pom, :initialize, :irb],
:rails3 => [:new, :generate, :rake, :server, :console, :dbconsole, :pom, :initialize],
:cucumber => [:test],
:rspec => [:test],
:runit => [:test],
:mini => [:test,:spec],
:bundler => [:install, :update]
}
ALIASES = {
:ruby => :jruby,
:spec => :rspec,
:rails => :rails3,
:bundle => :bundler
}
def initialize
@maven_home = File.expand_path(File.join(File.dirname(__FILE__),'..','..'))
end
def launch_jruby(args)
classpath_array.each do |path|
require path
end
java.lang.System.setProperty("classworlds.conf",
File.join(@maven_home, 'bin', "m2.conf"))
java.lang.System.setProperty("maven.home", @maven_home)
org.codehaus.plexus.classworlds.launcher.Launcher.main(args)
end
def classpath_array
Dir.glob(File.join(@maven_home, "boot", "*jar")) +
Dir.glob(File.join(@maven_home, "ext", "ruby-tools*jar"))
end
def launch_java(*args)
system "java -cp #{classpath_array.join(':')} -Dmaven.home=#{File.expand_path(@maven_home)} -Dclassworlds.conf=#{File.expand_path(File.join(@maven_home, 'bin', 'm2.conf'))} org.codehaus.plexus.classworlds.launcher.Launcher #{args.join ' '}"
end
def prepare(args)
if args.size > 0
name = args[0].to_sym
name = ALIASES[name] || name
if PLUGINS.member?(name)
start = 1
if args.size > 1
if PLUGINS[name].member? args[1].to_sym
goal = args[1].to_sym
start = 2
else
goal = PLUGINS[name][0]
end
else
goal = PLUGINS[name][0]
end
# determine the version and delete from args if given
version = args.detect do |a|
a =~ /^-Dplugin.version=/
end
version ||= options['-Dplugin.version']
if version
args.delete(version)
version = ":" + version.sub(/^-Dplugin.version=/, '')
end
aa = if index = args.index("--")
args[(index + 1)..-1]
else
[]
end
ruby_args = (args[start, (index || 1000) - start] || []).join(' ')
aa << "de.saumya.mojo:#{name}-maven-plugin#{version}:#{goal}"
aa << "-Dargs=\"#{ruby_args}\"" if ruby_args.size > 0
args.replace(aa)
else
args.delete("--")
end
end
args
end
def log(args)
log = File.join('log', 'rmvn.log')
if File.exists? File.dirname(log)
File.open(log, 'a') do |f|
f.puts "#{$0.sub(/.*\//, '')} #{args.join ' '}"
end
end
end
def maybe_print_help(args)
if args.size == 0 || args[0] == "--help"
puts "usage: rmvn [<plugin-name> [<args>] [-- <maven-options>]] | [<maven-goal>|<maven-phase> <maven-options>] | --help"
PLUGINS.each do |name, goals|
puts
print "plugin #{name}"
print " - alias: #{ALIASES.invert[name]}" if ALIASES.invert[name]
puts
if goals.size > 1
print "\tgoals : #{goals.join(',')}"
puts
end
print "\tdefault goal: #{goals[0]}"
puts
end
puts
["--help"]
else
args
end
end
def options
@options ||= {}
end
def options_string
options_array.join ' '
end
def options_array
options.collect do |k,v|
if k =~ /^-D/
v = "=#{v}" unless v.nil?
else
v = " #{v}" unless v.nil?
end
"#{k}#{v}"
end
end
def command_line(args)
args = prepare(args)
args = maybe_print_help(args)
args
end
def new_rails_project
Maven::Tools::RailsProject.new
end
def generate_pom(*args)
unless args.member?("-f") || args.member?("--file")
gemfiles = Dir["*Gemfile"]
gemfiles.delete_if {|g| g =~ /.pom/}
if gemfiles.size > 0
proj =
if File.exists? File.join( 'config', 'application.rb' )
new_rails_project
else
Maven::Tools::GemProject.new
end
filename = gemfiles[0]
proj.load_gemfile(filename)
else
gemspecs = Dir["*.gemspec"]
gemspecs.delete_if {|g| g =~ /.pom/}
if gemspecs.size > 0
proj = Maven::Tools::GemProject.new
filename = gemspecs[0]
proj.load_gemspec(filename)
end
end
if filename
proj.load_jarfile(File.join(File.dirname(filename), 'Jarfile'))
proj.load_gemfile(File.join(File.dirname(filename), 'Mavenfile'))
proj.add_defaults
#target = File.join(File.dirname(filename), 'target')
#FileUtils.mkdir_p target
pom = ".pom.xml"
File.open(pom, 'w') do |f|
f.puts proj.to_xml
end
args << '-f'
args << pom
end
end
args
end
def exec(*args)
log(args)
a = command_line(args.dup.flatten)
verbose = options.delete('--verbose')
no_pom = options.delete('--no-pom')
a << options_array
a.flatten!
a = generate_pom(*a) unless no_pom
puts "mvn #{a.join(' ')}" if verbose
if defined? JRUBY_VERSION
# TODO use a setup like maven_gemify from jruby to launch maven
launch_java(a)
else
launch_java(a)
end
end
def exec_in(launchdirectory, *args)
succeeded = nil
FileUtils.cd(launchdirectory) do
succeeded = exec(args)
end
succeeded
end
def dump_pom(force = false, file = 'pom.xml')
if force || !File.exists?(file)
generate_pom
FileUtils.cp(".pom.xml", file)
end
end
end
end