Author: nicolas
Date: Wed May  7 08:14:36 2008
New Revision: 654145

URL: http://svn.apache.org/viewvc?rev=654145&view=rev
Log:
MRELEASE-341 : new release:stage mojo to deploy to a staging repository, and 
still support release:rollback

Added:
    
maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java
   (with props)
    
maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
   (with props)
    maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/
    
maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml
   (with props)
Modified:
    
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
    
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java
    
maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java
    maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt

Modified: 
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
URL: 
http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java?rev=654145&r1=654144&r2=654145&view=diff
==============================================================================
--- 
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
 (original)
+++ 
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
 Wed May  7 08:14:36 2008
@@ -257,14 +257,27 @@
     public void perform( ReleaseDescriptor releaseDescriptor, Settings 
settings, List reactorProjects )
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        perform( releaseDescriptor, settings, reactorProjects, null );
+        perform( releaseDescriptor, settings, reactorProjects, null, true );
+    }
+
+    public void perform( ReleaseDescriptor releaseDescriptor, Settings 
settings, List reactorProjects, boolean clean )
+        throws ReleaseExecutionException, ReleaseFailureException
+    {
+        perform( releaseDescriptor, settings, reactorProjects, null, false );
     }
 
     public void perform( ReleaseDescriptor releaseDescriptor, Settings 
settings, List reactorProjects,
                          ReleaseManagerListener listener )
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        perform( releaseDescriptor, settings, reactorProjects, listener, new 
ReleaseResult() );
+        perform( releaseDescriptor, settings, reactorProjects, listener, true 
);
+    }
+
+    public void perform( ReleaseDescriptor releaseDescriptor, Settings 
settings, List reactorProjects,
+                         ReleaseManagerListener listener, boolean clean )
+        throws ReleaseExecutionException, ReleaseFailureException
+    {
+        perform( releaseDescriptor, settings, reactorProjects, listener, new 
ReleaseResult(), clean );
     }
 
     public ReleaseResult performWithResult( ReleaseDescriptor 
releaseDescriptor, Settings settings,
@@ -276,7 +289,7 @@
         {
             result.setStartTime( System.currentTimeMillis() );
 
-            perform( releaseDescriptor, settings, reactorProjects, listener, 
result );
+            perform( releaseDescriptor, settings, reactorProjects, listener, 
result, true );
 
             result.setResultCode( ReleaseResult.SUCCESS );
         }
@@ -297,7 +310,7 @@
     }
 
     private void perform( ReleaseDescriptor releaseDescriptor, Settings 
settings, List reactorProjects,
-                          ReleaseManagerListener listener, ReleaseResult 
result )
+                          ReleaseManagerListener listener, ReleaseResult 
result, boolean clean )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         updateListener( listener, "perform", GOAL_START );
@@ -320,8 +333,11 @@
             updateListener( listener, name, PHASE_END );
         }
 
-        //call release:clean so that resume will not be possible anymore after 
a perform
-        clean( releaseDescriptor, listener, reactorProjects );
+        if ( clean )
+        {
+            // call release:clean so that resume will not be possible anymore 
after a perform
+            clean( releaseDescriptor, listener, reactorProjects );
+        }
 
         updateListener( listener, "perform", GOAL_END );
     }

Modified: 
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java
URL: 
http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java?rev=654145&r1=654144&r2=654145&view=diff
==============================================================================
--- 
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java
 (original)
+++ 
maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java
 Wed May  7 08:14:36 2008
@@ -111,6 +111,20 @@
     ReleaseResult performWithResult( ReleaseDescriptor releaseDescriptor, 
Settings settings, List reactorProjects,
                                      ReleaseManagerListener listener );
 
+
+    /**
+     * Perform a release, and optionnaly cleanup.
+     *
+     * @param releaseDescriptor the configuration to use for release
+     * @param settings          the settings.xml configuration
+     * @param reactorProjects   the reactor projects
+     * @param clean             flag to clean the release after perform
+     * @throws ReleaseExecutionException if there is a problem performing the 
release
+     * @throws ReleaseFailureException   if there is a problem performing the 
release
+     */
+    void perform( ReleaseDescriptor releaseDescriptor, Settings settings, List 
reactorProjects, boolean clean )
+        throws ReleaseExecutionException, ReleaseFailureException;
+
     /**
      * Clean a release.
      *

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=654145&r1=654144&r2=654145&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
 Wed May  7 08:14:36 2008
@@ -105,8 +105,8 @@
      * @parameter expression="${arguments}" alias="prepareVerifyArgs"
      */
     private String arguments;
