You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2019/02/17 20:05:41 UTC

[maven-scm] branch SCM-917 created (now 295855c)

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

michaelo pushed a change to branch SCM-917
in repository https://gitbox.apache.org/repos/asf/maven-scm.git.


      at 295855c  [SCM-917] Implement scm:untag for Subversion provider

This branch includes the following new commits:

     new 295855c  [SCM-917] Implement scm:untag for Subversion provider

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[maven-scm] 01/01: [SCM-917] Implement scm:untag for Subversion provider

Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a commit to branch SCM-917
in repository https://gitbox.apache.org/repos/asf/maven-scm.git

commit 295855cafd86e96541896810c95ac4a7d3facf29
Author: Clemens Quoss <cl...@quoss.de>
AuthorDate: Wed Feb 6 09:28:33 2019 +0100

    [SCM-917] Implement scm:untag for Subversion provider
    
    This closes #88
---
 .gitignore                                         |   1 +
 .../org/apache/maven/scm/ScmUntagParameters.java   | 104 ++++++++++++++
 .../scm/command/untag/AbstractUntagCommand.java    |  17 ++-
 .../org/apache/maven/scm/plugin/UntagMojo.java     |   7 +
 .../git/gitexe/command/untag/GitUntagCommand.java  |   5 +-
 .../git/jgit/command/untag/JGitUntagCommand.java   |   5 +-
 .../scm/provider/svn/AbstractSvnScmProvider.java   |  15 ++
 .../maven/scm/provider/svn/TestSvnScmProvider.java |   5 +
 .../scm/provider/svn/svnexe/SvnExeScmProvider.java |   9 ++
 .../svn/svnexe/command/untag/SvnUntagCommand.java  | 153 +++++++++++++++++++++
 .../command/untag/SvnExeUntagCommandTckTest.java   | 100 ++++++++++++++
 .../svnexe/command/untag/SvnUntagCommandTest.java  | 117 ++++++++++++++++
 .../svn/command/untag/SvnUntagCommandTckTest.java  |  49 +++++++
 pom.xml                                            |   3 +-
 14 files changed, 585 insertions(+), 5 deletions(-)

diff --git a/.gitignore b/.gitignore
index d93c7cd..2894b8b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,5 +9,6 @@ target
 build
 .idea
 .java-version
+nbactions.xml
 maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/test/repository/CVSROOT/history
 maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/test/repository/CVSROOT/history
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/ScmUntagParameters.java b/maven-scm-api/src/main/java/org/apache/maven/scm/ScmUntagParameters.java
new file mode 100644
index 0000000..cda8ab3
--- /dev/null
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/ScmUntagParameters.java
@@ -0,0 +1,104 @@
+package org.apache.maven.scm;
+
+/*
+ * 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.io.Serializable;
+
+/**
+ * parameters used by implementation to perform untag operation
+ *
+ * @since 1.11.2
+ */
+public class ScmUntagParameters
+    implements Serializable
+{
+    /**
+     * serial version id
+     */
+    private static final long serialVersionUID = -7508529445894924957L;
+
+    /**
+     * id of tag to delete/remove
+     */
+    private String tag;
+
+    /**
+     * commit message
+     */
+    private String message;
+
+    /**
+     * constructor with tag and message
+     *
+     * @param tag     tag id
+     * @param message commit message
+     */
+    public ScmUntagParameters( String tag, String message )
+    {
+        this.tag = tag;
+        this.message = message;
+    }
+
+    /**
+     * get tag id
+     *
+     * @return tag id
+     */
+    public String getTag()
+    {
+        return tag;
+    }
+
+    /**
+     * set tag id
+     *
+     * @param tag tag id
+     */
+    public void setTag( String tag )
+    {
+        this.tag = tag;
+    }
+
+    /**
+     * get commit message
+     *
+     * @return commit message
+     */
+    public String getMessage()
+    {
+        return message;
+    }
+
+    /**
+     * set commit message
+     *
+     * @param message commit message
+     */
+    public void setMessage( String message )
+    {
+        this.message = message;
+    }
+
+    @Override
+    public String toString()
+    {
+        return ScmUntagParameters.class.getSimpleName() + " [tag=" + tag + ", message=" + message + "]";
+    }
+}
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/command/untag/AbstractUntagCommand.java b/maven-scm-api/src/main/java/org/apache/maven/scm/command/untag/AbstractUntagCommand.java
index bbbb0c8..d3a9c16 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/command/untag/AbstractUntagCommand.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/command/untag/AbstractUntagCommand.java
@@ -24,6 +24,7 @@ import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmUntagParameters;
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
@@ -31,18 +32,30 @@ import org.apache.maven.scm.provider.ScmProviderRepository;
 public abstract class AbstractUntagCommand
     extends AbstractCommand
 {
+    /**
+     * execute untag command
+     *
+     * @param repository         scm repo
+     * @param fileSet            set of files (unused)
+     * @param scmUntagParameters parameters used by untag implementations
+     * @return result of untag command
+     * @throws ScmException  in case of error
+     */
     protected abstract ScmResult executeUntagCommand( ScmProviderRepository repository,
-        ScmFileSet fileSet, String tagName )
+                                                      ScmFileSet fileSet, ScmUntagParameters scmUntagParameters )
         throws ScmException;
 
     /** {@inheritDoc} */
