Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
AbstractReleaseMojo |
|
| 2.1;2.1 |
1 | package org.apache.maven.plugins.release; | |
2 | ||
3 | /* | |
4 | * Licensed to the Apache Software Foundation (ASF) under one | |
5 | * or more contributor license agreements. See the NOTICE file | |
6 | * distributed with this work for additional information | |
7 | * regarding copyright ownership. The ASF licenses this file | |
8 | * to you under the Apache License, Version 2.0 (the | |
9 | * "License"); you may not use this file except in compliance | |
10 | * with the License. You may obtain a copy of the License at | |
11 | * | |
12 | * http://www.apache.org/licenses/LICENSE-2.0 | |
13 | * | |
14 | * Unless required by applicable law or agreed to in writing, | |
15 | * software distributed under the License is distributed on an | |
16 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
17 | * KIND, either express or implied. See the License for the | |
18 | * specific language governing permissions and limitations | |
19 | * under the License. | |
20 | */ | |
21 | ||
22 | import java.io.File; | |
23 | import java.util.Iterator; | |
24 | import java.util.List; | |
25 | import java.util.Map; | |
26 | ||
27 | import org.apache.maven.execution.MavenSession; | |
28 | import org.apache.maven.model.Profile; | |
29 | import org.apache.maven.plugin.AbstractMojo; | |
30 | import org.apache.maven.plugin.MojoExecutionException; | |
31 | import org.apache.maven.plugin.MojoFailureException; | |
32 | import org.apache.maven.project.MavenProject; | |
33 | import org.apache.maven.scm.manager.ScmManager; | |
34 | import org.apache.maven.settings.Settings; | |
35 | import org.apache.maven.shared.release.ReleaseManager; | |
36 | import org.apache.maven.shared.release.config.ReleaseDescriptor; | |
37 | import org.apache.maven.shared.release.env.DefaultReleaseEnvironment; | |
38 | import org.apache.maven.shared.release.env.ReleaseEnvironment; | |
39 | import org.codehaus.plexus.util.StringUtils; | |
40 | ||
41 | /** | |
42 | * Base class with shared configuration. | |
43 | * | |
44 | * @author <a href="mailto:brett@apache.org">Brett Porter</a> | |
45 | * @version $Id$ | |
46 | */ | |
47 | 0 | public abstract class AbstractReleaseMojo |
48 | extends AbstractMojo | |
49 | { | |
50 | /** | |
51 | * The SCM username to use. | |
52 | * | |
53 | * @parameter expression="${username}" | |
54 | */ | |
55 | private String username; | |
56 | ||
57 | /** | |
58 | * The SCM password to use. | |
59 | * | |
60 | * @parameter expression="${password}" | |
61 | */ | |
62 | private String password; | |
63 | ||
64 | /** | |
65 | * The SCM tag to use. | |
66 | * | |
67 | * @parameter expression="${tag}" alias="releaseLabel" | |
68 | */ | |
69 | private String tag; | |
70 | ||
71 | /** | |
72 | * The tag base directory in SVN, you must define it if you don't use the standard svn layout (trunk/tags/branches). | |
73 | * For example, <code>http://svn.apache.org/repos/asf/maven/plugins/tags</code>. The URL is an SVN URL and does not | |
74 | * include the SCM provider and protocol. | |
75 | * | |
76 | * @parameter expression="${tagBase}" | |
77 | */ | |
78 | private String tagBase; | |
79 | ||
80 | /** | |
81 | * @parameter expression="${basedir}" | |
82 | * @required | |
83 | * @readonly | |
84 | */ | |
85 | protected File basedir; | |
86 | ||
87 | /** | |
88 | * @parameter expression="${settings}" | |
89 | * @required | |
90 | * @readonly | |
91 | */ | |
92 | protected Settings settings; | |
93 | ||
94 | /** | |
95 | * @parameter expression="${project}" | |
96 | * @required | |
97 | * @readonly | |
98 | */ | |
99 | protected MavenProject project; | |
100 | ||
101 | /** | |
102 | * @component | |
103 | */ | |
104 | protected ReleaseManager releaseManager; | |
105 | ||
106 | /** | |
107 | * Additional arguments to pass to the Maven executions, separated by spaces. | |
108 | * | |
109 | * @parameter expression="${arguments}" alias="prepareVerifyArgs" | |
110 | */ | |
111 | private String arguments; | |
112 | ||
113 | /** | |
114 | * The file name of the POM to execute any goals against. | |
115 | * | |
116 | * @parameter expression="${pomFileName}" | |
117 | */ | |
118 | private String pomFileName; | |
119 | ||
120 | /** | |
121 | * The message prefix to use for all SCM changes. | |
122 | * | |
123 | * @parameter expression="${scmCommentPrefix}" default-value="[maven-release-plugin] " | |
124 | * @since 2.0-beta-5 | |
125 | */ | |
126 | private String scmCommentPrefix; | |
127 | ||
128 | /** | |
129 | * @parameter expression="${reactorProjects}" | |
130 | * @required | |
131 | * @readonly | |
132 | */ | |
133 | protected List reactorProjects; | |
134 | ||
135 | /** | |
136 | * List of provider implementations. | |
137 | * | |
138 | * @parameter | |
139 | * @since 2.0-beta-6 | |
140 | */ | |
141 | private Map providerImplementations; | |
142 | ||
143 | /** | |
144 | * The M2_HOME parameter to use for forked Maven invocations. | |
145 | * | |
146 | * @parameter default-value="${maven.home}" | |
147 | * @since 2.0-beta-8 | |
148 | */ | |
149 | protected File mavenHome; | |
150 | ||
151 | /** | |
152 | * The JAVA_HOME parameter to use for forked Maven invocations. | |
153 | * | |
154 | * @parameter default-value="${java.home}" | |
155 | * @since 2.0-beta-8 | |
156 | */ | |
157 | protected File javaHome; | |
158 | ||
159 | /** | |
160 | * The command-line local repository directory in use for this build (if specified). | |
161 | * | |
162 | * @parameter default-value="${maven.repo.local}" | |
163 | * @since 2.0-beta-8 | |
164 | */ | |
165 | protected File localRepoDirectory; | |
166 | ||
167 | /** | |
168 | * Role hint of the {@link org.apache.maven.shared.release.exec.MavenExecutor} implementation to use. | |
169 | * | |
170 | * @parameter expression="${mavenExecutorId}" default-value="invoker" | |
171 | * @since 2.0-beta-8 | |
172 | */ | |
173 | protected String mavenExecutorId; | |
174 | ||
175 | /** | |
176 | * Use a local checkout instead of doing a checkout from the upstream repository. | |
177 | * ATTENTION: This will only work with distributed SCMs which support the file:// protocol | |
178 | * like e.g. git, jgit or hg! | |
179 | * | |
180 | * TODO: we should think about having the defaults for the various SCM providers provided via modello! | |
181 | * | |
182 | * @parameter expression="${localCheckout}" default-value="false" | |
183 | * @since 2.0 | |
184 | */ | |
185 | private boolean localCheckout; | |
186 | ||
187 | /** | |
188 | * Implemented with git will or not push changes to the upstream repository. | |
189 | * <code>true</code> by default to preserve backward compatibility. | |
190 | * @parameter expression="${pushChanges}" default-value="true" | |
191 | * @since 2.1 | |
192 | */ | |
193 | 0 | private boolean pushChanges = true; |
194 | ||
195 | /** | |
196 | * The SCM manager. | |
197 | * | |
198 | * @component | |
199 | */ | |
200 | private ScmManager scmManager; | |
201 | ||
202 | /** | |
203 | * @parameter expression="${session}" | |
204 | * @readonly | |
205 | * @required | |
206 | * @since 2.0 | |
207 | */ | |
208 | protected MavenSession session; | |
209 | ||
210 | ||
211 | /** | |
212 | * Gets the enviroment settings configured for this release. | |
213 | * | |
214 | * @return The release environment, never <code>null</code>. | |
215 | */ | |
216 | protected ReleaseEnvironment getReleaseEnvironment() | |
217 | { | |
218 | 0 | return new DefaultReleaseEnvironment().setSettings( settings ) |
219 | .setJavaHome( javaHome ) | |
220 | .setMavenHome( mavenHome ) | |
221 | .setLocalRepositoryDirectory( localRepoDirectory ) | |
222 | .setMavenExecutorId( mavenExecutorId ); | |
223 | } | |
224 | ||
225 | /** | |
226 | * {@inheritDoc} | |
227 | */ | |
228 | public void execute() | |
229 | throws MojoExecutionException, MojoFailureException | |
230 | { | |
231 | 0 | if ( providerImplementations != null ) |
232 | { | |
233 | 0 | for ( Iterator i = providerImplementations.keySet().iterator(); i.hasNext(); ) |
234 | { | |
235 | 0 | String providerType = (String) i.next(); |
236 | 0 | String providerImplementation = (String) providerImplementations.get( providerType ); |
237 | 0 | getLog().info( "Change the default '" + providerType + "' provider implementation to '" |
238 | + providerImplementation + "'." ); | |
239 | 0 | scmManager.setScmProviderImplementation( providerType, providerImplementation ); |
240 | 0 | } |
241 | } | |
242 | 0 | } |
243 | ||
244 | /** | |
245 | * Creates the release descriptor from the various goal parameters. | |
246 | * | |
247 | * @return The release descriptor, never <code>null</code>. | |
248 | */ | |
249 | protected ReleaseDescriptor createReleaseDescriptor() | |
250 | { | |
251 | 0 | ReleaseDescriptor descriptor = new ReleaseDescriptor(); |
252 | ||
253 | 0 | descriptor.setInteractive( settings.isInteractiveMode() ); |
254 | ||
255 | 0 | descriptor.setScmPassword( password ); |
256 | 0 | descriptor.setScmReleaseLabel( tag ); |
257 | 0 | descriptor.setScmTagBase( tagBase ); |
258 | 0 | descriptor.setScmUsername( username ); |
259 | 0 | descriptor.setScmCommentPrefix( scmCommentPrefix ); |
260 | ||
261 | 0 | descriptor.setWorkingDirectory( basedir.getAbsolutePath() ); |
262 | ||
263 | 0 | descriptor.setPomFileName( pomFileName ); |
264 | ||
265 | 0 | descriptor.setLocalCheckout( localCheckout ); |
266 | ||
267 | 0 | descriptor.setPushChanges( pushChanges ); |
268 | ||
269 | 0 | List profiles = project.getActiveProfiles(); |
270 | ||
271 | 0 | String arguments = this.arguments; |
272 | 0 | if ( profiles != null && !profiles.isEmpty() ) |
273 | { | |
274 | 0 | if ( !StringUtils.isEmpty( arguments ) ) |
275 | { | |
276 | 0 | arguments += " -P "; |
277 | } | |
278 | else | |
279 | { | |
280 | 0 | arguments = "-P "; |
281 | } | |
282 | ||
283 | 0 | for ( Iterator it = profiles.iterator(); it.hasNext(); ) |
284 | { | |
285 | 0 | Profile profile = (Profile) it.next(); |
286 | ||
287 | 0 | arguments += profile.getId(); |
288 | 0 | if ( it.hasNext() ) |
289 | { | |
290 | 0 | arguments += ","; |
291 | } | |
292 | 0 | } |
293 | ||
294 | 0 | String additionalProfiles = getAdditionalProfiles(); |
295 | 0 | if ( additionalProfiles != null ) |
296 | { | |
297 | 0 | if ( !profiles.isEmpty() ) |
298 | { | |
299 | 0 | arguments += ","; |
300 | } | |
301 | 0 | arguments += additionalProfiles; |
302 | } | |
303 | } | |
304 | 0 | descriptor.setAdditionalArguments( arguments ); |
305 | ||
306 | 0 | return descriptor; |
307 | } | |
308 | ||
309 | /** | |
310 | * Gets the comma separated list of additional profiles for the release build. | |
311 | * | |
312 | * @return additional profiles to enable during release | |
313 | */ | |
314 | protected String getAdditionalProfiles() | |
315 | { | |
316 | 0 | return null; |
317 | } | |
318 | ||
319 | /** | |
320 | * Sets the component used to perform release actions. | |
321 | * | |
322 | * @param releaseManager The release manager implementation to use, must not be <code>null</code>. | |
323 | */ | |
324 | void setReleaseManager( ReleaseManager releaseManager ) | |
325 | { | |
326 | 0 | this.releaseManager = releaseManager; |
327 | 0 | } |
328 | ||
329 | /** | |
330 | * Gets the effective settings for this build. | |
331 | * | |
332 | * @return The effective settings for this build, never <code>null</code>. | |
333 | */ | |
334 | Settings getSettings() | |
335 | { | |
336 | 0 | return settings; |
337 | } | |
338 | ||
339 | /** | |
340 | * Sets the base directory of the build. | |
341 | * | |
342 | * @param basedir The build's base directory, must not be <code>null</code>. | |
343 | */ | |
344 | public void setBasedir( File basedir ) | |
345 | { | |
346 | 0 | this.basedir = basedir; |
347 | 0 | } |
348 | ||
349 | /** | |
350 | * Gets the list of projects in the build reactor. | |
351 | * | |
352 | * @return The list of reactor project, never <code>null</code>. | |
353 | */ | |
354 | public List getReactorProjects() | |
355 | { | |
356 | 0 | return reactorProjects; |
357 | } | |
358 | ||
359 | /** | |
360 | * Add additional arguments. | |
361 | * | |
362 | * @param argument The argument to add, must not be <code>null</code>. | |
363 | */ | |
364 | protected void addArgument( String argument ) | |
365 | { | |
366 | 0 | if ( arguments != null ) |
367 | { | |
368 | 0 | arguments += " " + argument; |
369 | } | |
370 | else | |
371 | { | |
372 | 0 | arguments = argument; |
373 | } | |
374 | 0 | } |
375 | ||
376 | /** | |
377 | * This method takes some of the release configuration picked up from the command line system properties and copies | |
378 | * it into the release config object. | |
379 | * | |
380 | * @param config The release configuration to merge the system properties into, must not be <code>null</code>. | |
381 | * @param sysPropertiesConfig The configuration from the system properties to merge in, must not be | |
382 | * <code>null</code>. | |
383 | */ | |
384 | protected void mergeCommandLineConfig( ReleaseDescriptor config, ReleaseDescriptor sysPropertiesConfig ) | |
385 | { | |
386 | // If the user specifies versions, these should override the existing versions | |
387 | 0 | if ( sysPropertiesConfig.getReleaseVersions() != null ) |
388 | { | |
389 | 0 | config.getReleaseVersions().putAll( sysPropertiesConfig.getReleaseVersions() ); |
390 | } | |
391 | 0 | if ( sysPropertiesConfig.getDevelopmentVersions() != null ) |
392 | { | |
393 | 0 | config.getDevelopmentVersions().putAll( sysPropertiesConfig.getDevelopmentVersions() ); |
394 | } | |
395 | 0 | } |
396 | } |