Author: gboue
Date: Thu Jan 19 19:22:25 2017
New Revision: 1779510

URL: http://svn.apache.org/viewvc?rev=1779510&view=rev
Log:
[MRELEASE-977] release:branch should prompt for branch name if none is given
Submitted by Henning Schmiedehausen

When a release is made in interactive mode, the plugin will now ask for a 
branch name instead of ending with an error. In batch mode, the branch name is 
still required, so the current behaviour is unchanged.

Added:
    
maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
   (with props)
Modified:
    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/phase/InputVariablesPhase.java
    
maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
    
maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java

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=1779510&r1=1779509&r2=1779510&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 
Thu Jan 19 19:22:25 2017
@@ -70,6 +70,7 @@
           <phase>scm-check-modifications</phase>
           <phase>create-backup-poms</phase>
           <phase>map-branch-versions</phase>
+          <phase>branch-input-variables</phase>
           <phase>map-development-versions</phase>
           <phase>rewrite-poms-for-branch</phase>
           <phase>scm-commit-branch</phase>
@@ -220,6 +221,40 @@
         <requirement>
           
<role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
         </requirement>
+      </requirements>
+    </component>
+    <component>
+      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
+      <role-hint>input-variables</role-hint>
+      
<implementation>org.apache.maven.shared.release.phase.InputVariablesPhase</implementation>
+      <configuration>
+        <branchOperation>false</branchOperation>
+      </configuration>
+      <requirements>
+        <requirement>
+          <role>org.codehaus.plexus.components.interactivity.Prompter</role>
+          <role-hint>default</role-hint>
+        </requirement>
+        <requirement>
+          
<role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
+        </requirement>
+      </requirements>
+    </component>
+    <component>
+      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
+      <role-hint>branch-input-variables</role-hint>
+      
<implementation>org.apache.maven.shared.release.phase.InputVariablesPhase</implementation>
+      <configuration>
+        <branchOperation>true</branchOperation>
+      </configuration>
+      <requirements>
+        <requirement>
+          <role>org.codehaus.plexus.components.interactivity.Prompter</role>
+          <role-hint>default</role-hint>
+        </requirement>
+        <requirement>
+          
<role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
+        </requirement>
       </requirements>
     </component>
   </components>

Modified: 
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java
URL: 
http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java?rev=1779510&r1=1779509&r2=1779510&view=diff
==============================================================================
--- 
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java
 (original)
+++ 
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java
 Thu Jan 19 19:22:25 2017
@@ -32,7 +32,6 @@ import org.apache.maven.shared.release.e
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
@@ -42,6 +41,7 @@ import org.codehaus.plexus.interpolation
 import org.codehaus.plexus.interpolation.PrefixedPropertiesValueSource;
 import org.codehaus.plexus.interpolation.RecursionInterceptor;
 import org.codehaus.plexus.interpolation.StringSearchInterpolator;
+import org.codehaus.plexus.util.StringUtils;
 
 import java.util.List;
 import java.util.Properties;
@@ -51,7 +51,6 @@ import java.util.Properties;
  *
  * @author <a href="mailto:br...@apache.org";>Brett Porter</a>
  */
-@Component( role = ReleasePhase.class, hint = "input-variables" )
 public class InputVariablesPhase
     extends AbstractReleasePhase
 {
@@ -62,6 +61,11 @@ public class InputVariablesPhase
     private Prompter prompter;
 
     /**
+     * Whether this is a branch or a tag operation.
+     */
+    private boolean branchOperation;
+
+    /**
      * Tool that gets a configured SCM repository from release configuration.
      */
     @Requirement
@@ -72,6 +76,11 @@ public class InputVariablesPhase
         this.prompter = prompter;
     }
 