+    @Override
     public ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet fileSet,
                                      CommandParameters parameters )
         throws ScmException
     {
         String tagName = parameters.getString( CommandParameter.TAG_NAME );
+        String message = parameters.getString( CommandParameter.MESSAGE, "[maven-scm] remove tag " + tagName );
+        ScmUntagParameters scmUntagParameters = new ScmUntagParameters( tagName, message );
 
-        return executeUntagCommand( repository, fileSet, tagName );
+        return executeUntagCommand( repository, fileSet, scmUntagParameters );
     }
 
 }
diff --git a/maven-scm-plugin/src/main/java/org/apache/maven/scm/plugin/UntagMojo.java b/maven-scm-plugin/src/main/java/org/apache/maven/scm/plugin/UntagMojo.java
index 3368b53..ed915fe 100644
--- a/maven-scm-plugin/src/main/java/org/apache/maven/scm/plugin/UntagMojo.java
+++ b/maven-scm-plugin/src/main/java/org/apache/maven/scm/plugin/UntagMojo.java
@@ -43,6 +43,12 @@ public class UntagMojo
     @Parameter( property = "tag", required = true )
     private String tag;
 
+    /**
+     * The commit message.
+     */
+    @Parameter( property = "message", required = false )
+    private String message;
+
     /** {@inheritDoc} */
     public void execute()
         throws MojoExecutionException
@@ -59,6 +65,7 @@ public class UntagMojo
 
             CommandParameters parameters = new CommandParameters();
             parameters.setString( CommandParameter.TAG_NAME, finalTag );
+            parameters.setString( CommandParameter.MESSAGE, message );
 
             UntagScmResult result = provider.untag( repository, getFileSet(), parameters );
 
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/untag/GitUntagCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/untag/GitUntagCommand.java
index 8c8798d..31e1543 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/untag/GitUntagCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/untag/GitUntagCommand.java
@@ -24,6 +24,7 @@ import java.io.File;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmUntagParameters;
 import org.apache.maven.scm.command.untag.AbstractUntagCommand;
 import org.apache.maven.scm.command.untag.UntagScmResult;
 import org.apache.maven.scm.provider.ScmProviderRepository;
@@ -41,9 +42,11 @@ public class GitUntagCommand
 {
 
     /** {@inheritDoc} */
-    public ScmResult executeUntagCommand( ScmProviderRepository repo, ScmFileSet fileSet, String tag )
+    public ScmResult executeUntagCommand( ScmProviderRepository repo, ScmFileSet fileSet,
+                                          ScmUntagParameters scmUntagParameters )
         throws ScmException
     {
+        String tag = scmUntagParameters.getTag();
         if ( tag == null || StringUtils.isEmpty( tag.trim() ) )
         {
             throw new ScmException( "tag name must be specified" );
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/untag/JGitUntagCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/untag/JGitUntagCommand.java
index 3cc629e..074f8fb 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/untag/JGitUntagCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/command/untag/JGitUntagCommand.java
@@ -24,6 +24,7 @@ import java.util.Collection;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmUntagParameters;
 import org.apache.maven.scm.command.untag.AbstractUntagCommand;
 import org.apache.maven.scm.command.untag.UntagScmResult;
 import org.apache.maven.scm.log.ScmLogger;
@@ -44,8 +45,10 @@ public class JGitUntagCommand extends AbstractUntagCommand implements GitCommand
 
     @Override
     protected ScmResult executeUntagCommand( ScmProviderRepository repository, ScmFileSet fileSet,
-        String tagName ) throws ScmException
+                                             ScmUntagParameters scmUntagParameters )
+        throws ScmException
     {
+        String tagName = scmUntagParameters.getTag();
         if ( tagName == null || StringUtils.isEmpty( tagName.trim() ) )
         {
             throw new ScmException( "tag name must be specified" );
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
index f1e49e5..de6e929 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
@@ -42,12 +42,14 @@ import org.apache.maven.scm.command.mkdir.MkdirScmResult;
 import org.apache.maven.scm.command.remove.RemoveScmResult;
 import org.apache.maven.scm.command.status.StatusScmResult;
 import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.command.untag.UntagScmResult;
 import org.apache.maven.scm.command.update.UpdateScmResult;
 import org.apache.maven.scm.provider.AbstractScmProvider;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 import org.apache.maven.scm.provider.svn.command.SvnCommand;
 import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
 import org.apache.maven.scm.provider.svn.util.SvnUtil;
+import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.scm.repository.UnknownRepositoryStructure;
 import org.codehaus.plexus.util.StringUtils;
@@ -413,6 +415,19 @@ public abstract class AbstractSvnScmProvider
         return (TagScmResult) executeCommand( getTagCommand(), repository, fileSet, parameters );
     }
 
+    protected abstract SvnCommand getUntagCommand();
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public UntagScmResult untag( ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        return (UntagScmResult) executeCommand( getUntagCommand(), repository.getProviderRepository(),
+                                                fileSet, parameters );
+    }
+
     protected abstract SvnCommand getUpdateCommand();
 
     /**
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/TestSvnScmProvider.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/TestSvnScmProvider.java
index c14c683..7c7afa8 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/TestSvnScmProvider.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/TestSvnScmProvider.java
@@ -79,6 +79,11 @@ public class TestSvnScmProvider
         return null;
     }
 
+    protected SvnCommand getUntagCommand()
+    {
+        return null;
+    }
+
     protected SvnCommand getUpdateCommand()
     {
         return null;
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java
index 06393d1..ddf3460 100644
--- a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java
@@ -44,6 +44,7 @@ import org.apache.maven.scm.provider.svn.svnexe.command.remoteinfo.SvnRemoteInfo
 import org.apache.maven.scm.provider.svn.svnexe.command.remove.SvnRemoveCommand;
 import org.apache.maven.scm.provider.svn.svnexe.command.status.SvnStatusCommand;
 import org.apache.maven.scm.provider.svn.svnexe.command.tag.SvnTagCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.untag.SvnUntagCommand;
 import org.apache.maven.scm.provider.svn.svnexe.command.update.SvnUpdateCommand;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 
@@ -138,6 +139,14 @@ public class SvnExeScmProvider
     /**
      * {@inheritDoc}
      */
+    protected SvnCommand getUntagCommand()
+    {
+        return new SvnUntagCommand();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     protected SvnCommand getUpdateCommand()
     {
         return new SvnUpdateCommand();
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommand.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommand.java
new file mode 100644
index 0000000..de49edc
--- /dev/null
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommand.java
@@ -0,0 +1,153 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.untag;
+
+/*
+ * 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.io.File;
+import java.io.IOException;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmTag;
+import org.apache.maven.scm.ScmUntagParameters;
+import org.apache.maven.scm.command.untag.AbstractUntagCommand;
+import org.apache.maven.scm.command.untag.UntagScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.svn.SvnCommandUtils;
+import org.apache.maven.scm.provider.svn.SvnTagBranchUtils;
+import org.apache.maven.scm.provider.svn.command.SvnCommand;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.Os;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+/**
+ * scm:untag for provider svn is done by removing the tag dir
+ *
+ * @since 1.11.2
+ */
+public class SvnUntagCommand extends AbstractUntagCommand implements SvnCommand
+{
+
+    /** {@inheritDoc} */
+    @Override
+    public ScmResult executeUntagCommand( ScmProviderRepository repo, ScmFileSet fileSet,
+            ScmUntagParameters scmUntagParameters ) throws ScmException
+    {
+        String tag = scmUntagParameters.getTag();
+        if ( tag == null || tag.trim().isEmpty() )
+        {
+            throw new ScmException( "tag must be specified" );
+        }
+
+        SvnScmProviderRepository repository = (SvnScmProviderRepository) repo;
+
+        File messageFile = FileUtils.createTempFile( "maven-scm-", ".commit", null );
+
+        String message = scmUntagParameters.getMessage();
+        try
+        {
+            FileUtils.fileWrite( messageFile.getAbsolutePath(), "UTF-8", message );
+        }
+        catch ( IOException ex )
+        {
+            return new UntagScmResult( null, "Error while making a temporary file for the commit message: "
+                + ex.getMessage(), null, false );
+        }
+
+        Commandline cl = createCommandline( repository, fileSet, tag, messageFile );
+
+        CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
+
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+        if ( getLogger().isInfoEnabled() )
+        {
+            getLogger().info( "Executing: " + SvnCommandLineUtils.cryptPassword( cl ) );
+
+            if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
+            {
+                getLogger().info( "Working directory: " + cl.getWorkingDirectory().getAbsolutePath() );
+            }
+        }
+
+        int exitCode;
+
+        try
+        {
+            exitCode = SvnCommandLineUtils.execute( cl, stdout, stderr, getLogger() );
+        }
+        catch ( CommandLineException ex )
+        {
+            throw new ScmException( "Error while executing svn remove command.", ex );
+        }
+        finally
+        {
+            try
+            {
+                FileUtils.forceDelete( messageFile );
+            }
+            catch ( IOException ex )
+            {
+                // ignore
+            }
+        }
+
+        if ( exitCode == 0 )
+        {
+            return new UntagScmResult( cl.toString(), "The svn remove command was successful.",
+                    stderr.getOutput(), true );
+        }
+        else
+        {
+            return new UntagScmResult( cl.toString(), "The svn remove command failed.", stderr.getOutput(), false );
+        }
+
+    }
+
+    /**
+     * create command line from parameters
+     *
+     * @param repo        svn repo tu delete tag from
+     * @param fileSet     file set containing base dir
+     * @param tag         tag to delete
+     * @param messageFile file containing commit message
+     * @return            command line instance
+     */
+    Commandline createCommandline( SvnScmProviderRepository repo, ScmFileSet fileSet, String tag, File messageFile )
+    {
+        Commandline cl = SvnCommandLineUtils.getBaseSvnCommandLine( fileSet.getBasedir(), repo );
+
+        cl.createArg().setValue( "--file" );
+
+        cl.createArg().setValue( messageFile.getAbsolutePath() );
+
+        cl.createArg().setValue( "remove" );
+
+        String tagUrl = SvnTagBranchUtils.resolveTagUrl( repo, new ScmTag( tag ) );
+        tagUrl = SvnCommandUtils.fixUrl( tagUrl, repo.getUser() );
+        cl.createArg().setValue( tagUrl + "@" );
+
+        return cl;
+    }
+
+}
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnExeUntagCommandTckTest.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnExeUntagCommandTckTest.java
new file mode 100644
index 0000000..8dc0f69
--- /dev/null
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnExeUntagCommandTckTest.java
@@ -0,0 +1,100 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.untag;
+
+/*
+ * 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.io.File;
+import org.apache.maven.scm.ScmFileSet;
+
+import org.apache.maven.scm.provider.svn.command.untag.SvnUntagCommandTckTest;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.codehaus.plexus.util.cli.Commandline;
+
+/**
+ * This test tests the untag command for Subversion.
+ *
+ */
+public class SvnExeUntagCommandTckTest
+    extends SvnUntagCommandTckTest
+{
+    /**
+     * test against ssh repository with user
+     *
+     * @throws Exception in case of error
+     */
+    public void testUntagSsh()
+        throws Exception
+    {
+        File messageFile = File.createTempFile( "maven-scm", "commit" );
+        messageFile.deleteOnExit();
+
+        ScmFileSet scmFileSet = new ScmFileSet( new File ( "target/svn-untag-command-test" ) );
+
+        testCommandLine( "scm:svn:svn+ssh://foo.com/svn/trunk", scmFileSet, "svntag", messageFile,
+            "user", "svn --username user --no-auth-cache --non-interactive --file "
+            + messageFile.getAbsolutePath() + " remove svn+ssh://user@foo.com/svn/tags/svntag@" );
+    }
+
+    /**
+     * test against https repository with user
+     *
+     * @throws Exception in case of error
+     */
+    public void testUntagHttps()
+        throws Exception
+    {
+        File messageFile = File.createTempFile( "maven-scm", "commit" );
+        messageFile.deleteOnExit();
+
+        ScmFileSet scmFileSet = new ScmFileSet( new File ( "target/svn-untag-command-test" ) );
+
+        testCommandLine( "scm:svn:https://foo.com/svn/tags", scmFileSet, "svntag", messageFile,
+            "user", "svn --username user --no-auth-cache --non-interactive --file "
+            + messageFile.getAbsolutePath() + " remove https://foo.com/svn/tags/svntag@" );
+    }
+
+    /**
+     * test routine, build command line and assert
+     *
+     * @param scmUrl      url to svn repo
+     * @param scmFileSet  file set for local dir
+     * @param tag         tag to delete
+     * @param messageFile file containing commit message
+     * @param user        user to acces the repo with
+     * @param commandLine set command line for comparison
+     * @throws Exception  in case of error
+     */
+    private void testCommandLine( String scmUrl, ScmFileSet scmFileSet, String tag, File messageFile, String user,
+                                  String commandLine )
+        throws Exception
+    {
+        File workingDirectory = getTestFile( "target/svn-untag-command-test" );
+
+        ScmRepository repository = getScmManager().makeScmRepository( scmUrl );
+
+        SvnScmProviderRepository svnRepository = (SvnScmProviderRepository) repository.getProviderRepository();
+
+        svnRepository.setUser( user );
+
+        Commandline cl = new SvnUntagCommand().createCommandline( svnRepository, scmFileSet, tag, messageFile );
+
+        assertCommandLine( commandLine, workingDirectory, cl );
+    }
+}
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommandTest.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommandTest.java
new file mode 100644
index 0000000..7838a0c
--- /dev/null
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/untag/SvnUntagCommandTest.java
@@ -0,0 +1,117 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.untag;
+
+/*
+ * 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.scm.ScmTestCase;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+import org.apache.maven.scm.ScmFileSet;
+
+/**
+ * test the subversion untag implementation
+ *
+ */
+public class SvnUntagCommandTest
+    extends ScmTestCase
+{
+
+    /**
+     * test with http repo and user
+     *
+     * @throws Exception in case of error
+     */
+    public void testUntagHttp()
+        throws Exception
+    {
+
+        File messageFile = File.createTempFile( "maven-scm", "untag" );
+        messageFile.deleteOnExit();
+
+        testCommandLine( "scm:svn:http://foo.com/svn/tags", new ScmFileSet( getUntagTestFile() ), "svntag", "user",
+                messageFile, "svn --username user --no-auth-cache --non-interactive "
+                + "--file " +  messageFile.getAbsolutePath() + " remove http://foo.com/svn/tags/svntag@" );
+    }
+
+    /**
+     * test with ssh repo and user
+     *
+     * @throws Exception in case of error
+     */
+    public void testUntagSsh()
+        throws Exception
+    {
+
+        File messageFile = File.createTempFile( "maven-scm", "untag" );
+        messageFile.deleteOnExit();
+
+        testCommandLine( "scm:svn:svn+ssh://foo.com/svn/tags", new ScmFileSet( getUntagTestFile() ), "svntag", "user",
+                messageFile, "svn --username user --no-auth-cache --non-interactive "
+                + "--file " +  messageFile.getAbsolutePath() + " remove svn+ssh://user@foo.com/svn/tags/svntag@" );
+    }
+
+    /**
+     * define path to local dir
+     *
+     * @return local dir
+     */
+    private File getUntagTestFile()
+    {
+        return getTestFile( "target/svn-untag-command-test" );
+    }
+
+    /**
+     * get svn repo instance
+     *
+     * @param scmUrl     url to svn repo
+     * @return           svn repo instance
+     * @throws Exception in case of error
+     */
+    private SvnScmProviderRepository getSvnRepository( String scmUrl )
+        throws Exception
+    {
+        ScmRepository repository = getScmManager().makeScmRepository( scmUrl );
+
+        return (SvnScmProviderRepository) repository.getProviderRepository();
+    }
+
+    /**
+     * test routine for command line
+     *
+     * @param scmUrl      url to build repo instnace from
+     * @param scmFileSet  file set containing local base dir
+     * @param tag         tag to delete
+     * @param user        svn user for repo access
+     * @param messageFile file containing commit message
+     * @param commandline set command line to compare actual to
+     * @throws Exception  in case of error
+     */
+    private void testCommandLine( String scmUrl, ScmFileSet scmFileSet, String tag, String user, File messageFile,
+            String commandline ) throws Exception
+    {
+        SvnScmProviderRepository repo = getSvnRepository( scmUrl );
+        repo.setUser(user);
+        Commandline cl = new SvnUntagCommand().createCommandline( repo, scmFileSet, tag, messageFile );
+
+        assertCommandLine( commandline, scmFileSet.getBasedir(), cl );
+    }
+}
diff --git a/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svntest/src/main/java/org/apache/maven/scm/provider/svn/command/untag/SvnUntagCommandTckTest.java b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svntest/src/main/java/org/apache/maven/scm/provider/svn/command/untag/SvnUntagCommandTckTest.java
new file mode 100644
index 0000000..c8cb9d7
--- /dev/null
+++ b/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svntest/src/main/java/org/apache/maven/scm/provider/svn/command/untag/SvnUntagCommandTckTest.java
@@ -0,0 +1,49 @@
+package org.apache.maven.scm.provider.svn.command.untag;
+
+/*
+ * 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.scm.provider.svn.SvnScmTestUtils;
+import org.apache.maven.scm.tck.command.untag.UntagCommandTckTest;
+
+import java.io.File;
+
+/**
+ * This test tests the tag command.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ *
+ */
+public class SvnUntagCommandTckTest
+    extends UntagCommandTckTest
+{
+    /** {@inheritDoc} */
+    public String getScmUrl()
+        throws Exception
+    {
+        return SvnScmTestUtils.getScmUrl( new File( getRepositoryRoot(), "trunk" ) );
+    }
+
+    /** {@inheritDoc} */
+    public void initRepo()
+        throws Exception
+    {
+        SvnScmTestUtils.initializeRepository( getRepositoryRoot() );
+    }
+}
diff --git a/pom.xml b/pom.xml
index 6a3b1ca..3405fe8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -349,7 +349,8 @@
               <exclude>src/test/linear-changelog/**</exclude>
               <exclude>src/test/tck-repository/**</exclude>
               <exclude>src/main/resources/tck/**</exclude>
-              <exclude>.travis.yml </exclude>
+              <exclude>.travis.yml</exclude>
+              <exclude>nbactions.xml</exclude>
             </excludes>
           </configuration>
         </plugin>