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 }