View Javadoc

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 }