You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by br...@apache.org on 2010/09/29 15:22:42 UTC

svn commit: r1002613 - in /maven/release/trunk: maven-release-manager/ maven-release-manager/src/main/ maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ maven-release-manager/src/main/java/org/apache/maven/shared/release/phase...

Author: brett
Date: Wed Sep 29 13:22:42 2010
New Revision: 1002613

URL: http://svn.apache.org/viewvc?rev=1002613&view=rev
Log:
[MRELEASE-458] allow creation of a branch without making unneeded changes to the POM on trunk
Submitted by: Lars Corneliussen

Added:
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java
      - copied, changed from r983489, maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java   (with props)
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhase.java   (with props)
    maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java   (with props)
    maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java
      - copied, changed from r983489, maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPhaseTest.java
    maven/release/trunk/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.xml   (with props)
    maven/release/trunk/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.xml
      - copied unchanged from r983489, maven/release/trunk/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/ScmCommitPhaseTest.xml
Removed:
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPhase.java
    maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPhaseTest.java
    maven/release/trunk/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/ScmCommitPhaseTest.xml
Modified:
    maven/release/trunk/maven-release-manager/pom.xml
    maven/release/trunk/maven-release-manager/src/main/components-fragment.xml
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
    maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo
    maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java
    maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java
    maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
    maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java

Modified: maven/release/trunk/maven-release-manager/pom.xml
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/pom.xml?rev=1002613&r1=1002612&r2=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/pom.xml (original)
+++ maven/release/trunk/maven-release-manager/pom.xml Wed Sep 29 13:22:42 2010
@@ -239,7 +239,7 @@
           </execution>
         </executions>
         <configuration>
-          <version>2.0.0</version>
+          <version>2.1.0</version>
           <packageWithVersion>false</packageWithVersion>
           <models>
             <model>src/main/mdo/release-descriptor.mdo</model>

Modified: maven/release/trunk/maven-release-manager/src/main/components-fragment.xml
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/components-fragment.xml?rev=1002613&r1=1002612&r2=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/components-fragment.xml (original)
+++ maven/release/trunk/maven-release-manager/src/main/components-fragment.xml Wed Sep 29 13:22:42 2010
@@ -151,7 +151,7 @@
     <component>
       <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
       <role-hint>scm-commit-release</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.ScmCommitPhase</implementation>
+      <implementation>org.apache.maven.shared.release.phase.ScmCommitPreparationPhase</implementation>
       <requirements>
         <requirement>
           <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
@@ -164,7 +164,7 @@
     <component>
       <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
       <role-hint>scm-commit-development</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.ScmCommitPhase</implementation>
+      <implementation>org.apache.maven.shared.release.phase.ScmCommitDevelopmentPhase</implementation>
       <requirements>
         <requirement>
           <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
@@ -172,12 +172,13 @@
       </requirements>
       <configuration>
         <messageFormat>prepare for next development iteration</messageFormat>
+        <rollbackMessageFormat>rollback changes from release preparation of {0}</rollbackMessageFormat>
       </configuration>
     </component>
     <component>
       <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
       <role-hint>scm-commit-branch</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.ScmCommitPhase</implementation>
+      <implementation>org.apache.maven.shared.release.phase.ScmCommitPreparationPhase</implementation>
       <requirements>
         <requirement>
           <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
@@ -220,7 +221,7 @@
     <component>
       <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
       <role-hint>scm-commit-rollback</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.ScmCommitPhase</implementation>
+      <implementation>org.apache.maven.shared.release.phase.ScmCommitPreparationPhase</implementation>
       <requirements>
         <requirement>
           <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java?rev=1002613&r1=1002612&r2=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java Wed Sep 29 13:22:42 2010
@@ -82,6 +82,7 @@ public class ReleaseUtils
         mergeInto.setBranchCreation( toBeMerged.isBranchCreation() );
         mergeInto.setUpdateBranchVersions( toBeMerged.isUpdateBranchVersions() );
         mergeInto.setUpdateWorkingCopyVersions( toBeMerged.isUpdateWorkingCopyVersions() );
+        mergeInto.setSuppressCommitBeforeTagOrBranch( toBeMerged.isSuppressCommitBeforeTagOrBranch() );
         mergeInto.setUpdateVersionsToSnapshot( toBeMerged.isUpdateVersionsToSnapshot() );
         mergeInto.setAllowTimestampedSnapshots( toBeMerged.isAllowTimestampedSnapshots() );
         mergeInto.setSnapshotReleasePluginAllowed( toBeMerged.isSnapshotReleasePluginAllowed() );

Copied: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java (from r983489, maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPhase.java)
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java?p2=maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java&p1=maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPhase.java&r1=983489&r2=1002613&rev=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java Wed Sep 29 13:22:42 2010
@@ -46,40 +46,77 @@ import java.util.Iterator;
 import java.util.List;
 
 /**
- * Commit the project to the SCM.
+ * Holds the basic concept of committing changes to the current working copy.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @author <a href="mailto:me@lcorneliussen.de">Lars Corneliussen</a>
  */