+    boolean isBranchOperation()
+    {
+        return branchOperation;
+    }
+
     protected ScmProvider getScmProvider( ReleaseDescriptor releaseDescriptor, 
ReleaseEnvironment releaseEnvironment )
         throws ReleaseScmRepositoryException, ReleaseExecutionException
     {
@@ -159,9 +168,20 @@ public class InputVariablesPhase
             {
                 try
                 {
-                    tag =
-                        prompter.prompt( "What is SCM release tag or label for 
\"" + project.getName() + "\"? ("
-                            + project.getGroupId() + ":" + 
project.getArtifactId() + ")", defaultTag );
+                    if ( branchOperation )
+                    {
+                        tag = prompter.prompt( "What is the branch name for 
\"" + project.getName() + "\"? ("
+                            + project.getGroupId() + ":" + 
project.getArtifactId() + ")" );
+                        if ( StringUtils.isEmpty( tag ) )
+                        {
+                            throw new ReleaseExecutionException( "No branch 
name was given." );
+                        }
+                    }
+                    else
+                    {
+                        tag = prompter.prompt( "What is the SCM release tag or 
label for \"" + project.getName()
+                            + "\"? (" + project.getGroupId() + ":" + 
project.getArtifactId() + ")", defaultTag );
+                    }
                 }
                 catch ( PrompterException e )
                 {
@@ -169,6 +189,10 @@ public class InputVariablesPhase
                                                          e );
                 }
             }
+            else if ( branchOperation )
+            {
+                throw new ReleaseExecutionException( "No branch name was 
given." );
+            }
             else
             {
                 tag = defaultTag;

Added: 
maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
URL: 
http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java?rev=1779510&view=auto
==============================================================================
--- 
maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
 (added)
+++ 
maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
 Thu Jan 19 19:22:25 2017
@@ -0,0 +1,313 @@
+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 static org.junit.Assert.*;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.release.PlexusJUnit4TestCase;
+import org.apache.maven.shared.release.ReleaseExecutionException;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
+import org.codehaus.plexus.components.interactivity.Prompter;
+import org.codehaus.plexus.components.interactivity.PrompterException;
+import org.junit.Test;
+
+/**
+ * Test the variable input phase.
+ *
+ * @author <a href="mailto:br...@apache.org";>Brett Porter</a>
+ */
+public class BranchInputVariablesPhaseTest
+    extends PlexusJUnit4TestCase
+{
+    private InputVariablesPhase phase;
+
+    public void setUp()
+        throws Exception
+    {
+        super.setUp();
+        phase = (InputVariablesPhase) lookup( ReleasePhase.ROLE, 
"branch-input-variables" );
+    }
+
+    @Test
+    public void testInputVariablesInteractive()
+        throws Exception
+    {
+        // prepare
+        Prompter mockPrompter = mock( Prompter.class );
+        when( mockPrompter.prompt( isA( String.class ) ) ).thenReturn( 
"tag-value", "simulated-tag-value" );
+        phase.setPrompter( mockPrompter );
+
+        List<MavenProject> reactorProjects = Collections.singletonList( 
createProject( "artifactId", "1.0" ) );
+
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
+        releaseDescriptor.setScmSourceUrl( 
"scm:svn:file://localhost/tmp/scm-repo" );
+
+        // execute
+        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), 
reactorProjects );
+
+        // verify
+        assertEquals( "Check tag", "tag-value", 
releaseDescriptor.getScmReleaseLabel() );
+
+        // prepare
+        releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
+        releaseDescriptor.setScmSourceUrl( 
"scm:svn:file://localhost/tmp/scm-repo" );
+
+        // execute
+        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), 
reactorProjects );
+
+        // verify
+        assertEquals( "Check tag", "simulated-tag-value", 
releaseDescriptor.getScmReleaseLabel() );
+
+        verify( mockPrompter, times( 2 ) ).prompt( isA( String.class ) );
+        verifyNoMoreInteractions( mockPrompter );
+    }
+
+    @Test
+    public void testUnmappedVersion()
+        throws Exception
+    {
+        List<MavenProject> reactorProjects = Collections.singletonList( 
createProject( "artifactId", "1.0" ) );
+
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+
+        try
+        {
+            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), 
reactorProjects );
+
+            fail( "Expected an exception" );
+        }
+        catch ( ReleaseExecutionException e )
+        {
+            assertNull( "check no cause", e.getCause() );
+        }
+
+        releaseDescriptor = new ReleaseDescriptor();
+
+        try
+        {
+            phase.simulate( releaseDescriptor, new 
DefaultReleaseEnvironment(), reactorProjects );
+
+            fail( "Expected an exception" );
+        }
+        catch ( ReleaseExecutionException e )
+        {
+            assertNull( "check no cause", e.getCause() );
+        }
+    }
+
+    @Test
+    public void testInputVariablesNonInteractiveConfigured()
+        throws Exception
+    {
+        // prepare
+        Prompter mockPrompter = mock( Prompter.class );
+        phase.setPrompter( mockPrompter );
+
+        List<MavenProject> reactorProjects = Collections.singletonList( 
createProject( "artifactId", "1.0" ) );
+
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setInteractive( false );
+        releaseDescriptor.setScmReleaseLabel( "tag-value" );
+
+        // execute
+        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), 
reactorProjects );
+
+        // verify
+        assertEquals( "Check tag", "tag-value", 
releaseDescriptor.getScmReleaseLabel() );
+
+        // prepare
+        releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setInteractive( false );
+        releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" );
+
+        // execute
+        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), 
reactorProjects );
+
+        // verify
+        assertEquals( "Check tag", "simulated-tag-value", 
releaseDescriptor.getScmReleaseLabel() );
+
+        // never use prompter
+        verifyNoMoreInteractions( mockPrompter );
+    }
+
+    @Test
+    public void testInputVariablesInteractiveConfigured()
+        throws Exception
+    {
+        // prepare
+        Prompter mockPrompter = mock( Prompter.class );
+        phase.setPrompter( mockPrompter );
+
+        List<MavenProject> reactorProjects = Collections.singletonList( 
createProject( "artifactId", "1.0" ) );
+
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setScmReleaseLabel( "tag-value" );
+
+        // execute
+        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), 
reactorProjects );
+
+        // verify
+        assertEquals( "Check tag", "tag-value", 
releaseDescriptor.getScmReleaseLabel() );
+
+        // prepare
+        releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" );
+
+        // execute
+        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), 
reactorProjects );
+
+        // verify
+        assertEquals( "Check tag", "simulated-tag-value", 
releaseDescriptor.getScmReleaseLabel() );
+
+        // never use prompter
+        verifyNoMoreInteractions( mockPrompter );
+    }
+
+    @Test
+    public void testPrompterException()
+        throws Exception
+    {
+        // prepare
+        Prompter mockPrompter = mock( Prompter.class );
+        when( mockPrompter.prompt( isA( String.class ),
+                                   isA( String.class ) ) ).thenThrow( new 
PrompterException( "..." ) );
+        phase.setPrompter( mockPrompter );
+
+        List<MavenProject> reactorProjects = Collections.singletonList( 
createProject( "artifactId", "1.0" ) );
+
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
+        releaseDescriptor.setScmSourceUrl( 
"scm:svn:file://localhost/tmp/scm-repo" );
+
+        // execute
+        try
+        {
+            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), 
reactorProjects );
+
+            fail( "Expected an exception" );
+        }
+        catch ( ReleaseExecutionException e )
+        {
+            assertEquals( "No branch name was given.", e.getMessage() );
+        }
+
+        // prepare
+        releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
+        releaseDescriptor.setScmSourceUrl( 
"scm:svn:file://localhost/tmp/scm-repo" );
+
+        // execute
+        try
+        {
+            phase.simulate( releaseDescriptor, new 
DefaultReleaseEnvironment(), reactorProjects );
+
+            fail( "Expected an exception" );
+        }
+        catch ( ReleaseExecutionException e )
+        {
+            assertEquals( "No branch name was given.", e.getMessage() );
+        }
+
+        // verify
+        verify( mockPrompter, times( 2 ) ).prompt( isA( String.class ) );
+        verifyNoMoreInteractions( mockPrompter );
+    }
+
+    @Test
+    public void testBranchOperation()
+        throws Exception
+    {
+        assertTrue( phase.isBranchOperation() );
+    }
+
+    @Test
+    public void testEmptyBranchName()
+        throws Exception
+    {
+        // prepare
+        Prompter mockPrompter = mock( Prompter.class );
+        phase.setPrompter( mockPrompter );
+
+        List<MavenProject> reactorProjects = Collections.singletonList( 
createProject( "artifactId", "1.0" ) );
+
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setInteractive( false );
+        releaseDescriptor.setScmReleaseLabel( null );
+        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
+        releaseDescriptor.setScmSourceUrl( 
"scm:svn:file://localhost/tmp/scm-repo" );
+
+        // execute
+        try
+        {
+            phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), 
reactorProjects );
+
+            fail( "Expected an exception" );
+        }
+        catch ( ReleaseExecutionException e )
+        {
+            assertEquals( "No branch name was given.", e.getMessage() );
+        }
+
+        // prepare
+        releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setInteractive( false );
+        releaseDescriptor.setScmReleaseLabel( null );
+        releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
+        releaseDescriptor.setScmSourceUrl( 
"scm:svn:file://localhost/tmp/scm-repo" );
+
+        // execute
+        try
+        {
+            phase.simulate( releaseDescriptor, new 
DefaultReleaseEnvironment(), reactorProjects );
+
+            fail( "Expected an exception" );
+        }
+        catch ( ReleaseExecutionException e )
+        {
+            assertEquals( "No branch name was given.", e.getMessage() );
+        }
+
+        // never use prompter
+        verifyNoMoreInteractions( mockPrompter );
+    }
+
+    private static MavenProject createProject( String artifactId, String 
version )
+    {
+        Model model = new Model();
+        model.setGroupId( "groupId" );
+        model.setArtifactId( artifactId );
+        model.setVersion( version );
+        return new MavenProject( model );
+    }
+}

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