-               
-       
+
+
     /**
      * The file name of the POM to execute any goals against.
      *
@@ -173,7 +173,7 @@
         descriptor.setWorkingDirectory( basedir.getAbsolutePath() );
 
         descriptor.setPomFileName( pomFileName );
-               
+
                List profiles = project.getActiveProfiles();
 
                String arguments = this.arguments;
@@ -213,14 +213,14 @@
 
         return descriptor;
     }
-       
+
        /**
         * @return additional profiles to enable during release
         */
        protected String getAdditionalProfiles()
        {
                return null;
-       }               
+       }
 
     void setReleaseManager( ReleaseManager releaseManager )
     {
@@ -241,4 +241,20 @@
     {
         return reactorProjects;
     }
+
+    /**
+     * Add additional arguments
+     * @param argument
+     */
+    protected void addArgument( String argument )
+    {
+        if (this.arguments != null)
+        {
+            this.arguments += " " + argument;
+        }
+        else
+        {
+            this.arguments = argument;
+        }
+    }
 }

Added: 
maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java
URL: 
http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java?rev=654145&view=auto
==============================================================================
--- 
maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java
 (added)
+++ 
maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java
 Wed May  7 08:14:36 2008
@@ -0,0 +1,154 @@
+package org.apache.maven.plugins.release;
+
+/*
+ * 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.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.shared.release.ReleaseExecutionException;
+import org.apache.maven.shared.release.ReleaseFailureException;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+
+import org.codehaus.plexus.util.StringUtils;
+
+import java.io.File;
+
+/**
+ * Perform a release from SCM to a staging repository.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+ * @aggregator
+ * @requiresProject false
+ * @goal stage
+ */
+public class StageReleaseMojo
+    extends AbstractReleaseMojo
+{
+    /**
+     * A comma or space separated list of goals to execute on deployment.
+     *
+     * Default value is either <code>deploy</code> or
+     * <code>deploy site-deploy</code>, if the project has a
+     * &lt;distributionManagement&gt;/&lt;site&gt; element.
+     *
+     * @parameter expression="${goals}"
+     */
+    private String goals;
+
+       /**
+     * Comma separated profiles to enable on deployment, in addition to active 
profiles
+        * for project execution.
+     *
+     * @parameter
+     */
+    private String releaseProfiles;
+
+    /**
+     * The checkout directory.
+     *
+     * @parameter default-value="${project.build.directory}/checkout"
+     * @required
+     */
+    private File workingDirectory;
+
+    /**
+     * The SCM URL to checkout from. If omitted, the one from the
+     * <code>release.properties</code> file is used, followed by the URL
+     * from the current POM.
+     *
+     * @parameter expression="${connectionUrl}"
+     */
+    private String connectionUrl;
+
+    /**
+     * Whether to use the release profile that adds sources and javadocs to the
+     * released artifact, if appropriate.
+     *
+     * @parameter expression="${useReleaseProfile}" default-value="true"
+     */
+    private boolean useReleaseProfile;
+
+
+    /**
+     * URL of the staging repository to use.
+     *
+     * @parameter expression="${stagingRepository}"
+     * @required
+     */
+    private String stagingRepository;
+
+       protected String getAdditionalProfiles()
+       {
+               return releaseProfiles;
+       }
+
+    public void execute()
+        throws MojoExecutionException, MojoFailureException
+    {
+        super.execute();
+
+               // goals may be splitted into multiple line in configuration.
+               // Let's build a single line command
+               if ( goals != null )
+               {
+                       goals = StringUtils.join( StringUtils.split( goals ), " 
" );
+               }
+
+        try
+        {
+            addArgument( "-DaltDeploymentRepository=\"" + stagingRepository + 
"\"" );
+
+            // Note that the working directory here is not the same as in the 
release configuration, so don't reuse that
+            ReleaseDescriptor releaseDescriptor = createReleaseDescriptor();
+            if ( connectionUrl != null )
+            {
+                releaseDescriptor.setScmSourceUrl( connectionUrl );
+            }
+
+            releaseDescriptor.setCheckoutDirectory( 
workingDirectory.getAbsolutePath() );
+            releaseDescriptor.setUseReleaseProfile( useReleaseProfile );
+
+            if ( goals == null )
+            {
+                // set default
+                goals = "deploy";
+                if ( project.getDistributionManagement() != null &&
+                    project.getDistributionManagement().getSite() != null )
+                {
+                    goals += " site:stage-deploy";
+                }
+            }
+
+            goals = StringUtils.replace( goals, "site-deploy", 
"site:stage-deploy" );
+            goals = StringUtils.replace( goals, "site:deploy", 
"site:stage-deploy" );
+
+            releaseDescriptor.setPerformGoals( goals );
+
+            releaseManager.perform( releaseDescriptor, settings, 
reactorProjects, false );
+        }
+        catch ( ReleaseExecutionException e )
+        {
+            throw new MojoExecutionException( e.getMessage(), e );
+        }
+        catch ( ReleaseFailureException e )
+        {
+            throw new MojoFailureException( e.getMessage() );
+        }
+    }
+}

Propchange: 
maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt
URL: 
http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt?rev=654145&r1=654144&r2=654145&view=diff
==============================================================================
--- maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt (original)
+++ maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt Wed May  7 
08:14:36 2008
@@ -92,3 +92,22 @@
 ------
 mvn --batch-mode release:prepare
 ------
+
+* Use a staging repository
+
+  Sometimes it is desirable to deploy a pre-release to be approved before made 
publicly available. One option is to
+  create release candidates versions using the <<<release:perform>>> goal, but 
the final deployed artifact will NOT
+  be the exact one that has been approved as RCx.
+
+  A common solution is to use a staging repository, where a test-version is 
deployed with it's documentation for
+  review. If all is fine, it is then copied to the public repository. Using 
this strategy, the artifact that has
+  been tested IS the one that is deployed.
+
+  The <<<release:stage>>> goal uses this strategy. It replaces the 
<<<release:perform>>> goal and does the same
+  tasks, but requires a <<<stagingRepository>>> parameter. It will 
automatically re-configure the deploy and
+  site-deploy goals to use the staging strategy.
+
+  After the release is complete, the <<<release.properties>>> and other 
release files will NOT be removed, so that
+  you can still execute a <<<release:rollback>>> if something wrong has been 
detected and a new candidate must
+  be created after some fixes. You just need to use a distinct tag in SCM, or 
rename the one that has been created
+  if the SCM provider supports renaming tag.

Added: 
maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
URL: 
http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java?rev=654145&view=auto
==============================================================================
--- 
maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
 (added)
+++ 
maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
 Wed May  7 08:14:36 2008
@@ -0,0 +1,98 @@
+package org.apache.maven.plugins.release;
+
+/*
+ * 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.model.DistributionManagement;
+import org.apache.maven.model.Profile;
+import org.apache.maven.model.Site;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.testing.AbstractMojoTestCase;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.settings.Settings;
+import org.apache.maven.shared.release.ReleaseExecutionException;
+import org.apache.maven.shared.release.ReleaseFailureException;
+import org.apache.maven.shared.release.ReleaseManager;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.jmock.Mock;
+import org.jmock.core.Constraint;
+import org.jmock.core.constraint.IsEqual;
+import org.jmock.core.constraint.IsNull;
+import org.jmock.core.matcher.InvokeOnceMatcher;
+import org.jmock.core.stub.ThrowStub;
+
+import java.io.File;
+import java.util.Arrays;
+
+/**
+ * Test release:perform.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Brett Porter</a>
+ */
+public class StageReleaseMojoTest
+    extends AbstractMojoTestCase
+{
+    private File workingDirectory;
+
+    public void testStage()
+        throws Exception
+    {
+        StageReleaseMojo mojo = getMojoWithProjectSite( "stage.xml" );
+
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setWorkingDirectory( 
workingDirectory.getAbsolutePath() );
+        File checkoutDirectory = getTestFile( "target/checkout" );
+        releaseDescriptor.setCheckoutDirectory( 
checkoutDirectory.getAbsolutePath() );
+        releaseDescriptor.setPerformGoals( "deploy site:stage-deploy" );
+        releaseDescriptor.setAdditionalArguments( 
"-DaltDeploymentRepository=\"staging\"" );
+        Settings settings = mojo.getSettings();
+
+        Mock mock = new Mock( ReleaseManager.class );
+        Constraint[] constraints =
+            new Constraint[]{new IsEqual( releaseDescriptor ), new IsEqual( 
settings ), new IsNull(), new IsEqual( Boolean.FALSE ) };
+        mock.expects( new InvokeOnceMatcher() ).method( "perform" ).with( 
constraints );
+        mojo.setReleaseManager( (ReleaseManager) mock.proxy() );
+
+        mojo.execute();
+
+        assertTrue( true );
+    }
+
+    private StageReleaseMojo getMojoWithProjectSite( String fileName )
+        throws Exception
+    {
+        StageReleaseMojo mojo = (StageReleaseMojo) lookupMojo( "stage", new 
File( workingDirectory, fileName ) );
+        mojo.setBasedir( workingDirectory );
+
+        MavenProject project = (MavenProject) getVariableValueFromObject( 
mojo, "project" );
+        DistributionManagement distributionManagement = new 
DistributionManagement();
+        distributionManagement.setSite( new Site() );
+        project.setDistributionManagement( distributionManagement );
+
+        return mojo;
+    }
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        workingDirectory = getTestFile( "target/test-classes/mojos/stage" );
+    }
+}

Propchange: 
maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml
URL: 
http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml?rev=654145&view=auto
==============================================================================
--- 
maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml
 (added)
+++ 
maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml
 Wed May  7 08:14:36 2008
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project>
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-release-plugin</artifactId>
+        <configuration>
+          <settings implementation="org.apache.maven.settings.Settings"/>
+          <project 
implementation="org.apache.maven.plugins.release.stubs.MavenProjectStub"/>
+          <workingDirectory>${basedir}/target/checkout</workingDirectory>
+          <stagingRepository>staging</stagingRepository>
+                 <goals>deploy site-deploy</goals>
+          <useReleaseProfile>true</useReleaseProfile>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file

Propchange: 
maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml


Reply via email to