-public class ScmCommitPhase
+public abstract class AbstractScmCommitPhase
     extends AbstractReleasePhase
 {
+    protected boolean beforeBranchOrTag = false;
+
+    protected boolean afterBranchOrTag = false;
+
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    protected ScmRepositoryConfigurator scmRepositoryConfigurator;
 
     /**
      * The format for the commit message.
      */
-    private String messageFormat;
+    protected String messageFormat;
 
-    public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects )
+    public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                                  List reactorProjects )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult relResult = new ReleaseResult();
 
         validateConfiguration( releaseDescriptor );
 
+        runLogic( releaseDescriptor, releaseEnvironment, reactorProjects, relResult, false );
+
+        relResult.setResultCode( ReleaseResult.SUCCESS );
+
+        return relResult;
+    }
+
+    public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                                   List reactorProjects )
+        throws ReleaseExecutionException, ReleaseFailureException
+    {
+        ReleaseResult result = new ReleaseResult();
+
+        validateConfiguration( releaseDescriptor );
+
+        runLogic( releaseDescriptor, releaseEnvironment, reactorProjects, result, true );
+
+        result.setResultCode( ReleaseResult.SUCCESS );
+        return result;
+    }
+
+    protected abstract void runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                                      List reactorProjects, ReleaseResult result, boolean simulating )
+        throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException;
+
+    protected void performCheckins( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                                    List reactorProjects, String message )
+        throws ReleaseScmRepositoryException, ReleaseExecutionException, ReleaseScmCommandException
+    {
+
         getLogger().info( "Checking in modified POMs..." );
 
         ScmRepository repository;
         ScmProvider provider;
         try
         {
-            repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, releaseEnvironment.getSettings() );
+            repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
+                                                                            releaseEnvironment.getSettings() );
 
             repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
-            
+
             provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
         }
         catch ( ScmRepositoryException e )
@@ -100,7 +137,7 @@ public class ScmCommitPhase
                 List pomFiles = createPomFiles( releaseDescriptor, project );
                 ScmFileSet fileSet = new ScmFileSet( project.getFile().getParentFile(), pomFiles );
 
-                checkin( provider, repository, fileSet, releaseDescriptor );
+                checkin( provider, repository, fileSet, releaseDescriptor, message );
             }
         }
         else
@@ -108,19 +145,15 @@ public class ScmCommitPhase
             List pomFiles = createPomFiles( releaseDescriptor, reactorProjects );
             ScmFileSet fileSet = new ScmFileSet( new File( releaseDescriptor.getWorkingDirectory() ), pomFiles );
 
-            checkin( provider, repository, fileSet, releaseDescriptor );
+            checkin( provider, repository, fileSet, releaseDescriptor, message );
         }
-
-        relResult.setResultCode( ReleaseResult.SUCCESS );
-
-        return relResult;
     }
 
-    private void checkin( ScmProvider provider, ScmRepository repository, ScmFileSet fileSet, ReleaseDescriptor releaseDescriptor )
+    private void checkin( ScmProvider provider, ScmRepository repository, ScmFileSet fileSet,
+                          ReleaseDescriptor releaseDescriptor, String message )
         throws ReleaseExecutionException, ReleaseScmCommandException
     {
         CheckInScmResult result;
-        String message = createMessage( releaseDescriptor );
         try
         {
             result = provider.checkIn( repository, fileSet, (ScmVersion) null, message );
@@ -140,23 +173,14 @@ public class ScmCommitPhase
         }
     }
 
-    public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+    protected void simulateCheckins( ReleaseDescriptor releaseDescriptor, List reactorProjects, ReleaseResult result,
+                                     String message )
     {
-        ReleaseResult result = new ReleaseResult();
-
-        validateConfiguration( releaseDescriptor );
-
         Collection pomFiles = createPomFiles( releaseDescriptor, reactorProjects );
-        logInfo( result, "Full run would be checking in " + pomFiles.size() + " files with message: '" +
-            createMessage( releaseDescriptor ) + "'" );
-
-        result.setResultCode( ReleaseResult.SUCCESS );
-
-        return result;
+        logInfo( result, "Full run would be commit " + pomFiles.size() + " files with message: '" + message + "'" );
     }
 
-    private static void validateConfiguration( ReleaseDescriptor releaseDescriptor )
+    protected void validateConfiguration( ReleaseDescriptor releaseDescriptor )
         throws ReleaseFailureException
     {
         if ( releaseDescriptor.getScmReleaseLabel() == null )
@@ -165,13 +189,13 @@ public class ScmCommitPhase
         }
     }
 
-    private String createMessage( ReleaseDescriptor releaseDescriptor )
+    protected String createMessage( ReleaseDescriptor releaseDescriptor )
     {
         return MessageFormat.format( releaseDescriptor.getScmCommentPrefix() + messageFormat,
                                      new Object[]{releaseDescriptor.getScmReleaseLabel()} );
     }
 