Propchange: 
maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
URL: 
http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java?rev=1779510&r1=1779509&r2=1779510&view=diff
==============================================================================
--- 
maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
 (original)
+++ 
maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
 Thu Jan 19 19:22:25 2017
@@ -359,6 +359,13 @@ public class InputVariablesPhaseTest
         verifyNoMoreInteractions( mockPrompter );
     }
 
+    @Test
+    public void testBranchOperation()
+        throws Exception
+    {
+        assertFalse( phase.isBranchOperation() );
+    }
+
     private static MavenProject createProject( String artifactId, String 
version )
     {
         Model model = new Model();
@@ -367,4 +374,4 @@ public class InputVariablesPhaseTest
         model.setVersion( version );
         return new MavenProject( model );
     }
-}
\ No newline at end of file
+}

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=1779510&r1=1779509&r2=1779510&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
 Thu Jan 19 19:22:25 2017
@@ -46,10 +46,9 @@ public class BranchReleaseMojo
     /**
      * The branch name to use.
      *
-     * @required
      * @since 2.0-beta-6
      */
-    @Parameter( property = "branchName", required = true )
+    @Parameter( property = "branchName" )
     private String branchName;
 
     /**
@@ -174,7 +173,7 @@ public class BranchReleaseMojo
     private String checkModificationExcludeList;
 
     /**
-     * Specify the new version for the branch. 
+     * Specify the new version for the branch.
      * This parameter is only meaningful if {@link #updateBranchVersions} = 
{@code true}.
      *
      * @since 2.0


Reply via email to