You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2019/12/01 07:05:51 UTC

[maven-release] branch master updated: [MRELEASE-229] implementation of RemoveScmTagPhase, with unit test

This is an automated email from the ASF dual-hosted git repository.

hboutemy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-release.git


The following commit(s) were added to refs/heads/master by this push:
     new 13ccc54  [MRELEASE-229] implementation of RemoveScmTagPhase, with unit test
13ccc54 is described below

commit 13ccc54a39c7b44445e5ef72ced38da312719ca9
Author: Clemens Quoss <cl...@quoss.de>
AuthorDate: Sun May 19 21:42:47 2019 +0200

    [MRELEASE-229] implementation of RemoveScmTagPhase, with unit test
    
    this closes #29
---
 .../shared/release/phase/RemoveScmTagPhase.java    | 111 ++++++++++-
 .../release/phase/RemoveScmTagPhaseTest.java       | 211 +++++++++++++++++++++
 .../shared/release/phase/RemoveScmTagPhaseTest.xml |  36 ++++
 3 files changed, 352 insertions(+), 6 deletions(-)

diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveScmTagPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveScmTagPhase.java
index 485ca03..02f0870 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveScmTagPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveScmTagPhase.java
@@ -19,6 +19,7 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import java.io.File;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
@@ -28,26 +29,105 @@ import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.codehaus.plexus.component.annotations.Component;
 
 import java.util.List;
+import org.apache.maven.scm.CommandParameter;
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.untag.UntagScmResult;
+import org.apache.maven.scm.manager.NoSuchScmProviderException;
+import org.apache.maven.scm.provider.ScmProvider;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.maven.scm.repository.ScmRepositoryException;
+import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
+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.Requirement;
 
 /**
- * @author Edwin Punzalan
+ * Remove tag from SCM repository during rollback
  */
 @Component( role = ReleasePhase.class, hint = "remove-scm-tag" )
 public class RemoveScmTagPhase
     extends AbstractReleasePhase
 {
+    /**
+     * Tool that gets a configured SCM repository from release configuration.
+     */
+    @Requirement
+    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        ReleaseResult result = new ReleaseResult();
+        ReleaseResult releaseResult = new ReleaseResult();
+
+        validateConfiguration( releaseDescriptor );
+
+        logInfo( releaseResult, "Removing tag with the label " + releaseDescriptor.getScmReleaseLabel() + " ..." );
+
+        ReleaseDescriptor basedirAlignedReleaseDescriptor =
+            ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
+
+        ScmRepository repository;
+        ScmProvider provider;
+        try
+        {
+            repository =
+                scmRepositoryConfigurator.getConfiguredRepository( basedirAlignedReleaseDescriptor.getScmSourceUrl(),
+                                                                   releaseDescriptor,
+                                                                   releaseEnvironment.getSettings() );
+
+            repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
+
+            repository.getProviderRepository().setWorkItem( releaseDescriptor.getWorkItem() );
+
+            provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
+        }
+        catch ( ScmRepositoryException e )
+        {
+            throw new ReleaseScmRepositoryException( e.getMessage(), e.getValidationMessages() );
+        }
+        catch ( NoSuchScmProviderException e )
+        {
+            throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
+        }
+
+        UntagScmResult untagScmResult;
+        try
+        {
+            ScmFileSet fileSet = new ScmFileSet( new File( basedirAlignedReleaseDescriptor.getWorkingDirectory() ) );
+            String tagName = releaseDescriptor.getScmReleaseLabel();
+            String message = releaseDescriptor.getScmCommentPrefix() + "remove tag " + tagName;
+            CommandParameters commandParameters = new CommandParameters();
+            commandParameters.setString( CommandParameter.TAG_NAME, tagName );
+            commandParameters.setString( CommandParameter.MESSAGE, message );
+            if ( getLogger().isDebugEnabled() )
+            {
+                getLogger().debug(
+                    "RemoveScmTagPhase :: scmUntagParameters tagName " + tagName );
+                getLogger().debug(
+                    "RemoveScmTagPhase :: scmUntagParameters message " + message );
+                getLogger().debug( "ScmTagPhase :: fileSet  " + fileSet );
+            }
+            untagScmResult = provider.untag( repository, fileSet, commandParameters );
+        }
+        catch ( ScmException e )
+        {
+            throw new ReleaseExecutionException( "An error is occurred in the remove tag process: "
+                + e.getMessage(), e );
+        }
 
-        // TODO [!]: implement
+        if ( !untagScmResult.isSuccess() )
+        {
+            throw new ReleaseScmCommandException( "Unable to remove tag ", untagScmResult );
+        }
 
-        result.setResultCode( ReleaseResult.SUCCESS );
+        releaseResult.setResultCode( ReleaseResult.SUCCESS );
 
-        return result;
+        return releaseResult;
     }
 
     @Override