-    private static List createPomFiles( ReleaseDescriptor releaseDescriptor, MavenProject project )
+    protected static List createPomFiles( ReleaseDescriptor releaseDescriptor, MavenProject project )
     {
         List pomFiles = new ArrayList();
 
@@ -185,7 +209,7 @@ public class ScmCommitPhase
         return pomFiles;
     }
 
-    private static List createPomFiles( ReleaseDescriptor releaseDescriptor, List reactorProjects )
+    protected static List createPomFiles( ReleaseDescriptor releaseDescriptor, List reactorProjects )
     {
         List pomFiles = new ArrayList();
         for ( Iterator i = reactorProjects.iterator(); i.hasNext(); )

Added: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java?rev=1002613&view=auto
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java (added)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java Wed Sep 29 13:22:42 2010
@@ -0,0 +1,100 @@
+package org.apache.maven.shared.release.phase;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.shared.release.ReleaseExecutionException;
+import org.apache.maven.shared.release.ReleaseResult;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.env.ReleaseEnvironment;
+import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
+import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
+
+import java.text.MessageFormat;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Commit the changes that were done to prepare the branch or tag to the SCM.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ */
+public class ScmCommitDevelopmentPhase
+    extends AbstractScmCommitPhase
+{
+
+    /**
+     * The format for the
+     */
+    private String rollbackMessageFormat;
+
+    protected void runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                             List reactorProjects, ReleaseResult result, boolean simulating )
+        throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException
+    {
+        // no rollback required
+        if (
+            // was there no commit that has to be rolled back by a new one
+            releaseDescriptor.isSuppressCommitBeforeTagOrBranch()
+                // and working copy should not be touched
+                && !releaseDescriptor.isUpdateWorkingCopyVersions() )
+        {
+            if ( simulating )
+            {
+                logInfo( result, "Full run would not commit changes, because updateWorkingCopyVersions is false." );
+            }
+            else
+            {
+                logInfo( result, "Modified POMs are not committed because updateWorkingCopyVersions is set to false." );
+            }
+        }
+        // rollback or commit development versions required
+        else
+        {
+            String message;
+            if ( !releaseDescriptor.isUpdateWorkingCopyVersions() )
+            {
+                // the commit is a rollback
+                message = createRollbackMessage( releaseDescriptor );
+            }
+            else
+            {
+                // a normal commit
+                message = createMessage( releaseDescriptor );
+            }
+            if ( simulating )
+            {
+                Collection pomFiles = createPomFiles( releaseDescriptor, reactorProjects );
+                logInfo( result,
+                         "Full run would be commit " + pomFiles.size() + " files with message: '" + message + "'" );
+            }
+            else
+            {
+                performCheckins( releaseDescriptor, releaseEnvironment, reactorProjects, message );
+            }
+        }
+    }
+
+    private String createRollbackMessage( ReleaseDescriptor releaseDescriptor )
+    {
+        return MessageFormat.format( releaseDescriptor.getScmCommentPrefix() + rollbackMessageFormat,
+                                     new Object[]{releaseDescriptor.getScmReleaseLabel()} );
+    }
+
+}
\ No newline at end of file

Propchange: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhase.java?rev=1002613&view=auto
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhase.java (added)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhase.java Wed Sep 29 13:22:42 2010
@@ -0,0 +1,97 @@
+package org.apache.maven.shared.release.phase;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.shared.release.ReleaseExecutionException;
+import org.apache.maven.shared.release.ReleaseFailureException;
+import org.apache.maven.shared.release.ReleaseResult;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.env.ReleaseEnvironment;
+import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
+import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+/**
+ * Commit the changes that were done to prepare the branch or tag to the SCM.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ */
+public class ScmCommitPreparationPhase
+    extends AbstractScmCommitPhase
+{
+
+    /**
+     * The format for the
+     */
+    private String rollbackMessageFormat;
+
+    protected void runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                             List reactorProjects, ReleaseResult result, boolean simulating )
+        throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException
+    {
+        // no prepare-commit required
+        if ( releaseDescriptor.isSuppressCommitBeforeTagOrBranch() )
+        {
+            if ( simulating )
+            {
+                logInfo( result, "Full run would not commit changes, because suppressCommitBeforeTagOrBranch is set." );
+            }
+            else
+            {
+                logInfo( result,
+                         "Modified POMs are not committed because suppressCommitBeforeTagOrBranch is set to false." );
+            }
+        }
+        // commit development versions required
+        else
+        {
+            String message = createMessage( releaseDescriptor );
+
+            if ( simulating )
+            {
+                simulateCheckins( releaseDescriptor, reactorProjects, result, message );
+            }
+            else
+            {
+                performCheckins( releaseDescriptor, releaseEnvironment, reactorProjects, message );
+            }
+        }
+    }
+
+    private String createRollbackMessage( ReleaseDescriptor releaseDescriptor )
+    {
+        return MessageFormat.format( releaseDescriptor.getScmCommentPrefix() + rollbackMessageFormat,
+                                     new Object[]{releaseDescriptor.getScmReleaseLabel()} );
+    }
+
+    protected void validateConfiguration( ReleaseDescriptor releaseDescriptor )
+        throws ReleaseFailureException
+    {
+        super.validateConfiguration( releaseDescriptor );
+
+        if ( releaseDescriptor.isSuppressCommitBeforeTagOrBranch() && releaseDescriptor.isRemoteTagging() )
+        {
+            throw new ReleaseFailureException(
+                "Cannot perform a remote tag or branch without committing the working copy first." );
+        }
+    }
+}

