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