@@ -55,6 +135,25 @@ public class RemoveScmTagPhase
                                    List<MavenProject> reactorProjects )
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        return execute( releaseDescriptor, releaseEnvironment, reactorProjects );
+        ReleaseResult releaseResult = new ReleaseResult();
+
+        validateConfiguration( releaseDescriptor );
+
+        logInfo( releaseResult, "Full run would remove tag with label: '" + releaseDescriptor.getScmReleaseLabel()
+                + "'" );
+
+        releaseResult.setResultCode( ReleaseResult.SUCCESS );
+
+        return releaseResult;
     }
+
+    private void validateConfiguration( ReleaseDescriptor releaseDescriptor )
+        throws ReleaseFailureException
+    {
+        if ( releaseDescriptor.getScmReleaseLabel() == null )
+        {
+            throw new ReleaseFailureException( "A release label is required for removal" );
+        }
+    }
+
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RemoveScmTagPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RemoveScmTagPhaseTest.java
new file mode 100644
index 0000000..b18a66b
--- /dev/null
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RemoveScmTagPhaseTest.java
@@ -0,0 +1,211 @@
+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 java.util.List;
+
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.untag.UntagScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.provider.ScmProvider;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.maven.shared.release.ReleaseResult;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
+import org.apache.maven.shared.release.config.ReleaseUtils;
+import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
+import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
+import org.apache.maven.shared.release.stubs.ScmManagerStub;
+import org.apache.maven.shared.release.util.ReleaseUtil;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.mockito.Matchers;
+import org.mockito.Mockito;
+
+/**
+ * Test the remove SCM tag phase.
+ */
+public class RemoveScmTagPhaseTest extends AbstractReleaseTestCase
+{
+
+    @Override
+    public void setUp() throws Exception
+    {
+
+        super.setUp();
+
+        phase = ( ReleasePhase ) lookup( ReleasePhase.class, "remove-scm-tag" );
+
+    }
+
+    @Test
+    public void testExecuteOutput() throws Exception
+    {
+
+        // prepare
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmSourceUrl( "scm-url" );
+        List<MavenProject> reactorProjects = createReactorProjects();
+        MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setPomFileName( rootProject.getFile().getName() );
+        ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
+
+        // mock, only real mather is the file set
+        ScmProvider scmProviderMock = Mockito.mock( ScmProvider.class );
+        Mockito.when( scmProviderMock.untag( Matchers.isA( ScmRepository.class ),
+                Matchers.argThat( new IsScmFileSetEquals( fileSet ) ),
+                Matchers.isA( CommandParameters.class ) ) )
+                .thenReturn( new UntagScmResult( "...", "...", "...", true ) );
+        ScmManagerStub stub = ( ScmManagerStub ) lookup( ScmManager.class );
+        stub.setScmProvider( scmProviderMock );
+
+        // execute
+        ReleaseResult actual = phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ),
+                new DefaultReleaseEnvironment(), reactorProjects );
+
+        // verify, actual contains trailing newline
+        Assert.assertEquals( "[INFO] Removing tag with the label release-label ...", actual.getOutput().trim() );
+
+    }
+
+    @Test
+    public void testExecuteResultCode() throws Exception
+    {
+
+        // prepare
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmSourceUrl( "scm-url" );
+        List<MavenProject> reactorProjects = createReactorProjects();
+        MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setPomFileName( rootProject.getFile().getName() );
+        ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
+
+        // mock, only real mather is the file set
+        ScmProvider scmProviderMock = Mockito.mock( ScmProvider.class );
+        Mockito.when( scmProviderMock.untag( Matchers.isA( ScmRepository.class ),
+                Matchers.argThat( new IsScmFileSetEquals( fileSet ) ),
+                Matchers.isA( CommandParameters.class ) ) )
+                .thenReturn( new UntagScmResult( "...", "...", "...", true ) );
+        ScmManagerStub stub = ( ScmManagerStub ) lookup( ScmManager.class );
+        stub.setScmProvider( scmProviderMock );
+
+        // execute
+        ReleaseResult actual = phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ),
+                new DefaultReleaseEnvironment(), reactorProjects );
+
+        // verify
+        Assert.assertEquals( 0, actual.getResultCode() );
+
+    }
+
+    @Rule
+    public ExpectedException exceptionRule = ExpectedException.none();
+
+    @Test
+    public void testExecuteError() throws Exception
+    {
+
+        // prepare
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmSourceUrl( "scm-url" );
+        List<MavenProject> reactorProjects = createReactorProjects();
+        MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setPomFileName( rootProject.getFile().getName() );
+        ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
+
+        // mock, only real mather is the file set
+        ScmProvider scmProviderMock = Mockito.mock( ScmProvider.class );
+        Mockito.when( scmProviderMock.untag( Matchers.isA( ScmRepository.class ),
+                Matchers.argThat( new IsScmFileSetEquals( fileSet ) ),
+                Matchers.isA( CommandParameters.class ) ) )
+                .thenReturn( new UntagScmResult( "command-line", "provider-message", "command-output", false ) );
+        ScmManagerStub stub = ( ScmManagerStub ) lookup( ScmManager.class );
+        stub.setScmProvider( scmProviderMock );
+
+        // set up exception rule
+        exceptionRule.expect( ReleaseScmCommandException.class );
+        exceptionRule.expectMessage(
+                "Unable to remove tag \nProvider message:\nprovider-message\nCommand output:\ncommand-output" );
+
+        // execute
+        phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ),
+                new DefaultReleaseEnvironment(), reactorProjects );
+
+    }
+
+    @Test
+    public void testSimulateOutput() throws Exception
+    {
+
+        // prepare
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmSourceUrl( "scm-url" );
+        List<MavenProject> reactorProjects = createReactorProjects();
+        MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setPomFileName( rootProject.getFile().getName() );
+
+        // execute
+        ReleaseResult actual = phase.simulate(ReleaseUtils.buildReleaseDescriptor( builder ),
+                new DefaultReleaseEnvironment(), reactorProjects );
+
+        // verify, actual contains newline
+        Assert.assertEquals( "[INFO] Full run would remove tag with label: 'release-label'", 
+                actual.getOutput().trim() );
+
+    }
+
+    @Test
+    public void testSimulateResultCode() throws Exception
+    {
+
+        // prepare
+        ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
+        builder.setScmReleaseLabel( "release-label" );
+        builder.setScmSourceUrl( "scm-url" );
+        List<MavenProject> reactorProjects = createReactorProjects();
+        MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
+        builder.setWorkingDirectory( getPath( rootProject.getFile().getParentFile() ) );
+        builder.setPomFileName( rootProject.getFile().getName() );
+
+        // execute
+        ReleaseResult actual = phase.simulate( ReleaseUtils.buildReleaseDescriptor( builder ),
+                new DefaultReleaseEnvironment(), reactorProjects );
+
+        Assert.assertEquals( 0, actual.getResultCode() );
+
+    }
+
+    private List<MavenProject> createReactorProjects() throws Exception
+    {
+        return createReactorProjects( "scm-commit/single-pom", "" );
+    }
+
+}
diff --git a/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RemoveScmTagPhaseTest.xml b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RemoveScmTagPhaseTest.xml
new file mode 100644
index 0000000..1c43704
--- /dev/null
+++ b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RemoveScmTagPhaseTest.xml
@@ -0,0 +1,36 @@
+<!--
+  ~ 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.
+  -->
+
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.scm.manager.ScmManager</role>
+      <implementation>org.apache.maven.shared.release.stubs.ScmManagerStub</implementation>
+    </component>
+    <!-- Turn off info messages -->
+    <component>
+      <role>org.codehaus.plexus.logging.LoggerManager</role>
+      <implementation>org.codehaus.plexus.logging.console.ConsoleLoggerManager</implementation>
+      <lifecycle-handler>basic</lifecycle-handler>
+      <configuration>
+        <threshold>ERROR</threshold>
+      </configuration>
+    </component>
+  </components>
+</component-set>