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