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 816529 2012-05-08 11:36:38Z 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 * Commits to do are atomic or by project.
115 *
116 * @parameter expression="${commitByProject}" default-value="false"
117 * @since 2.0-beta-5
118 */
119 private boolean commitByProject;
120
121 /**
122 * Whether to allow timestamped SNAPSHOT dependencies. Default is to fail when finding any SNAPSHOT.
123 *
124 * @parameter expression="${ignoreSnapshots}" default-value="false"
125 * @since 2.0-beta-7
126 */
127 private boolean allowTimestampedSnapshots;
128
129 /**
130 * Whether to allow usage of a SNAPSHOT version of the Release Plugin. This in an internal property used to support
131 * testing of the plugin itself in batch mode.
132 *
133 * @parameter expression="${allowReleasePluginSnapshot}" default-value="false"
134 * @readonly
135 * @since 2.0-beta-9
136 */
137 private boolean allowReleasePluginSnapshot;
138
139 /**
140 * Additional files that will skipped when checking for
141 * modifications on the working copy.
142 *
143 * Is ignored, when checkModificationExcludes is set.
144 *
145 *
146 * @parameter
147 * @since 2.1
148 */
149 private String[] checkModificationExcludes;
150
151 /**
152 * Command-line version of checkModificationExcludes
153 *
154 *
155 * @parameter expression="${checkModificationExcludeList}"
156 * @since 2.1
157 */
158 private String checkModificationExcludeList;
159
160 /**
161 * Default version to use when preparing a release or a branch.
162 *
163 * @parameter expression="${releaseVersion}"
164 * @since 2.0-beta-8
165 */
166 private String releaseVersion;
167
168 /**
169 * Default version to use for new local working copy.
170 *
171 * @parameter expression="${developmentVersion}"
172 * @since 2.0-beta-8
173 */
174 private String developmentVersion;
175
176 /**
177 * Currently only implemented with svn scm.
178 *
179 * <ul>
180 * <li>Enables a workaround to prevent issue
181 * due to svn client > 1.5.0 (fixed in 1.6.5)
182 * (http://jira.codehaus.org/browse/SCM-406)</li>
183 * <li>You may not want to use this in conjunction
184 * with <code>suppressCommitBeforeTag</code>, such that no poms with
185 * released versions are committed to the working
186 * copy ever.</li>
187 * </ul>
188 *
189 * @parameter expression="${remoteTagging}" default-value="true"
190 * @since 2.0-beta-9
191 */
192 private boolean remoteTagging;
193
194 /**
195 * Whether to bump the working copy versions to <code>developmentVersion</code>.
196 *
197 * @parameter expression="${updateWorkingCopyVersions}" default-value="true"
198 * @since 2.1
199 */
200 private boolean updateWorkingCopyVersions;
201
202 /**
203 * Whether to suppress a commit of changes to the working copy
204 * before the tag is created.
205 * <br/>
206 * <br/>This requires <code>remoteTagging</code> to be set to false.
207 * <br/>
208 * <br/><code>suppressCommitBeforeTag</code> is useful when you want
209 * to avoid poms with released versions in all revisions of your
210 * trunk or development branch.
211 *
212 * @parameter expression="${suppressCommitBeforeTag}" default-value="false"
213 * @since 2.1
214 */
215 private boolean suppressCommitBeforeTag;
216
217 /**
218 * @parameter expression="${session}"
219 * @readonly
220 * @required
221 * @since 2.0
222 */
223 protected MavenSession session;
224
225 /**
226 * {@inheritDoc}
227 */
228 public void execute()
229 throws MojoExecutionException, MojoFailureException
230 {
231 if ( generateReleasePoms )
232 {
233 throw new MojoFailureException(
234 "Generating release POMs is no longer supported in release:prepare. Please run release:prepare-with-pom instead." );
235 }
236
237 prepareRelease( generateReleasePoms );
238 }
239
240 protected void prepareRelease( boolean generateReleasePoms )
241 throws MojoExecutionException, MojoFailureException
242 {
243 // this is here so the subclass can call it without getting the extra generateReleasePoms check in execute() above
244 super.execute();
245
246 ReleaseDescriptor config = createReleaseDescriptor();
247 config.setAddSchema( addSchema );
248 config.setGenerateReleasePoms( generateReleasePoms );
249 config.setScmUseEditMode( useEditMode );
250 config.setPreparationGoals( preparationGoals );
251 config.setCommitByProject( commitByProject );
252 config.setUpdateDependencies( updateDependencies );
253 config.setAutoVersionSubmodules( autoVersionSubmodules );
254 config.setAllowTimestampedSnapshots( allowTimestampedSnapshots );
255 config.setSnapshotReleasePluginAllowed( allowReleasePluginSnapshot );
256 config.setDefaultReleaseVersion( releaseVersion );
257 config.setDefaultDevelopmentVersion( developmentVersion );
258 config.setRemoteTagging( remoteTagging );
259 config.setUpdateWorkingCopyVersions( updateWorkingCopyVersions );
260 config.setSuppressCommitBeforeTagOrBranch( suppressCommitBeforeTag );
261
262 if ( checkModificationExcludeList != null )
263 {
264 checkModificationExcludes = checkModificationExcludeList.replaceAll( "\\s", "" ).split( "," );
265 }
266
267 if ( checkModificationExcludes != null )
268 {
269 config.setCheckModificationExcludes( Arrays.asList( checkModificationExcludes ) );
270 }
271
272 // Create a config containing values from the session properties (ie command line properties with cli).
273 ReleaseDescriptor sysPropertiesConfig
274 = ReleaseUtils.copyPropertiesToReleaseDescriptor( session.getExecutionProperties() );
275 mergeCommandLineConfig( config, sysPropertiesConfig );
276
277 try
278 {
279 releaseManager.prepare( config, getReleaseEnvironment(), reactorProjects, resume, dryRun );
280 }
281 catch ( ReleaseExecutionException e )
282 {
283 throw new MojoExecutionException( e.getMessage(), e );
284 }
285 catch ( ReleaseFailureException e )
286 {
287 throw new MojoFailureException( e.getMessage(), e );
288 }
289 }
290
291 }