Propchange: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo?rev=1002613&r1=1002612&r2=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo (original)
+++ maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo Wed Sep 29 13:22:42 2010
@@ -349,6 +349,7 @@
           <name>updateWorkingCopyVersions</name>
           <version>1.0.0+</version>
           <type>boolean</type>
+          <defaultValue>true</defaultValue>
           <description>
             Whether to update working copy POM versions.
           </description>
@@ -362,6 +363,14 @@
           </description>
         </field>
         <field>
+          <name>suppressCommitBeforeTagOrBranch</name>
+          <version>2.1.0+</version>
+          <type>boolean</type>
+          <description>
+            Whether to suppress a commit of changes to the working copy before a tag or branch is created.
+          </description>
+        </field>
+        <field>
           <name>allowTimestampedSnapshots</name>
           <version>1.0.0+</version>
           <type>boolean</type>
@@ -602,6 +611,7 @@
              branchCreation            != that.branchCreation           ||
              updateBranchVersions      != that.updateBranchVersions     ||
              updateWorkingCopyVersions != that.updateWorkingCopyVersions||
+             suppressCommitBeforeTagOrBranch   != that.suppressCommitBeforeTagOrBranch  ||
              updateVersionsToSnapshot  != that.updateVersionsToSnapshot ||
              allowTimestampedSnapshots != that.allowTimestampedSnapshots||
              remoteTagging             != that.remoteTagging            ||
@@ -811,6 +821,7 @@
         result = 29 * result + ( branchCreation ? 1 : 0 );
         result = 29 * result + ( updateBranchVersions ? 1 : 0 );
         result = 29 * result + ( updateWorkingCopyVersions ? 1 : 0 );
+        result = 29 * result + ( suppressCommitBeforeTagOrBranch ? 1 : 0 );
         result = 29 * result + ( updateVersionsToSnapshot ? 1 : 0 );
         result = 29 * result + ( allowTimestampedSnapshots ? 1 : 0 );
         result = 29 * result + ( remoteTagging ? 1 : 0 );

Modified: maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java?rev=1002613&r1=1002612&r2=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java (original)
+++ maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java Wed Sep 29 13:22:42 2010
@@ -42,6 +42,17 @@ public class ReleaseUtilsTest
         assertEquals( "Check merge", mergedReleaseDescriptor, mergedMergeDescriptor );
     }
 
