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 org.apache.maven.execution.MavenSession;
23 import org.apache.maven.plugin.MojoExecutionException;
24 import org.apache.maven.plugin.MojoFailureException;
25 import org.apache.maven.shared.release.ReleaseExecutionException;
26 import org.apache.maven.shared.release.ReleaseFailureException;
27 import org.apache.maven.shared.release.config.ReleaseDescriptor;
28 import org.apache.maven.shared.release.config.ReleaseUtils;
29
30 import java.util.Arrays;
31
32 /**
33 * Prepare for a release in SCM. Steps through several phases to ensure the POM is ready to be
34 * released and then prepares SCM to eventually contain a tagged version of the release and a record
35 * in the local copy of the parameters used. This can be followed by a call to <tt>release:perform</tt>.
36 * For more info see <a href="http://maven.apache.org/plugins/maven-release-plugin/examples/prepare-release.html">http://maven.apache.org/plugins/maven-release-plugin/examples/prepare-release.html</a>.
37 *
38 * @author <a href="mailto:jdcasey@apache.org">John Casey</a>
39 * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
40 * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
41 * @author <a href="mailto:brett@apache.org">Brett Porter</a>
42 * @version $Id: PrepareReleaseMojo.html 816531 2012-05-08 11:38:11Z hboutemy $
43 * @aggregator
44 * @goal prepare
45 * @todo [!] check how this works with version ranges
46 */
47 public class PrepareReleaseMojo
48 extends AbstractReleaseMojo
49 {
50
51 /**
52 * Resume a previous release attempt from the point where it was stopped.
53 *
54 * @parameter expression="${resume}" default-value="true"
55 */
56 private boolean resume;
57
58 /**
59 * @deprecated Please use release:prepare-with-pom instead.
60 *
61 * @parameter default-value="false" expression="${generateReleasePoms}"
62 */
63 private boolean generateReleasePoms;
64
65 /**
66 * Whether to use "edit" mode on the SCM, to lock the file for editing during SCM operations.
67 *
68 * @parameter expression="${useEditMode}" default-value="false"
69 */
70 private boolean useEditMode;
71
72 /**
73 * Whether to update dependencies version to the next development version.
74 *
75 * @parameter expression="${updateDependencies}" default-value="true"
76 * @since 2.0-beta-5
77 */
78 private boolean updateDependencies;
79
80 /**
81 * Whether to automatically assign submodules the parent version. If set to false, the user will be prompted for the
82 * version of each submodules.
83 *
84 * @parameter expression="${autoVersionSubmodules}" default-value="false"
85 * @since 2.0-beta-5
86 */
87 private boolean autoVersionSubmodules;
88
89 /**
90 * Dry run: don't checkin or tag anything in the scm repository, or modify the checkout. Running
91 * <code>mvn -DdryRun=true release:prepare</code> is useful in order to check that modifications to poms and scm
92 * operations (only listed on the console) are working as expected. Modified POMs are written alongside the
93 * originals without modifying them.
94 *
95 * @parameter expression="${dryRun}" default-value="false"
96 */
97 private boolean dryRun;
98
99 /**
100 * Whether to add a schema to the POM if it was previously missing on release.
101 *
102 * @parameter expression="${addSchema}" default-value="true"
103 */
104 private boolean addSchema;
105
106 /**
107 * Goals to run as part of the preparation step, after transformation but before committing. Space delimited.
108 *
109 * @parameter expression="${preparationGoals}" default-value="clean verify"
110 */
111 private String preparationGoals;
112
113 /**
114 * Goals to run on completion of the preparation step, after transformation back to the next development version
115 * but before committing. Space delimited.
116 *
117 * @parameter expression="${completionGoals}" default-value=""
118 * @since 2.2
119 */
120 private String completionGoals;
121
122 /**
123 * Commits to do are atomic or by project.
124 *
125 * @parameter expression="${commitByProject}" default-value="false"
126 * @since 2.0-beta-5
127 */
128 private boolean commitByProject;
129
130 /**
131 * Whether to allow timestamped SNAPSHOT dependencies. Default is to fail when finding any SNAPSHOT.
132 *
133 * @parameter expression="${ignoreSnapshots}" default-value="false"
134 * @since 2.0-beta-7
135 */
136 private boolean allowTimestampedSnapshots;
137
138 /**
139 * Whether to allow usage of a SNAPSHOT version of the Release Plugin. This in an internal property used to support
140 * testing of the plugin itself in batch mode.
141 *
142 * @parameter expression="${allowReleasePluginSnapshot}" default-value="false"
143 * @readonly
144 * @since 2.0-beta-9
145 */
146 private boolean allowReleasePluginSnapshot;
147
148 /**
149 * Additional files that will skipped when checking for
150 * modifications on the working copy.
151 *
152 * Is ignored, when checkModificationExcludes is set.
153 *
154 *
155 * @parameter
156 * @since 2.1
157 */
158 private String[] checkModificationExcludes;
159
160 /**
161 * Command-line version of checkModificationExcludes
162 *
163 *
164 * @parameter expression="${checkModificationExcludeList}"
165 * @since 2.1
166 */
167 private String checkModificationExcludeList;
168
169 /**
170 * Default version to use when preparing a release or a branch.
171 *
172 * @parameter expression="${releaseVersion}"
173 * @since 2.0-beta-8
174 */
175 private String releaseVersion;
176
177 /**
178 * Default version to use for new local working copy.
179 *
180 * @parameter expression="${developmentVersion}"
181 * @since 2.0-beta-8
182 */
183 private String developmentVersion;
184
185 /**
186 * Currently only implemented with svn scm.
187 *
188 * <ul>
189 * <li>Enables a workaround to prevent issue
190 * due to svn client > 1.5.0 (fixed in 1.6.5)
191 * (http://jira.codehaus.org/browse/SCM-406)</li>
192 * <li>You may not want to use this in conjunction
193 * with <code>suppressCommitBeforeTag</code>, such that no poms with
194 * released versions are committed to the working
195 * copy ever.</li>
196 * </ul>
197 *
198 * @parameter expression="${remoteTagging}" default-value="true"
199 * @since 2.0-beta-9
200 */
201 private boolean remoteTagging;
202
203 /**
204 * Whether to bump the working copy versions to <code>developmentVersion</code>.
205 *
206 * @parameter expression="${updateWorkingCopyVersions}" default-value="true"
207 * @since 2.1
208 */
209 private boolean updateWorkingCopyVersions;
210
211 /**
212 * Whether to suppress a commit of changes to the working copy
213 * before the tag is created.
214 * <br/>
215 * <br/>This requires <code>remoteTagging</code> to be set to false.
216 * <br/>
217 * <br/><code>suppressCommitBeforeTag</code> is useful when you want
218 * to avoid poms with released versions in all revisions of your
219 * trunk or development branch.
220 *
221 * @parameter expression="${suppressCommitBeforeTag}" default-value="false"
222 * @since 2.1
223 */
224 private boolean suppressCommitBeforeTag;
225
226 /**
227 * Wait the specified number of second before creating the tag.
228 * <br/><code>waitBeforeTagging</code> is useful when your source repository
229 * is synced between several instances and access to it is determined by
230 * geographical location, like the SVN repository at the Apache Software
231 * Foundation.
232 *
233 * @parameter expression="${waitBeforeTagging}" default-value="0"
234 * @since 2.2
235 */
236 private int waitBeforeTagging;
237
238 /**
239 * @parameter expression="${session}"
240 * @readonly
241 * @required
242 * @since 2.0
243 */
244 protected MavenSession session;
245
246 /**
247 * {@inheritDoc}
248 */
249 public void execute()
250 throws MojoExecutionException, MojoFailureException
251 {
252 if ( generateReleasePoms )
253 {
254 throw new MojoFailureException(
255 "Generating release POMs is no longer supported in release:prepare. Please run release:prepare-with-pom instead." );
256 }
257
258 prepareRelease( generateReleasePoms );
259 }
260
261 protected void prepareRelease( boolean generateReleasePoms )
262 throws MojoExecutionException, MojoFailureException
263 {
264 // this is here so the subclass can call it without getting the extra generateReleasePoms check in execute() above
265 super.execute();
266
267 ReleaseDescriptor config = createReleaseDescriptor();
268 config.setAddSchema( addSchema );
269 config.setGenerateReleasePoms( generateReleasePoms );
270 config.setScmUseEditMode( useEditMode );
271 config.setPreparationGoals( preparationGoals );
272 config.setCompletionGoals( completionGoals );
273 config.setCommitByProject( commitByProject );
274 config.setUpdateDependencies( updateDependencies );
275 config.setAutoVersionSubmodules( autoVersionSubmodules );
276 config.setAllowTimestampedSnapshots( allowTimestampedSnapshots );
277 config.setSnapshotReleasePluginAllowed( allowReleasePluginSnapshot );
278 config.setDefaultReleaseVersion( releaseVersion );
279 config.setDefaultDevelopmentVersion( developmentVersion );
280 config.setRemoteTagging( remoteTagging );
281 config.setUpdateWorkingCopyVersions( updateWorkingCopyVersions );
282 config.setSuppressCommitBeforeTagOrBranch( suppressCommitBeforeTag );
283 config.setWaitBeforeTagging( waitBeforeTagging );
284
285 if ( checkModificationExcludeList != null )
286 {
287 checkModificationExcludes = checkModificationExcludeList.replaceAll( "\\s", "" ).split( "," );
288 }
289
290 if ( checkModificationExcludes != null )
291 {
292 config.setCheckModificationExcludes( Arrays.asList( checkModificationExcludes ) );
293 }
294
295 // Create a config containing values from the session properties (ie command line properties with cli).
296 ReleaseDescriptor sysPropertiesConfig
297 = ReleaseUtils.copyPropertiesToReleaseDescriptor( session.getExecutionProperties() );
298 mergeCommandLineConfig( config, sysPropertiesConfig );
299
300 try
301 {
302 releaseManager.prepare( config, getReleaseEnvironment(), reactorProjects, resume, dryRun );
303 }
304 catch ( ReleaseExecutionException e )
305 {
306 throw new MojoExecutionException( e.getMessage(), e );
307 }
308 catch ( ReleaseFailureException e )
309 {
310 throw new MojoFailureException( e.getMessage(), e );
311 }
312 }
313
314 }