You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by st...@apache.org on 2011/06/24 17:48:07 UTC

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

Author: stephenc
Date: Fri Jun 24 15:48:07 2011
New Revision: 1139359

URL: http://svn.apache.org/viewvc?rev=1139359&view=rev
Log:
[MRELEASE-159] Support a pattern to generate the release tag.

o I had a quick look at the suggested solutions and basing off of MessageFormat requires people to remember exactly which {0} and {1} correspond with. This solution uses plexus-interpolation to interpolate properties delimited with @{ and } so that the properties escape Maven's default interpolation which would resolve them in the -SNAPSHOT project.

o May need to double check that the site generates correctly

Added:
    maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm   (contents, props changed)
      - copied, changed from r1139308, maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt
Removed:
    maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt
Modified:
    maven/release/trunk/maven-release-manager/pom.xml
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
    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/java/org/apache/maven/shared/release/phase/InputVariablesPhase.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/phase/InputVariablesPhaseTest.java
    maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.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=1139359&r1=1139358&r2=1139359&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/pom.xml (original)
+++ maven/release/trunk/maven-release-manager/pom.xml Fri Jun 24 15:48:07 2011
@@ -66,6 +66,11 @@
         </exclusion>
       </exclusions>
     </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-interpolation</artifactId>
+      <version>1.14</version>
+    </dependency>
 
     <dependency>
       <groupId>org.sonatype.plexus</groupId>

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java?rev=1139359&r1=1139358&r2=1139359&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java Fri Jun 24 15:48:07 2011
@@ -143,6 +143,10 @@ public class PropertiesReleaseDescriptor
         {
             properties.setProperty( "scm.tag", config.getScmReleaseLabel() );
         }
