Index: src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java =================================================================== --- src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java (revision 964499) +++ src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java (working copy) @@ -19,6 +19,9 @@ * under the License. */ +import java.util.List; + +import org.apache.commons.lang.StringUtils; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.project.MavenProject; import org.apache.maven.scm.manager.NoSuchScmProviderException; @@ -35,8 +38,6 @@ import org.codehaus.plexus.components.interactivity.Prompter; import org.codehaus.plexus.components.interactivity.PrompterException; -import java.util.List; - /** * Input any variables that were not yet configured. * @@ -94,16 +95,25 @@ MavenProject project = ReleaseUtil.getRootProject( reactorProjects ); String tag = releaseDescriptor.getScmReleaseLabel(); - - if ( tag == null ) + + // Must get default version from mapped versions, as the project will be the incorrect snapshot + String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ); + String releaseVersion = (String) releaseDescriptor.getReleaseVersions().get( key ); + + if ( tag != null) { - // Must get default version from mapped versions, as the project will be the incorrect snapshot - String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ); - String releaseVersion = (String) releaseDescriptor.getReleaseVersions().get( key ); - if ( releaseVersion == null ) - { - throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" ); - } + tag = tag.replace("[groupId]", project.getGroupId()) + .replace("[artifactId]", project.getArtifactId()) + .replace("[version]", StringUtils.defaultString(releaseVersion)); + + releaseDescriptor.setScmReleaseLabel(tag); + } + else + { + if ( releaseVersion == null ) + { + throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" ); + } String defaultTag = project.getArtifactId() + "-" + releaseVersion; Index: src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java =================================================================== --- src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java (revision 964499) +++ src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java (working copy) @@ -19,6 +19,9 @@ * under the License. */ +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.ReleaseExecutionException; @@ -35,9 +38,6 @@ import org.jmock.core.stub.ReturnStub; import org.jmock.core.stub.ThrowStub; -import java.util.Collections; -import java.util.List; - /** * Test the variable input phase. * @@ -151,6 +151,39 @@ assertEquals( "Check tag", "artifactId-1.0", releaseDescriptor.getScmReleaseLabel() ); } + public void testInputVariablesNonInteractiveReplaceVariables() + throws Exception + { + Mock mockPrompter = new Mock( Prompter.class ); + mockPrompter.expects( new TestFailureMatcher( "prompter should not be called" ) ).method( "prompt" ); + phase.setPrompter( (Prompter) mockPrompter.proxy() ); + + List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) ); + + ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.setInteractive( false ); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setScmReleaseLabel("tagprefix/[groupId]-[artifactId]-[version]"); + + phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); + + assertEquals( "Check tag", "tagprefix/groupId-artifactId-1.0", releaseDescriptor.getScmReleaseLabel() ); + + mockPrompter.reset(); + mockPrompter.expects( new TestFailureMatcher( "prompter should not be called" ) ).method( "prompt" ); + + releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.setInteractive( false ); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setScmReleaseLabel("tagprefix/[groupId]-[artifactId]-[version]"); + + phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); + + assertEquals( "Check tag", "tagprefix/groupId-artifactId-1.0", releaseDescriptor.getScmReleaseLabel() ); + } + public void testInputVariablesNonInteractiveConfigured() throws Exception {