+    public void testMergeEqualsWithUpdateWorkingCopyTrue()
+    {
+        ReleaseDescriptor mergeDescriptor = createReleaseDescriptor();
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        
+        ReleaseDescriptor mergedReleaseDescriptor = ReleaseUtils.merge( releaseDescriptor, mergeDescriptor );
+        ReleaseDescriptor mergedMergeDescriptor = ReleaseUtils.merge( mergeDescriptor, releaseDescriptor );
+
+        assertEquals( "Check merge", mergedReleaseDescriptor, mergedMergeDescriptor );
+    }
+
     public void testMergeConfigurationDestEmpty()
     {
         ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();

Added: maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java?rev=1002613&view=auto
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java (added)
+++ maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java Wed Sep 29 13:22:42 2010
@@ -0,0 +1,160 @@
+package org.apache.maven.shared.release.phase;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.checkin.CheckInScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.manager.ScmManagerStub;
+import org.apache.maven.scm.provider.ScmProvider;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
+import org.apache.maven.shared.release.util.ReleaseUtil;
+import org.jmock.Mock;
+import org.jmock.core.Constraint;
+import org.jmock.core.constraint.IsAnything;
+import org.jmock.core.constraint.IsEqual;
+import org.jmock.core.constraint.IsNull;
+import org.jmock.core.matcher.InvokeOnceMatcher;
+import org.jmock.core.matcher.TestFailureMatcher;
+import org.jmock.core.stub.ReturnStub;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Test the SCM development commit phase.
+ *
+ * @author <a href="mailto:me@lcorneliussen.de">Lars Corneliussen</a>
+ */
+public class ScmCommitDevelopmentPhaseTest
+    extends AbstractReleaseTestCase
+{
+    private static final String COMMIT_MESSAGE = "[maven-release-manager] prepare for next development iteration";
+
+    private static final String ROLLBACK_PREFIX =
+        "[maven-release-manager] rollback changes from release preparation of ";
+
+    private List reactorProjects;
+
+    private MavenProject rootProject;
+
+    private ReleaseDescriptor descriptor;
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        phase = (ReleasePhase) lookup( ReleasePhase.ROLE, "scm-commit-development" );
+
+        reactorProjects = createReactorProjects();
+        rootProject = ReleaseUtil.getRootProject( reactorProjects );
+        descriptor = createReleaseDescriptor( rootProject );
+
+    }
+
+    public void testIsCorrectImplementation()
+    {
+        assertEquals( ScmCommitDevelopmentPhase.class, phase.getClass() );
+    }
+
+    public void testNoCommitOrRollbackRequired()
+        throws Exception
+    {
+        ReleaseDescriptor descriptor = createReleaseDescriptor( rootProject );
+        List reactorProjects = createReactorProjects();
+
+        descriptor.setRemoteTagging( false );
+        descriptor.setSuppressCommitBeforeTagOrBranch( true );
+        descriptor.setUpdateWorkingCopyVersions( false );
+
+        validateNoCheckin();
+
+        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+
+        assertTrue( true );
+    }
+
+    public void testCommitsNextVersions()
+        throws Exception
+    {
+        descriptor.setUpdateWorkingCopyVersions( true );
+
+        validateCheckin( COMMIT_MESSAGE );
+
+        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+
+        assertTrue( true );
+    }
+
+    public void testCommitsRollbackPrepare()
+        throws Exception
+    {
+        descriptor.setUpdateWorkingCopyVersions( false );
+
+        validateCheckin( ROLLBACK_PREFIX + descriptor.getScmReleaseLabel() );
+
+        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+
+        assertTrue( true );
+    }
+
+    private void validateCheckin( String message )
+        throws Exception
+    {
+        ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), rootProject.getFile() );
+        Mock scmProviderMock = new Mock( ScmProvider.class );
+        Constraint[] arguments = new Constraint[]{new IsAnything(), new IsScmFileSetEquals( fileSet ), new IsNull(),
+            new IsEqual( message )};
+        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).with( arguments ).will( new ReturnStub(
+            new CheckInScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
+
+        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
+        stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
+    }
+
+    private void validateNoCheckin()
+        throws Exception
+    {
+        Mock scmProviderMock = new Mock( ScmProvider.class );
+        scmProviderMock.expects( new TestFailureMatcher( "Shouldn't have called checkIn" ) ).method( "checkIn" );
+
+        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
+        stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
+    }
+
+    private List createReactorProjects()
+        throws Exception
+    {
+        return createReactorProjects( "scm-commit/", "single-pom" );
+    }
+
+    private static ReleaseDescriptor createReleaseDescriptor( MavenProject rootProject )
+    {
+        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        descriptor.setScmSourceUrl( "scm-url" );
+        descriptor.setScmReleaseLabel( "release-label" );
+        descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
+        return descriptor;
+    }
+
+}
\ No newline at end of file

