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  /**
31   * Prepare for a release in SCM.
32   * For more info see <a href="/plugins/maven-release-plugin/examples/prepare-release.html">this example</a>.
33   *
34   * @author <a href="mailto:jdcasey@apache.org">John Casey</a>
35   * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
36   * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
37   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
38   * @version $Id: PrepareReleaseMojo.html 816525 2012-05-08 11:35:10Z hboutemy $
39   * @aggregator
40   * @goal prepare
41   * @todo [!] check how this works with version ranges
42   */
43  public class PrepareReleaseMojo
44      extends AbstractReleaseMojo
45  {
46  
47      /**
48       * Resume a previous release attempt from the point where it was stopped.
49       *
50       * @parameter expression="${resume}" default-value="true"
51       */
52      private boolean resume;
53  
54      /**
55       * @deprecated Please use release:prepare-with-pom instead.
56       *
57       * @parameter default-value="false" expression="${generateReleasePoms}"
58       */
59      private boolean generateReleasePoms;
60  
61      /**
62       * Whether to use "edit" mode on the SCM, to lock the file for editing during SCM operations.
63       *
64       * @parameter expression="${useEditMode}" default-value="false"
65       */
66      private boolean useEditMode;
67  
68      /**
69       * Whether to update dependencies version to the next development version.
70       *
71       * @parameter expression="${updateDependencies}" default-value="true"
72       * @since 2.0-beta-5
73       */
74      private boolean updateDependencies;
75  
76      /**
77       * Whether to automatically assign submodules the parent version. If set to false, the user will be prompted for the
78       * version of each submodules.
79       *
80       * @parameter expression="${autoVersionSubmodules}" default-value="false"
81       * @since 2.0-beta-5
82       */
83      private boolean autoVersionSubmodules;
84  
85      /**
86       * Dry run: don't checkin or tag anything in the scm repository, or modify the checkout. Running
87       * <code>mvn -DdryRun=true release:prepare</code> is useful in order to check that modifications to poms and scm
88       * operations (only listed on the console) are working as expected. Modified POMs are written alongside the
89       * originals without modifying them.
90       *
91       * @parameter expression="${dryRun}" default-value="false"
92       */
93      private boolean dryRun;
94  
95      /**
96       * Whether to add a schema to the POM if it was previously missing on release.
97       *
98       * @parameter expression="${addSchema}" default-value="true"
99       */
100     private boolean addSchema;
101 
102     /**
103      * Goals to run as part of the preparation step, after transformation but before committing. Space delimited.
104      *
105      * @parameter expression="${preparationGoals}" default-value="clean verify"
106      */
107     private String preparationGoals;
108 
109     /**
110      * Commits to do are atomic or by project.
111      *
112      * @parameter expression="${commitByProject}" default-value="false"
113      * @since 2.0-beta-5
114      */
115     private boolean commitByProject;
116 
117     /**
118      * Whether to allow timestamped SNAPSHOT dependencies. Default is to fail when finding any SNAPSHOT.
119      *
120      * @parameter expression="${ignoreSnapshots}" default-value="false"
121      * @since 2.0-beta-7
122      */
123     private boolean allowTimestampedSnapshots;
124 
125     /**
126      * Whether to allow usage of a SNAPSHOT version of the Release Plugin. This in an internal property used to support
127      * testing of the plugin itself in batch mode.
128      *
129      * @parameter expression="${allowReleasePluginSnapshot}" default-value="false"
130      * @readonly
131      * @since 2.0-beta-9
132      */
133     private boolean allowReleasePluginSnapshot;
134 
135     /**
136      * Default version to use when preparing a release or a branch.
137      *
138      * @parameter expression="${releaseVersion}"
139      * @since 2.0-beta-8
140      */
141     private String releaseVersion;
142 
143     /**
144      * Default version to use for new local working copy.
145      *
146      * @parameter expression="${developmentVersion}"
147      * @since 2.0-beta-8
148      */
149     private String developmentVersion;
150 
151     /**
152      * currently only implemented with svn scm. Enable a workaround to prevent issue
153      * due to svn client > 1.5.0 (http://jira.codehaus.org/browse/SCM-406)
154      *
155      *
156      * @parameter expression="${remoteTagging}" default-value="true"
157      * @since 2.0-beta-9
158      */
159     private boolean remoteTagging;
160 
161     /**
162      * @parameter expression="${session}"
163      * @readonly
164      * @required
165      * @since 2.0
166      */
167     protected MavenSession session;
168 
169     /**
170      * {@inheritDoc}
171      */
172     public void execute()
173         throws MojoExecutionException, MojoFailureException
174     {
175         if ( generateReleasePoms )
176         {
177             throw new MojoFailureException(
178                 "Generating release POMs is no longer supported in release:prepare. Please run release:prepare-with-pom instead." );
179         }
180 
181         prepareRelease( generateReleasePoms );
182     }
183 
184     protected void prepareRelease( boolean generateReleasePoms )
185         throws MojoExecutionException, MojoFailureException
186     {
187         // this is here so the subclass can call it without getting the extra generateReleasePoms check in execute() above
188         super.execute();
189 
190         ReleaseDescriptor config = createReleaseDescriptor();
191         config.setAddSchema( addSchema );
192         config.setGenerateReleasePoms( generateReleasePoms );
193         config.setScmUseEditMode( useEditMode );
194         config.setPreparationGoals( preparationGoals );
195         config.setCommitByProject( commitByProject );
196         config.setUpdateDependencies( updateDependencies );
197         config.setAutoVersionSubmodules( autoVersionSubmodules );
198         config.setAllowTimestampedSnapshots( allowTimestampedSnapshots );
199         config.setSnapshotReleasePluginAllowed( allowReleasePluginSnapshot );
200         config.setDefaultReleaseVersion( releaseVersion );
201         config.setDefaultDevelopmentVersion( developmentVersion );
202         config.setRemoteTagging( remoteTagging );
203 
204         // Create a config containing values from the session properties (ie command line properties with cli).
205         ReleaseDescriptor sysPropertiesConfig
206                 = ReleaseUtils.copyPropertiesToReleaseDescriptor( session.getExecutionProperties() );
207         mergeCommandLineConfig( config, sysPropertiesConfig );
208 
209         try
210         {
211             releaseManager.prepare( config, getReleaseEnvironment(), reactorProjects, resume, dryRun );
212         }
213         catch ( ReleaseExecutionException e )
214         {
215             throw new MojoExecutionException( e.getMessage(), e );
216         }
217         catch ( ReleaseFailureException e )
218         {
219             throw new MojoFailureException( e.getMessage(), e );
220         }
221     }
222 
223     /**
224      * This method takes some of the release configuration picked up from the command line system properties and copies
225      * it into the release config object.
226      *
227      * @param config The release configuration to merge the system properties into, must not be <code>null</code>.
228      * @param sysPropertiesConfig The configuration from the system properties to merge in, must not be
229      *            <code>null</code>.
230      */
231     private void mergeCommandLineConfig( ReleaseDescriptor config, ReleaseDescriptor sysPropertiesConfig )
232     {
233         // If the user specifies versions, these should override the existing versions
234         if ( sysPropertiesConfig.getReleaseVersions() != null )
235         {
236             config.getReleaseVersions().putAll( sysPropertiesConfig.getReleaseVersions() );
237         }
238         if ( sysPropertiesConfig.getDevelopmentVersions() != null )
239         {
240             config.getDevelopmentVersions().putAll( sysPropertiesConfig.getDevelopmentVersions() );
241         }
242     }
243 
244 }