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.model.Profile;
28 import org.apache.maven.plugin.AbstractMojo;
29 import org.apache.maven.plugin.MojoExecutionException;
30 import org.apache.maven.plugin.MojoFailureException;
31 import org.apache.maven.project.MavenProject;
32 import org.apache.maven.scm.manager.ScmManager;
33 import org.apache.maven.settings.Settings;
34 import org.apache.maven.shared.release.ReleaseManager;
35 import org.apache.maven.shared.release.config.ReleaseDescriptor;
36 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
37 import org.apache.maven.shared.release.env.ReleaseEnvironment;
38 import org.codehaus.plexus.util.StringUtils;
39
40 /**
41 * Base class with shared configuration.
42 *
43 * @author <a href="mailto:brett@apache.org">Brett Porter</a>
44 * @version $Id: AbstractReleaseMojo.html 816525 2012-05-08 11:35:10Z hboutemy $
45 */
46 public abstract class AbstractReleaseMojo
47 extends AbstractMojo
48 {
49 /**
50 * The SCM username to use.
51 *
52 * @parameter expression="${username}"
53 */
54 private String username;
55
56 /**
57 * The SCM password to use.
58 *
59 * @parameter expression="${password}"
60 */
61 private String password;
62
63 /**
64 * The SCM tag to use.
65 *
66 * @parameter expression="${tag}" alias="releaseLabel"
67 */
68 private String tag;
69
70 /**
71 * The tag base directory in SVN, you must define it if you don't use the standard svn layout (trunk/tags/branches).
72 * For example, <code>http://svn.apache.org/repos/asf/maven/plugins/tags</code>. The URL is an SVN URL and does not
73 * include the SCM provider and protocol.
74 *
75 * @parameter expression="${tagBase}"
76 */
77 private String tagBase;
78
79 /**
80 * @parameter expression="${basedir}"
81 * @required
82 * @readonly
83 */
84 protected File basedir;
85
86 /**
87 * @parameter expression="${settings}"
88 * @required
89 * @readonly
90 */
91 protected Settings settings;
92
93 /**
94 * @parameter expression="${project}"
95 * @required
96 * @readonly
97 */
98 protected MavenProject project;
99
100 /**
101 * @component
102 */
103 protected ReleaseManager releaseManager;
104
105 /**
106 * Additional arguments to pass to the Maven executions, separated by spaces.
107 *
108 * @parameter expression="${arguments}" alias="prepareVerifyArgs"
109 */
110 private String arguments;
111
112 /**
113 * The file name of the POM to execute any goals against.
114 *
115 * @parameter expression="${pomFileName}"
116 */
117 private String pomFileName;
118
119 /**
120 * The message prefix to use for all SCM changes.
121 *
122 * @parameter expression="${scmCommentPrefix}" default-value="[maven-release-plugin] "
123 * @since 2.0-beta-5
124 */
125 private String scmCommentPrefix;
126
127 /**
128 * @parameter expression="${reactorProjects}"
129 * @required
130 * @readonly
131 */
132 protected List reactorProjects;
133
134 /**
135 * List of provider implementations.
136 *
137 * @parameter
138 * @since 2.0-beta-6
139 */
140 private Map providerImplementations;
141
142 /**
143 * The M2_HOME parameter to use for forked Maven invocations.
144 *
145 * @parameter default-value="${maven.home}"
146 * @since 2.0-beta-8
147 */
148 protected File mavenHome;
149
150 /**
151 * The JAVA_HOME parameter to use for forked Maven invocations.
152 *
153 * @parameter default-value="${java.home}"
154 * @since 2.0-beta-8
155 */
156 protected File javaHome;
157
158 /**
159 * The command-line local repository directory in use for this build (if specified).
160 *
161 * @parameter default-value="${maven.repo.local}"
162 * @since 2.0-beta-8
163 */
164 protected File localRepoDirectory;
165
166 /**
167 * Role hint of the {@link org.apache.maven.shared.release.exec.MavenExecutor} implementation to use.
168 *
169 * @parameter expression="${mavenExecutorId}" default-value="invoker"
170 * @since 2.0-beta-8
171 */
172 protected String mavenExecutorId;
173
174 /**
175 * Use a local checkout instead of doing a checkout from the upstream repository.
176 * ATTENTION: This will only work with distributed SCMs which support the file:// protocol
177 * like e.g. git, jgit or hg!
178 *
179 * TODO: we should think about having the defaults for the various SCM providers provided via modello!
180 *
181 * @parameter expression="${localCheckout}" default-value="false"
182 * @since 2.0
183 */
184 private boolean localCheckout;
185
186 /**
187 * The SCM manager.
188 *
189 * @component
190 */
191 private ScmManager scmManager;
192
193
194 /**
195 * Gets the enviroment settings configured for this release.
196 *
197 * @return The release environment, never <code>null</code>.
198 */
199 protected ReleaseEnvironment getReleaseEnvironment()
200 {
201 return new DefaultReleaseEnvironment().setSettings( settings )
202 .setJavaHome( javaHome )
203 .setMavenHome( mavenHome )
204 .setLocalRepositoryDirectory( localRepoDirectory )
205 .setMavenExecutorId( mavenExecutorId );
206 }
207
208 /**
209 * {@inheritDoc}
210 */
211 public void execute()
212 throws MojoExecutionException, MojoFailureException
213 {
214 if ( providerImplementations != null )
215 {
216 for ( Iterator i = providerImplementations.keySet().iterator(); i.hasNext(); )
217 {
218 String providerType = (String) i.next();
219 String providerImplementation = (String) providerImplementations.get( providerType );
220 getLog().info( "Change the default '" + providerType + "' provider implementation to '"
221 + providerImplementation + "'." );
222 scmManager.setScmProviderImplementation( providerType, providerImplementation );
223 }
224 }
225 }
226
227 /**
228 * Creates the release descriptor from the various goal parameters.
229 *
230 * @return The release descriptor, never <code>null</code>.
231 */
232 protected ReleaseDescriptor createReleaseDescriptor()
233 {
234 ReleaseDescriptor descriptor = new ReleaseDescriptor();
235
236 descriptor.setInteractive( settings.isInteractiveMode() );
237
238 descriptor.setScmPassword( password );
239 descriptor.setScmReleaseLabel( tag );
240 descriptor.setScmTagBase( tagBase );
241 descriptor.setScmUsername( username );
242 descriptor.setScmCommentPrefix( scmCommentPrefix );
243
244 descriptor.setWorkingDirectory( basedir.getAbsolutePath() );
245
246 descriptor.setPomFileName( pomFileName );
247
248 descriptor.setLocalCheckout( localCheckout );
249
250 List profiles = project.getActiveProfiles();
251
252 String arguments = this.arguments;
253 if ( profiles != null && !profiles.isEmpty() )
254 {
255 if ( !StringUtils.isEmpty( arguments ) )
256 {
257 arguments += " -P ";
258 }
259 else
260 {
261 arguments = "-P ";
262 }
263
264 for ( Iterator it = profiles.iterator(); it.hasNext(); )
265 {
266 Profile profile = (Profile) it.next();
267
268 arguments += profile.getId();
269 if ( it.hasNext() )
270 {
271 arguments += ",";
272 }
273 }
274
275 String additionalProfiles = getAdditionalProfiles();
276 if ( additionalProfiles != null )
277 {
278 if ( !profiles.isEmpty() )
279 {
280 arguments += ",";
281 }
282 arguments += additionalProfiles;
283 }
284 }
285 descriptor.setAdditionalArguments( arguments );
286
287 return descriptor;
288 }
289
290 /**
291 * Gets the comma separated list of additional profiles for the release build.
292 *
293 * @return additional profiles to enable during release
294 */
295 protected String getAdditionalProfiles()
296 {
297 return null;
298 }
299
300 /**
301 * Sets the component used to perform release actions.
302 *
303 * @param releaseManager The release manager implementation to use, must not be <code>null</code>.
304 */
305 void setReleaseManager( ReleaseManager releaseManager )
306 {
307 this.releaseManager = releaseManager;
308 }
309
310 /**
311 * Gets the effective settings for this build.
312 *
313 * @return The effective settings for this build, never <code>null</code>.
314 */
315 Settings getSettings()
316 {
317 return settings;
318 }
319
320 /**
321 * Sets the base directory of the build.
322 *
323 * @param basedir The build's base directory, must not be <code>null</code>.
324 */
325 public void setBasedir( File basedir )
326 {
327 this.basedir = basedir;
328 }
329
330 /**
331 * Gets the list of projects in the build reactor.
332 *
333 * @return The list of reactor project, never <code>null</code>.
334 */
335 public List getReactorProjects()
336 {
337 return reactorProjects;
338 }
339
340 /**
341 * Add additional arguments.
342 *
343 * @param argument The argument to add, must not be <code>null</code>.
344 */
345 protected void addArgument( String argument )
346 {
347 if ( arguments != null )
348 {
349 arguments += " " + argument;
350 }
351 else
352 {
353 arguments = argument;
354 }
355 }
356 }