Propchange: maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java (from r983489, maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPhaseTest.java)
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java?p2=maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java&p1=maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPhaseTest.java&r1=983489&r2=1002613&rev=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPhaseTest.java (original)
+++ maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java Wed Sep 29 13:22:42 2010
@@ -55,11 +55,11 @@ import java.util.Iterator;
 import java.util.List;
 
 /**
- * Test the SCM commit phase.
+ * Test the release or branch preparation SCM commit phase.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class ScmCommitPhaseTest
+public class ScmCommitPreparationPhaseTest
     extends AbstractReleaseTestCase
 {
     private static final String PREFIX = "[maven-release-manager] prepare release ";
@@ -74,6 +74,17 @@ public class ScmCommitPhaseTest
         phase = (ReleasePhase) lookup( ReleasePhase.ROLE, "scm-commit-release" );
     }
 
+    public void testIsCorrectImplementation()
+    {
+        assertEquals( ScmCommitPreparationPhase.class, phase.getClass() );
+    }
+
+    public void testResolvesCorrectBranchImplementation()
+        throws Exception
+    {
+        assertEquals( ScmCommitPreparationPhase.class, lookup( ReleasePhase.ROLE, "scm-commit-branch" ).getClass() );
+    }
+
     public void testCommit()
         throws Exception
     {
@@ -89,8 +100,8 @@ public class ScmCommitPhaseTest
         Mock scmProviderMock = new Mock( ScmProvider.class );
         Constraint[] arguments = new Constraint[]{new IsAnything(), new IsScmFileSetEquals( fileSet ), new IsNull(),
             new IsEqual( PREFIX + "release-label" )};
-        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).with( arguments ).will(
-            new ReturnStub( new CheckInScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
+        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).with( arguments ).will( new ReturnStub(
+            new CheckInScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
 
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
         stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
@@ -104,7 +115,7 @@ public class ScmCommitPhaseTest
         throws Exception
     {
         ReleaseDescriptor descriptor = new ReleaseDescriptor();
-        List reactorProjects = createReactorProjects( "scm-commit/", "multiple-poms", false );
+        List reactorProjects = createReactorProjects( "scm-commit/", "multiple-poms" );
         descriptor.setScmSourceUrl( "scm-url" );
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
         descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
@@ -116,14 +127,14 @@ public class ScmCommitPhaseTest
             MavenProject project = (MavenProject) i.next();
             poms.add( project.getFile() );
         }
-        ScmFileSet fileSet =
-            new ScmFileSet( rootProject.getFile().getParentFile(), (File[]) poms.toArray( EMPTY_FILE_ARRAY ) );
+        ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), (File[]) poms.toArray(
+            EMPTY_FILE_ARRAY ) );
 
         Mock scmProviderMock = new Mock( ScmProvider.class );
         Constraint[] arguments = new Constraint[]{new IsAnything(), new IsScmFileSetEquals( fileSet ), new IsNull(),
             new IsEqual( PREFIX + "release-label" )};
-        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).with( arguments ).will(
-            new ReturnStub( new CheckInScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
+        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).with( arguments ).will( new ReturnStub(
+            new CheckInScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
 
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
         stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
@@ -150,8 +161,8 @@ public class ScmCommitPhaseTest
         Mock scmProviderMock = new Mock( ScmProvider.class );
         Constraint[] arguments = new Constraint[]{new IsAnything(), new IsScmFileSetEquals( fileSet ), new IsNull(),
             new IsEqual( "[maven-release-manager] prepare for next development iteration" )};
-        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).with( arguments ).will(
-            new ReturnStub( new CheckInScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
+        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).with( arguments ).will( new ReturnStub(
+            new CheckInScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
 
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
         stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
@@ -195,10 +206,10 @@ public class ScmCommitPhaseTest
         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), files );
 
         Mock scmProviderMock = new Mock( ScmProvider.class );
-        Constraint[] arguments = new Constraint[] { new IsAnything(), new IsScmFileSetEquals( fileSet ), new IsNull(),
-            new IsEqual( PREFIX + "release-label" ) };
-        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).with( arguments ).will(
-            new ReturnStub( new CheckInScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
+        Constraint[] arguments = new Constraint[]{new IsAnything(), new IsScmFileSetEquals( fileSet ), new IsNull(),
+            new IsEqual( PREFIX + "release-label" )};
+        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).with( arguments ).will( new ReturnStub(
+            new CheckInScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
 
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
         stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
@@ -218,11 +229,7 @@ public class ScmCommitPhaseTest
         descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
         descriptor.setScmReleaseLabel( "release-label" );
 
-        Mock scmProviderMock = new Mock( ScmProvider.class );
-        scmProviderMock.expects( new TestFailureMatcher( "Shouldn't have called checkIn" ) ).method( "checkIn" );
-
-        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
-        stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
+        validateNoCheckin();
 
         phase.simulate( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
 
@@ -253,12 +260,12 @@ public class ScmCommitPhaseTest
         ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
 
         Mock scmManagerMock = new Mock( ScmManager.class );
-        scmManagerMock.expects( new InvokeOnceMatcher() ).method( "makeScmRepository" ).with(
-            new IsEqual( "scm-url" ) ).will( new ThrowStub( new NoSuchScmProviderException( "..." ) ) );
+        scmManagerMock.expects( new InvokeOnceMatcher() ).method( "makeScmRepository" ).with( new IsEqual(
+            "scm-url" ) ).will( new ThrowStub( new NoSuchScmProviderException( "..." ) ) );
 
         ScmManager scmManager = (ScmManager) scmManagerMock.proxy();
-        DefaultScmRepositoryConfigurator configurator =
-            (DefaultScmRepositoryConfigurator) lookup( ScmRepositoryConfigurator.ROLE );
+        DefaultScmRepositoryConfigurator configurator = (DefaultScmRepositoryConfigurator) lookup(
+            ScmRepositoryConfigurator.ROLE );
         configurator.setScmManager( scmManager );
 
         try
@@ -280,12 +287,12 @@ public class ScmCommitPhaseTest
         ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
 
         Mock scmManagerMock = new Mock( ScmManager.class );
-        scmManagerMock.expects( new InvokeOnceMatcher() ).method( "makeScmRepository" ).with(
-            new IsEqual( "scm-url" ) ).will( new ThrowStub( new ScmRepositoryException( "..." ) ) );
+        scmManagerMock.expects( new InvokeOnceMatcher() ).method( "makeScmRepository" ).with( new IsEqual(
+            "scm-url" ) ).will( new ThrowStub( new ScmRepositoryException( "..." ) ) );
 
         ScmManager scmManager = (ScmManager) scmManagerMock.proxy();
-        DefaultScmRepositoryConfigurator configurator =
-            (DefaultScmRepositoryConfigurator) lookup( ScmRepositoryConfigurator.ROLE );
+        DefaultScmRepositoryConfigurator configurator = (DefaultScmRepositoryConfigurator) lookup(
+            ScmRepositoryConfigurator.ROLE );
         configurator.setScmManager( scmManager );
 
         try
@@ -307,8 +314,8 @@ public class ScmCommitPhaseTest
         ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
 
         Mock scmProviderMock = new Mock( ScmProvider.class );
-        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).will(
-            new ThrowStub( new ScmException( "..." ) ) );
+        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "checkIn" ).will( new ThrowStub( new ScmException(
+            "..." ) ) );
 
         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
         stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
@@ -332,8 +339,8 @@ public class ScmCommitPhaseTest
         ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
 
         ScmManager scmManager = (ScmManager) lookup( ScmManager.ROLE );
-        ScmProviderStub providerStub =
-            (ScmProviderStub) scmManager.getProviderByUrl( releaseDescriptor.getScmSourceUrl() );
+        ScmProviderStub providerStub = (ScmProviderStub) scmManager.getProviderByUrl(
+            releaseDescriptor.getScmSourceUrl() );
 
         providerStub.setCheckInScmResult( new CheckInScmResult( "", "", "", false ) );
 
@@ -349,10 +356,62 @@ public class ScmCommitPhaseTest
         }
     }
 
+    public void testSuppressCommitWithRemoteTaggingFails()
+        throws Exception
+    {
+        ReleaseDescriptor descriptor = createReleaseDescriptor();
+        List reactorProjects = createReactorProjects();
+
+        descriptor.setRemoteTagging( true );
+        descriptor.setSuppressCommitBeforeTagOrBranch( true );
+
+        validateNoCheckin();
+
+        try
+        {
+            phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+
+            fail( "Commit should have failed with ReleaseFailureException" );
+        }
+        catch ( ReleaseFailureException e )
+        {
+            assertNull( "check no other cause", e.getCause() );
+        }
+
+        assertTrue( true );
+    }
+
+    public void testSuppressCommitAfterBranch()
+        throws Exception
+    {
+        ReleaseDescriptor descriptor = createReleaseDescriptor();
+        List reactorProjects = createReactorProjects();
+
+        descriptor.setBranchCreation( true );
+        descriptor.setRemoteTagging( false );
+        descriptor.setSuppressCommitBeforeTagOrBranch( true );
+
+        validateNoCheckin();
+
+        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+
+        assertTrue( true );
+    }
+
+    private void validateNoCheckin()
+        throws Exception
+    {
+        Mock scmProviderMock = new Mock( ScmProvider.class );
+        scmProviderMock.expects( new TestFailureMatcher( "Shouldn't have called checkIn" ) ).method( "checkIn" );
+
+        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
+        stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
+    }
+
     private List createReactorProjects()
         throws Exception
     {
-        return createReactorProjects( "scm-commit/", "single-pom", false );
+        return createReactorProjects( "scm-commit/", "single-pom" );
     }
 
     private static ReleaseDescriptor createReleaseDescriptor()
@@ -364,4 +423,5 @@ public class ScmCommitPhaseTest
         return descriptor;
     }
 
+
 }

Added: maven/release/trunk/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.xml
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.xml?rev=1002613&view=auto
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.xml (added)
+++ maven/release/trunk/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.xml Wed Sep 29 13:22:42 2010
@@ -0,0 +1,36 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.scm.manager.ScmManager</role>
+      <implementation>org.apache.maven.scm.manager.ScmManagerStub</implementation>
+    </component>
+    <!-- Turn off info messages -->
+    <component>
+      <role>org.codehaus.plexus.logging.LoggerManager</role>
+      <implementation>org.codehaus.plexus.logging.console.ConsoleLoggerManager</implementation>
+      <lifecycle-handler>basic</lifecycle-handler>
+      <configuration>
+        <threshold>ERROR</threshold>
+      </configuration>
+    </component>
+  </components>
+</component-set>

Propchange: maven/release/trunk/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhaseTest.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java?rev=1002613&r1=1002612&r2=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java (original)
+++ maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java Wed Sep 29 13:22:42 2010
@@ -75,6 +75,21 @@ public class BranchReleaseMojo
     private boolean updateWorkingCopyVersions;
 
     /**
+     * Whether to suppress a commit of changes to the working copy
+     * before the tag is created.
+     * <br/>
+     * <br/>This requires <code>remoteTagging</code> to be set to false.
+     * <br/>
+     * <br/><code>suppressCommitBeforeBranch</code> is useful when you want
+     * to avoid poms with released versions in all revisions of your
+     * trunk or development branch.
+     *
+     * @parameter expression="${suppressCommitBeforeBranch}" default-value="false"
+     * @since 2.1
+     */
+    private boolean suppressCommitBeforeBranch;
+
+    /**
      * Whether to update versions to SNAPSHOT in the branch.
      *
      * @parameter expression="${updateVersionsToSnapshot}" default-value="true"
@@ -174,12 +189,13 @@ public class BranchReleaseMojo
         config.setRemoteTagging( remoteTagging );
         config.setDefaultReleaseVersion( releaseVersion );
         config.setDefaultDevelopmentVersion( developmentVersion );
+        config.setSuppressCommitBeforeTagOrBranch( suppressCommitBeforeBranch );
 
         // Create a config containing values from the session properties (ie command line properties with cli).
         ReleaseDescriptor sysPropertiesConfig
                 = ReleaseUtils.copyPropertiesToReleaseDescriptor( session.getExecutionProperties() );
-        mergeCommandLineConfig( config, sysPropertiesConfig );
-        
+        mergeCommandLineConfig( config, sysPropertiesConfig );        
+
         try
         {
             releaseManager.branch( config, getReleaseEnvironment(), reactorProjects, dryRun );

Modified: maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java?rev=1002613&r1=1002612&r2=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java (original)
+++ maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java Wed Sep 29 13:22:42 2010
@@ -151,9 +151,17 @@ public class PrepareReleaseMojo
     private String developmentVersion;
 
     /**
-     * currently only implemented with svn scm. Enable a workaround to prevent issue
-     * due to svn client > 1.5.0 (http://jira.codehaus.org/browse/SCM-406)
+     * Currently only implemented with svn scm.
      *
+     * <ul>
+     *   <li>Enables a workaround to prevent issue
+     * due to svn client > 1.5.0 (fixed in 1.6.5)
+     * (http://jira.codehaus.org/browse/SCM-406)</li>
+     *   <li>You may not want to use this in conjunction
+     * with <code>suppressCommitBeforeTag</code>, such that no poms with
+     * released versions are committed to the working
+     * copy ever.</li>
+     * </ul>
      *
      * @parameter expression="${remoteTagging}" default-value="true"
      * @since 2.0-beta-9
@@ -161,6 +169,37 @@ public class PrepareReleaseMojo
     private boolean remoteTagging;
 
     /**
+     * Whether to bump the working copy versions to <code>developmentVersion</code>.
+     *
+     * @parameter expression="${updateWorkingCopyVersions}" default-value="true"
+     * @since 2.1
+     */
+    private boolean updateWorkingCopyVersions;
+
+    /**
+     * Whether to suppress a commit of changes to the working copy
+     * before the tag is created.
+     * <br/>
+     * <br/>This requires <code>remoteTagging</code> to be set to false.
+     * <br/>
+     * <br/><code>suppressCommitBeforeTag</code> is useful when you want
+     * to avoid poms with released versions in all revisions of your
+     * trunk or development branch.
+     *
+     * @parameter expression="${suppressCommitBeforeTag}" default-value="false"
+     * @since 2.1
+     */
+    private boolean suppressCommitBeforeTag;
+
+    /**
+     * @parameter expression="${session}"
+     * @readonly
+     * @required
+     * @since 2.0
+     */
+    protected MavenSession session;
+
+    /**
      * {@inheritDoc}
      */
     public void execute()