+        if ( config.getScmTagNameFormat() != null )
+        {
+            properties.setProperty( "scm.tagNameFormat", config.getScmTagNameFormat() );
+        }
         if ( config.getScmCommentPrefix() != null )
         {
             properties.setProperty( "scm.commentPrefix", config.getScmCommentPrefix() );

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=1139359&r1=1139358&r2=1139359&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 Fri Jun 24 15:48:07 2011
@@ -58,6 +58,7 @@ public class ReleaseUtils
         mergeInto.setScmReleaseLabel(
             mergeOverride( mergeInto.getScmReleaseLabel(), toBeMerged.getScmReleaseLabel() ) );
         mergeInto.setScmTagBase( mergeOverride( mergeInto.getScmTagBase(), toBeMerged.getScmTagBase() ) );
+        mergeInto.setScmTagNameFormat( mergeOverride( mergeInto.getScmTagNameFormat(), toBeMerged.getScmTagNameFormat() ) );
         mergeInto.setScmBranchBase( mergeOverride( mergeInto.getScmBranchBase(), toBeMerged.getScmBranchBase() ) );
         mergeInto.setScmUsername( mergeOverride( mergeInto.getScmUsername(), toBeMerged.getScmUsername() ) );
         mergeInto.setScmPassword( mergeOverride( mergeInto.getScmPassword(), toBeMerged.getScmPassword() ) );
@@ -140,6 +141,7 @@ public class ReleaseUtils
         releaseDescriptor.setScmPrivateKey( properties.getProperty( "scm.privateKey" ) );
         releaseDescriptor.setScmPrivateKeyPassPhrase( properties.getProperty( "scm.passphrase" ) );
         releaseDescriptor.setScmTagBase( properties.getProperty( "scm.tagBase" ) );
+        releaseDescriptor.setScmTagNameFormat( properties.getProperty( "scm.tagNameFormat" ) );
         releaseDescriptor.setScmBranchBase( properties.getProperty( "scm.branchBase" ) );
         releaseDescriptor.setScmReleaseLabel( properties.getProperty( "scm.tag" ) );
         releaseDescriptor.setScmCommentPrefix( properties.getProperty( "scm.commentPrefix" ) );

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=1139359&r1=1139358&r2=1139359&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 Fri Jun 24 15:48:07 2011
@@ -34,8 +34,15 @@ import org.apache.maven.shared.release.s
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
+import org.codehaus.plexus.interpolation.InterpolationException;
+import org.codehaus.plexus.interpolation.Interpolator;
+import org.codehaus.plexus.interpolation.PrefixAwareRecursionInterceptor;
+import org.codehaus.plexus.interpolation.PrefixedPropertiesValueSource;
+import org.codehaus.plexus.interpolation.RecursionInterceptor;
+import org.codehaus.plexus.interpolation.StringSearchInterpolator;
 
 import java.util.List;
+import java.util.Properties;
 
 /**
  * Input any variables that were not yet configured.
@@ -105,7 +112,32 @@ public class InputVariablesPhase
                 throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" );
             }
 
-            String defaultTag = project.getArtifactId() + "-" + releaseVersion;
+            String defaultTag;
+            String scmTagNameFormat = releaseDescriptor.getScmTagNameFormat();
+            if ( scmTagNameFormat != null )
+            {
+                Interpolator interpolator = new StringSearchInterpolator( "@{", "}" );
+                List<String> possiblePrefixes = java.util.Arrays.asList( "project", "pom" );
+                Properties values = new Properties();
+                values.setProperty( "artifactId", project.getArtifactId() );
+                values.setProperty( "groupId", project.getGroupId() );
+                values.setProperty( "version", project.getVersion() );
+                interpolator.addValueSource( new PrefixedPropertiesValueSource( possiblePrefixes, values, true ) );
+                RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( possiblePrefixes );
+                try
+                {
+                    defaultTag = interpolator.interpolate( scmTagNameFormat, recursionInterceptor );
+                }
+                catch ( InterpolationException e )
+                {
+                    throw new ReleaseExecutionException(
+                        "Could not interpolate specified tag name format: " + scmTagNameFormat, e );
+                }
+            }
+            else
+            {
+                defaultTag = project.getArtifactId() + "-" + releaseVersion;
+            }
 
             ScmProvider provider = null;
             try

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=1139359&r1=1139358&r2=1139359&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 Fri Jun 24 15:48:07 2011
@@ -470,6 +470,18 @@
           </description>
         </field>
 
+        <field>
+          <name>scmTagNameFormat</name>
+          <version>2.2.0+</version>
+          <type>String</type>
+          <defaultValue>@{project.artifactId}-@{project.version}</defaultValue>
+          <description>
+            Specifies the format for generating a tag name. Property expansion is
+            used with the optional prefix of project, where properties are delimited
+            with @{ and }
+          </description>
+        </field>
+
         <!-- Announcement Information
 
         Announcement related info, this can be a second part of the process.
@@ -772,6 +784,10 @@
         {
             return false;
         }
+        if ( !safeEquals( scmTagNameFormat, that.scmTagNameFormat ) )
+        {
+            return false;
+        }
 
         return true;
     }

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=1139359&r1=1139358&r2=1139359&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 Fri Jun 24 15:48:07 2011
@@ -284,6 +284,38 @@ public class InputVariablesPhaseTest
         assertEquals( "Check tag", "artifactId-1_0", releaseConfiguration.getScmReleaseLabel() );
     }
 
+    //MRELEASE-159
+    public void testCustomTagFormat()
+        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<MavenProject> 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" );
+
+        phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+
+        assertEquals( "Check tag", "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.setScmTagNameFormat( "simulated-@{artifactId}-@{version}" );
+
+        phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
+
+        assertEquals( "Check tag", "simulated-artifactId-1.0", releaseDescriptor.getScmReleaseLabel() );
+    }
+
     private static MavenProject createProject( String artifactId, String version )
     {
         Model model = new Model();

Modified: maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java?rev=1139359&r1=1139358&r2=1139359&view=diff
==============================================================================
--- maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java (original)
+++ maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java Fri Jun 24 15:48:07 2011
@@ -69,6 +69,21 @@ public abstract class AbstractReleaseMoj
     private String tag;
 
     /**
+     * Format to use when generating the tag name if none is specified. Property interpolation is performed on the
+     * tag, but in order to ensure that the interpolation occurs during release, you must use <code>@{...}</code>
+     * to reference the properties rather than <code>${...}</code>. The following properties are available:
+     * <ul>
+     *     <li><code>groupId</code> or <code>project.groupId</code> - The groupId of the root project.
+     *     <li><code>artifactId</code> or <code>project.artifactId</code> - The artifactId of the root project.
+     *     <li><code>version</code> or <code>project.version</code> - The release version of the root project.
+     * </ul>
+     *
+     * @parameter expression="${tagNameFormat}" default-value="@{project.artifactId}-@{project.version}"
+     * @since 2.2.0
+     */
+    private String tagNameFormat;
+
+    /**
      * The tag base directory in SVN, you must define it if you don't use the standard svn layout (trunk/tags/branches).
      * For example, <code>http://svn.apache.org/repos/asf/maven/plugins/tags</code>. The URL is an SVN URL and does not
      * include the SCM provider and protocol.
@@ -254,6 +269,7 @@ public abstract class AbstractReleaseMoj
 
         descriptor.setScmPassword( password );
         descriptor.setScmReleaseLabel( tag );
+        descriptor.setScmTagNameFormat( tagNameFormat );
         descriptor.setScmTagBase( tagBase );
         descriptor.setScmUsername( username );
         descriptor.setScmCommentPrefix( scmCommentPrefix );

Copied: maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm (from r1139308, maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt)
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm?p2=maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm&p1=maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt&r1=1139308&r2=1139359&rev=1139359&view=diff
==============================================================================
--- maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt (original)
+++ maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm Fri Jun 24 15:48:07 2011
@@ -93,4 +93,52 @@ mvn release:prepare-with-pom
   This goal is equivalent to the <<<release:prepare>>> goal, except that it requires a previous build of the project to
   exist to properly populate the <<<release-pom.xml>>> files.
 
+* Overriding the default tag name format
 
+  By default, if you do not specify a tag name, a default tag name of <<<artifactId>>>-<<<version>>> will be
+  suggested (and if running non-interactively used).
+
+  You can specify the exact tag name to use from the command line by passing the <<<tag>>> property, but if you
+  want to have the tag name generated, but just change the default pattern, you can use the <<<tagNameFormat>>>
+  configuration option.
+
+  For example to have the tag name default to the version number prefixed with a <<<v>>> you could configure
+  your pom like so:
+
++-----
+<project>
+  [...]
+  <build>
+    [...]
+    <plugins>
+      [...]
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-release-plugin</artifactId>
+        <version>${project.version}</version>
+        <configuration>
+          <tagNameFormat>v@{project.version}</tagNameFormat>
+        </configuration>
+      </plugin>
+      [...]
+    </plugins>
+    [...]
+  </build>
+  [...]
+</project>
++-----
+
+  The tagNameFormat uses <<<@{>>> and <<<}>>> as delimiters in order to ensure that the default Maven property
+  interpolation does not substitute the values before the version transformation has taken place.
+
+  The following properties are supported:
+
+    * <<<project.groupId>>> which corresponds to the project's groupId.
+
+    * <<<project.artifactId>>> which corresponds to the project's artifactId.
+
+    * <<<project.version>>> which corresponds to the project's release version.
+
+    []
+
+  The <<<project.>>> prefix is optional and may be omitted.
\ No newline at end of file

Propchange: maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/release/trunk/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision