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

kwin pushed a commit to branch feature/pass-env-variables-to-git-tag-push
in repository https://gitbox.apache.org/repos/asf/maven-scm.git

commit a0997d11a652b11e69f9220e46137e26dfb79ad0
Author: Konrad Windszus <k...@apache.org>
AuthorDate: Mon Jul 28 16:35:47 2025 +0200

    Git: Use environment variables when pushing tags to remote
    
    Add SSH based push tag test
    Refactor SSH support for tests
    
    This closes #1253
---
 .../scm/command/untag/AbstractUntagCommand.java    |  2 +-
 .../scm/provider/git/gitexe/GitExeScmProvider.java |  4 +-
 .../git/gitexe/command/tag/GitTagCommand.java      | 12 ++-
 .../git/gitexe/command/untag/GitUntagCommand.java  | 12 ++-
 .../command/tag/GitExeSshTagCommandTckTest.java    | 67 +++++++++++++++
 ...eckOutCommandTckTest.java => GitSshServer.java} | 91 ++++++++-------------
 .../checkout/GitSshCheckOutCommandTckTest.java     | 82 ++-----------------
 .../git/command/tag/GitSshTagCommandTckTest.java   | 95 ++++++++++++++++++++++
 .../checkout/JGitSshCheckOutCommandTckTest.java    |  2 +-
 9 files changed, 223 insertions(+), 144 deletions(-)

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 a44eab243..da9079e56 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
@@ -27,7 +27,7 @@
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
-/** {@inheritDoc} */
+/** Removes a tag */
 public abstract class AbstractUntagCommand extends AbstractCommand {
     /**
      * execute untag command
diff --git 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/GitExeScmProvider.java
 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/GitExeScmProvider.java
index dad934842..950b27e66 100644
--- 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/GitExeScmProvider.java
+++ 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/GitExeScmProvider.java
@@ -106,12 +106,12 @@ protected GitCommand getStatusCommand() {
 
     /** {@inheritDoc} */
     protected GitCommand getTagCommand() {
-        return new GitTagCommand();
+        return new GitTagCommand(environmentVariables);
     }
 
     /** {@inheritDoc} */
     protected GitCommand getUntagCommand() {
-        return new GitUntagCommand();
+        return new GitUntagCommand(environmentVariables);
     }
 
     /** {@inheritDoc} */
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/tag/GitTagCommand.java
 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
index 9099156eb..e12c09208 100644
--- 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
+++ 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
@@ -20,6 +20,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Map;
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
@@ -44,6 +45,11 @@
  *
  */
 public class GitTagCommand extends AbstractTagCommand implements GitCommand {
+    private final Map<String, String> environmentVariables;
+
+    public GitTagCommand(Map<String, String> environmentVariables) {
+        this.environmentVariables = environmentVariables;
+    }
 
     public ScmResult executeTagCommand(ScmProviderRepository repo, ScmFileSet 
fileSet, String tag, String message)
             throws ScmException {
@@ -156,9 +162,9 @@ static Commandline createCommandLine(
         return cl;
     }
 
-    public static Commandline createPushCommandLine(GitScmProviderRepository 
repository, ScmFileSet fileSet, String tag)
-            throws ScmException {
-        Commandline cl = 
GitCommandLineUtils.getBaseGitCommandLine(fileSet.getBasedir(), "push");
+    public Commandline createPushCommandLine(GitScmProviderRepository 
repository, ScmFileSet fileSet, String tag) {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine(
+                fileSet.getBasedir(), "push", repository, 
environmentVariables);
 
         cl.createArg().setValue(repository.getPushUrl());
         cl.createArg().setValue("refs/tags/" + tag);
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 4ab067527..8abf00f4e 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
@@ -19,6 +19,7 @@
 package org.apache.maven.scm.provider.git.gitexe.command.untag;
 
 import java.io.File;
+import java.util.Map;
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
@@ -35,6 +36,11 @@
 
 /** {@inheritDoc} */
 public class GitUntagCommand extends AbstractUntagCommand implements 
GitCommand {
+    private final Map<String, String> environmentVariables;
+
+    public GitUntagCommand(Map<String, String> environmentVariables) {
+        this.environmentVariables = environmentVariables;
+    }
 
     /** {@inheritDoc} */
     public ScmResult executeUntagCommand(
@@ -85,9 +91,9 @@ public static Commandline createCommandLine(
         return cl;
     }
 
-    public static Commandline createPushCommandLine(
-            GitScmProviderRepository repository, ScmFileSet fileSet, String 
tag) {
-        Commandline cl = 
GitCommandLineUtils.getBaseGitCommandLine(fileSet.getBasedir(), "push");
+    public Commandline createPushCommandLine(GitScmProviderRepository 
repository, ScmFileSet fileSet, String tag) {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine(
+                fileSet.getBasedir(), "push", repository, 
environmentVariables);
 
         cl.createArg().setValue("--delete");
         cl.createArg().setValue(repository.getPushUrl());
diff --git 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitExeSshTagCommandTckTest.java
 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitExeSshTagCommandTckTest.java
new file mode 100644
index 000000000..92b9b2e44
--- /dev/null
+++ 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitExeSshTagCommandTckTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ */
+package org.apache.maven.scm.provider.git.gitexe.command.tag;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.GeneralSecurityException;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.maven.scm.provider.git.command.tag.GitSshTagCommandTckTest;
+import org.apache.maven.scm.provider.git.gitexe.GitExeScmProvider;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.apache.maven.scm.repository.ScmRepository;
+
+/**
+ *
+ */
+public class GitExeSshTagCommandTckTest extends GitSshTagCommandTckTest {
+    private Path knownHostsFile;
+
+    public static final String VARIABLE_GIT_SSH_COMMAND =
+            "GIT_SSH_COMMAND"; // 
https://git-scm.com/docs/git#Documentation/git.txt-codeGITSSHCOMMANDcode, 
requires git
+    // 2.3.0 or newer
+
+    public GitExeSshTagCommandTckTest() throws GeneralSecurityException {
+        super();
+    }
+
+    @Override
+    protected String getScmProvider() {
+        return "git";
+    }
+
+    @Override
+    public void configureCredentials(ScmRepository repository, String 
passphrase) throws Exception {
+        super.configureCredentials(repository, passphrase);
+        GitScmProviderRepository providerRepository = 
(GitScmProviderRepository) repository.getProviderRepository();
+        GitExeScmProvider provider = (GitExeScmProvider) 
getScmManager().getProviderByRepository(getScmRepository());
+        knownHostsFile = Files.createTempFile("known-hosts", null);
+        provider.setEnvironmentVariable(
+                VARIABLE_GIT_SSH_COMMAND,
+                "ssh -o UserKnownHostsFile=" + knownHostsFile + " -o 
StrictHostKeyChecking=no -o IdentitiesOnly=yes -i "
+                        + 
FilenameUtils.separatorsToUnix(providerRepository.getPrivateKey()));
+    }
+
+    @Override
+    public void removeRepo() throws Exception {
+        super.removeRepo();
+        Files.deleteIfExists(knownHostsFile);
+    }
+}
diff --git 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/checkout/GitSshCheckOutCommandTckTest.java
 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/GitSshServer.java
similarity index 62%
copy from 
maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/checkout/GitSshCheckOutCommandTckTest.java
copy to 
maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/GitSshServer.java
index bdc65625c..18fa91736 100644
--- 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/checkout/GitSshCheckOutCommandTckTest.java
+++ 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/GitSshServer.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.maven.scm.provider.git.command.checkout;
+package org.apache.maven.scm.provider.git;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -31,10 +31,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;
-import org.apache.maven.scm.provider.git.GitScmTestUtils;
-import org.apache.maven.scm.repository.ScmRepository;
-import org.apache.maven.scm.tck.command.checkout.CheckOutCommandTckTest;
 import org.apache.sshd.common.config.keys.KeyUtils;
 import 
org.apache.sshd.common.config.keys.writer.openssh.OpenSSHKeyEncryptionContext;
 import 
org.apache.sshd.common.config.keys.writer.openssh.OpenSSHKeyPairResourceWriter;
@@ -50,23 +46,14 @@
 import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
 import org.bouncycastle.openssl.jcajce.JcaPKCS8Generator;
 import org.bouncycastle.util.io.pem.PemObject;
-import org.junit.Assume;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-/**
- *
- */
-public abstract class GitSshCheckOutCommandTckTest extends 
CheckOutCommandTckTest {
+public class GitSshServer {
+
     protected final SshServer sshServer;
     protected final KeyPair keyPair;
     protected final List<PublicKey> acceptedPublicKeys;
 
-    @Rule
-    public TemporaryFolder tmpDirectory = new TemporaryFolder();
-
-    protected GitSshCheckOutCommandTckTest() throws GeneralSecurityException {
+    public GitSshServer() throws GeneralSecurityException {
         sshServer = CoreTestSupportUtils.setupTestServer(getClass());
         keyPair = 
CommonTestSupportUtils.generateKeyPair(KeyUtils.RSA_ALGORITHM, 2048);
         acceptedPublicKeys = new ArrayList<>();
@@ -75,7 +62,18 @@ protected GitSshCheckOutCommandTckTest() throws 
GeneralSecurityException {
         sshServer.setPublickeyAuthenticator(authenticator);
     }
 
-    void writePrivateKeyAsPkcs8(Path file, String passphrase) throws 
IOException, GeneralSecurityException {
+    /**
+     * Writes a private key which is accepted by this server to the specified 
file in PKCS8 format.
+     * If a passphrase is provided, the key will be encrypted using OpenSSH's 
format.
+     * If no passphrase is provided, the key will be written as an unencrypted 
PKCS8 private key.
+     * For the same server instance the private key is always the same, so it 
can be reused.
+     *
+     * @param file the file to write the private key to
+     * @param passphrase the passphrase for encryption, or null for unencrypted
+     * @throws IOException if an I/O error occurs
+     * @throws GeneralSecurityException if a security error occurs
+     */
+    public void writePrivateKeyAsPkcs8(Path file, String passphrase) throws 
IOException, GeneralSecurityException {
         // encryption only optional
         if (passphrase != null) {
             // encryption with format outlined in 
https://dnaeon.github.io/openssh-private-key-binary-format/
@@ -103,60 +101,35 @@ void writePrivateKeyAsPkcs8(Path file, String passphrase) 
throws IOException, Ge
         }
     }
 
-    protected abstract String getScmProvider();
-
-    /** {@inheritDoc} */
-    public String getScmUrl() throws Exception {
-        return "scm:" + getScmProvider() + ":ssh://localhost:" + 
sshServer.getPort() + "/repository";
+    public void addPublicKey(PublicKey publicKey) {
+        if (publicKey == null) {
+            throw new IllegalArgumentException("Public key must not be null");
+        }
+        acceptedPublicKeys.add(publicKey);
     }
 
-    public void configureCredentials(ScmRepository repository, String 
passphrase) throws Exception {
-        ScmProviderRepositoryWithHost providerRepository =
-                
ScmProviderRepositoryWithHost.class.cast(repository.getProviderRepository());
-        // store as file
-        Path privateKeyFile = tmpDirectory.newFile().toPath();
-        writePrivateKeyAsPkcs8(privateKeyFile, passphrase);
-        providerRepository.setPrivateKey(privateKeyFile.toString());
-        providerRepository.setPassphrase(passphrase); // may be null
+    public int getPort() {
+        if (!sshServer.isStarted()) {
+            throw new IllegalStateException("SSH server is not started");
+        }
+        return sshServer.getPort();
     }
 
-    /** {@inheritDoc} */
-    public void initRepo() throws Exception {
-        GitScmTestUtils.initRepo("src/test/resources/repository/", 
getRepositoryRoot(), getWorkingDirectory());
-
+    public void start(Path repositoryRoot) throws IOException {
         GitLocationResolver gitLocationResolver = new GitLocationResolver() {
             @Override
             public Path resolveRootDirectory(String command, String[] args, 
ServerSession session, FileSystem fs)
                     throws IOException {
-                return getRepositoryRoot().getParentFile().toPath();
+                return repositoryRoot;
             }
         };
         sshServer.setCommandFactory(new 
GitPackCommandFactory(gitLocationResolver));
         sshServer.start();
-
-        // as checkout also already happens in setup() make sure to configure 
credentials here as well
-        configureCredentials(getScmRepository(), null);
-    }
-
-    @Override
-    public void removeRepo() throws Exception {
-        sshServer.stop();
-        super.removeRepo();
     }
 
-    @Override
-    @Test
-    public void testCheckOutCommandTest() throws Exception {
-        configureCredentials(getScmRepository(), null);
-        super.testCheckOutCommandTest();
-    }
-
-    @Test
-    public void testCheckOutCommandWithPassphraseTest() throws Exception {
-        // TODO: currently no easy way to pass passphrase in gitexe
-        Assume.assumeTrue(
-                "Ignore test with passphrase for provider " + 
getScmProvider(), "jgit".equals(getScmProvider()));
-        configureCredentials(getScmRepository(), "mySecret");
-        super.testCheckOutCommandTest();
+    public void stop() throws IOException {
+        if (sshServer != null) {
+            sshServer.stop(true);
+        }
     }
 }
diff --git 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/checkout/GitSshCheckOutCommandTckTest.java
 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/checkout/GitSshCheckOutCommandTckTest.java
index bdc65625c..6dbc88823 100644
--- 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/checkout/GitSshCheckOutCommandTckTest.java
+++ 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/checkout/GitSshCheckOutCommandTckTest.java
@@ -18,38 +18,14 @@
  */
 package org.apache.maven.scm.provider.git.command.checkout;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.nio.file.FileSystem;
-import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.attribute.PosixFilePermissions;
 import java.security.GeneralSecurityException;
-import java.security.KeyPair;
-import java.security.PublicKey;
-import java.util.ArrayList;
-import java.util.List;
 
 import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;
 import org.apache.maven.scm.provider.git.GitScmTestUtils;
+import org.apache.maven.scm.provider.git.GitSshServer;
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.tck.command.checkout.CheckOutCommandTckTest;
-import org.apache.sshd.common.config.keys.KeyUtils;
-import 
org.apache.sshd.common.config.keys.writer.openssh.OpenSSHKeyEncryptionContext;
-import 
org.apache.sshd.common.config.keys.writer.openssh.OpenSSHKeyPairResourceWriter;
-import org.apache.sshd.git.GitLocationResolver;
-import org.apache.sshd.git.pack.GitPackCommandFactory;
-import org.apache.sshd.server.SshServer;
-import org.apache.sshd.server.auth.pubkey.KeySetPublickeyAuthenticator;
-import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
-import org.apache.sshd.server.session.ServerSession;
-import org.apache.sshd.util.test.CommonTestSupportUtils;
-import org.apache.sshd.util.test.CoreTestSupportUtils;
-import org.bouncycastle.openssl.PKCS8Generator;
-import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
-import org.bouncycastle.openssl.jcajce.JcaPKCS8Generator;
-import org.bouncycastle.util.io.pem.PemObject;
 import org.junit.Assume;
 import org.junit.Rule;
 import org.junit.Test;
@@ -59,55 +35,20 @@
  *
  */
 public abstract class GitSshCheckOutCommandTckTest extends 
CheckOutCommandTckTest {
-    protected final SshServer sshServer;
-    protected final KeyPair keyPair;
-    protected final List<PublicKey> acceptedPublicKeys;
+    protected final GitSshServer gitSshServer;
 
     @Rule
     public TemporaryFolder tmpDirectory = new TemporaryFolder();
 
     protected GitSshCheckOutCommandTckTest() throws GeneralSecurityException {
-        sshServer = CoreTestSupportUtils.setupTestServer(getClass());
-        keyPair = 
CommonTestSupportUtils.generateKeyPair(KeyUtils.RSA_ALGORITHM, 2048);
-        acceptedPublicKeys = new ArrayList<>();
-        acceptedPublicKeys.add(keyPair.getPublic());
-        PublickeyAuthenticator authenticator = new 
KeySetPublickeyAuthenticator("onlykey", acceptedPublicKeys);
-        sshServer.setPublickeyAuthenticator(authenticator);
-    }
-
-    void writePrivateKeyAsPkcs8(Path file, String passphrase) throws 
IOException, GeneralSecurityException {
-        // encryption only optional
-        if (passphrase != null) {
-            // encryption with format outlined in 
https://dnaeon.github.io/openssh-private-key-binary-format/
-            OpenSSHKeyPairResourceWriter writer = new 
OpenSSHKeyPairResourceWriter();
-            OpenSSHKeyEncryptionContext context = new 
OpenSSHKeyEncryptionContext();
-            context.setCipherType("192");
-            context.setPassword(passphrase);
-            try (OutputStream output = Files.newOutputStream(file)) {
-                writer.writePrivateKey(keyPair, "comment", context, output);
-            }
-        } else {
-            // wrap unencrypted private key as regular PKCS8 private key
-            PKCS8Generator pkcs8Generator = new 
JcaPKCS8Generator(keyPair.getPrivate(), null);
-            PemObject pemObject = pkcs8Generator.generate();
-
-            try (Writer writer = Files.newBufferedWriter(file);
-                    JcaPEMWriter pw = new JcaPEMWriter(writer)) {
-                pw.writeObject(pemObject);
-            }
-        }
-
-        if 
(file.getFileSystem().supportedFileAttributeViews().contains("posix")) {
-            // must only be readable/writeable by me
-            Files.setPosixFilePermissions(file, 
PosixFilePermissions.fromString("rwx------"));
-        }
+        gitSshServer = new GitSshServer();
     }
 
     protected abstract String getScmProvider();
 
     /** {@inheritDoc} */
     public String getScmUrl() throws Exception {
-        return "scm:" + getScmProvider() + ":ssh://localhost:" + 
sshServer.getPort() + "/repository";
+        return "scm:" + getScmProvider() + ":ssh://localhost:" + 
gitSshServer.getPort() + "/repository";
     }
 
     public void configureCredentials(ScmRepository repository, String 
passphrase) throws Exception {
@@ -115,7 +56,7 @@ public void configureCredentials(ScmRepository repository, 
String passphrase) th
                 
ScmProviderRepositoryWithHost.class.cast(repository.getProviderRepository());
         // store as file
         Path privateKeyFile = tmpDirectory.newFile().toPath();
-        writePrivateKeyAsPkcs8(privateKeyFile, passphrase);
+        gitSshServer.writePrivateKeyAsPkcs8(privateKeyFile, passphrase);
         providerRepository.setPrivateKey(privateKeyFile.toString());
         providerRepository.setPassphrase(passphrase); // may be null
     }
@@ -123,16 +64,7 @@ public void configureCredentials(ScmRepository repository, 
String passphrase) th
     /** {@inheritDoc} */
     public void initRepo() throws Exception {
         GitScmTestUtils.initRepo("src/test/resources/repository/", 
getRepositoryRoot(), getWorkingDirectory());
-
-        GitLocationResolver gitLocationResolver = new GitLocationResolver() {
-            @Override
-            public Path resolveRootDirectory(String command, String[] args, 
ServerSession session, FileSystem fs)
-                    throws IOException {
-                return getRepositoryRoot().getParentFile().toPath();
-            }
-        };
-        sshServer.setCommandFactory(new 
GitPackCommandFactory(gitLocationResolver));
-        sshServer.start();
+        gitSshServer.start(getRepositoryRoot().getParentFile().toPath());
 
         // as checkout also already happens in setup() make sure to configure 
credentials here as well
         configureCredentials(getScmRepository(), null);
@@ -140,7 +72,7 @@ public Path resolveRootDirectory(String command, String[] 
args, ServerSession se
 
     @Override
     public void removeRepo() throws Exception {
-        sshServer.stop();
+        gitSshServer.stop();
         super.removeRepo();
     }
 
diff --git 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/tag/GitSshTagCommandTckTest.java
 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/tag/GitSshTagCommandTckTest.java
new file mode 100644
index 000000000..fb33f8cc5
--- /dev/null
+++ 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/tag/GitSshTagCommandTckTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.
+ */
+package org.apache.maven.scm.provider.git.command.tag;
+
+import java.nio.file.Path;
+import java.security.GeneralSecurityException;
+
+import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;
+import org.apache.maven.scm.provider.git.GitScmTestUtils;
+import org.apache.maven.scm.provider.git.GitSshServer;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.maven.scm.tck.command.tag.TagCommandTckTest;
+import org.junit.Assume;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+/**
+ *
+ */
+public abstract class GitSshTagCommandTckTest extends TagCommandTckTest {
+    protected final GitSshServer gitSshServer;
+
+    @Rule
+    public TemporaryFolder tmpDirectory = new TemporaryFolder();
+
+    protected GitSshTagCommandTckTest() throws GeneralSecurityException {
+        gitSshServer = new GitSshServer();
+    }
+
+    protected abstract String getScmProvider();
+
+    /** {@inheritDoc} */
+    public String getScmUrl() throws Exception {
+        return "scm:" + getScmProvider() + ":ssh://localhost:" + 
gitSshServer.getPort() + "/repository";
+    }
+
+    public void configureCredentials(ScmRepository repository, String 
passphrase) throws Exception {
+        ScmProviderRepositoryWithHost providerRepository =
+                
ScmProviderRepositoryWithHost.class.cast(repository.getProviderRepository());
+        // store as file
+        Path privateKeyFile = tmpDirectory.newFile().toPath();
+        gitSshServer.writePrivateKeyAsPkcs8(privateKeyFile, passphrase);
+        providerRepository.setPrivateKey(privateKeyFile.toString());
+        providerRepository.setPassphrase(passphrase); // may be null
+    }
+
+    /** {@inheritDoc} */
+    public void initRepo() throws Exception {
+        GitScmTestUtils.initRepo("src/test/resources/repository/", 
getRepositoryRoot(), getWorkingDirectory());
+        gitSshServer.start(getRepositoryRoot().getParentFile().toPath());
+
+        // as checkout also already happens in setup() make sure to configure 
credentials here as well
+        configureCredentials(getScmRepository(), null);
+    }
+
+    @Override
+    public void removeRepo() throws Exception {
+        gitSshServer.stop();
+        super.removeRepo();
+    }
+
+    @Test
+    public void testTagCommandTestWithPush() throws Exception {
+        configureCredentials(getScmRepository(), null);
+        getScmRepository().getProviderRepository().setPushChanges(true);
+        super.testTagCommandTest();
+    }
+
+    @Test
+    public void testTagCommandWithPassphraseAndPushTest() throws Exception {
+        // TODO: currently no easy way to pass passphrase in gitexe
+        Assume.assumeTrue(
+                "Ignore test with passphrase for provider " + 
getScmProvider(), "jgit".equals(getScmProvider()));
+        configureCredentials(getScmRepository(), "mySecret");
+        getScmRepository().getProviderRepository().setPushChanges(true);
+        super.testTagCommandTest();
+    }
+}
diff --git 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/test/java/org/apache/maven/scm/provider/git/jgit/command/checkout/JGitSshCheckOutCommandTckTest.java
 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/test/java/org/apache/maven/scm/provider/git/jgit/command/checkout/JGitSshCheckOutCommandTckTest.java
index 88caaa714..e114a4918 100644
--- 
a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/test/java/org/apache/maven/scm/provider/git/jgit/command/checkout/JGitSshCheckOutCommandTckTest.java
+++ 
b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/test/java/org/apache/maven/scm/provider/git/jgit/command/checkout/JGitSshCheckOutCommandTckTest.java
@@ -116,7 +116,7 @@ private void 
configureKeypairFromClasspathResource(ScmRepository repository, Str
             PublicKey publicKey = PublicKeyEntry.parsePublicKeyEntry(
                             IOUtils.toString(publicKeyInputStream, 
StandardCharsets.US_ASCII))
                     .resolvePublicKey(null, null, null);
-            acceptedPublicKeys.add(publicKey);
+            gitSshServer.addPublicKey(publicKey);
         }
         Path privateKeyFile = Files.createTempFile("privateKey", null);
         // private key into tmp file

Reply via email to