@@ -194,6 +233,8 @@ public class PrepareReleaseMojo
         config.setDefaultReleaseVersion( releaseVersion );
         config.setDefaultDevelopmentVersion( developmentVersion );
         config.setRemoteTagging( remoteTagging );
+        config.setUpdateWorkingCopyVersions( updateWorkingCopyVersions );
+        config.setSuppressCommitBeforeTagOrBranch( suppressCommitBeforeTag );    
 
         // Create a config containing values from the session properties (ie command line properties with cli).
         ReleaseDescriptor sysPropertiesConfig

Modified: maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java?rev=1002613&r1=1002612&r2=1002613&view=diff
==============================================================================
--- maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java (original)
+++ maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java Wed Sep 29 13:22:42 2010
@@ -47,11 +47,18 @@ import org.jmock.core.stub.ThrowStub;
 public class PrepareReleaseMojoTest
     extends AbstractMojoTestCase
 {
+    private void setDefaults( PrepareReleaseMojo mojo )
+        throws IllegalAccessException
+    {
+        setVariableValueToObject( mojo, "updateWorkingCopyVersions", Boolean.TRUE );
+    }
+    
     public void testPrepare()
         throws Exception
     {
         File testFile = getTestFile( "target/test-classes/mojos/prepare/prepare.xml" );
         PrepareReleaseMojo mojo = (PrepareReleaseMojo) lookupMojo( "prepare", testFile );
+        setDefaults( mojo );
         mojo.setBasedir( testFile.getParentFile() );
         mojo.session = new MavenSession( null, null, null, null, null, null, null, null, null )
         {
@@ -87,6 +94,7 @@ public class PrepareReleaseMojoTest
     {
         File testFile = getTestFile( "target/test-classes/mojos/prepare/prepare.xml" );
         PrepareReleaseMojo mojo = (PrepareReleaseMojo) lookupMojo( "prepare", testFile );
+        setDefaults( mojo );
         mojo.setBasedir( testFile.getParentFile() );
         mojo.session = new MavenSession( null, null, null, null, null, null, null, null, null )
         {
@@ -129,6 +137,7 @@ public class PrepareReleaseMojoTest
     {
         File testFile = getTestFile( "target/test-classes/mojos/prepare/prepare.xml" );
         PrepareReleaseMojo mojo = (PrepareReleaseMojo) lookupMojo( "prepare", testFile );
+        setDefaults( mojo );
         mojo.setBasedir( testFile.getParentFile() );
         mojo.session = new MavenSession( null, null, null, null, null, null, null, null, null )
         {