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