You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kw...@apache.org on 2025/08/05 09:41:01 UTC
(maven-release) 01/01: Add "serverId" and "privateKey" SCM parameters
This is an automated email from the ASF dual-hosted git repository.
kwin pushed a commit to branch feature/scm-id-parameter
in repository https://gitbox.apache.org/repos/asf/maven-release.git
commit f63dbfca124a755821e0642d443ad01a3a9e0aa4
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Tue Aug 5 11:40:46 2025 +0200
Add "serverId" and "privateKey" SCM parameters
Separate abstract classes for read and write SCM operation
This closes #1384
---
...seMojo.java => AbstractScmReadReleaseMojo.java} | 114 +++++++--------------
...o.java => AbstractScmReadWriteReleaseMojo.java} | 105 +------------------
.../maven/plugins/release/BranchReleaseMojo.java | 2 +-
.../maven/plugins/release/PerformReleaseMojo.java | 58 +----------
.../maven/plugins/release/PrepareReleaseMojo.java | 2 +-
.../maven/plugins/release/RollbackReleaseMojo.java | 2 +-
6 files changed, 47 insertions(+), 236 deletions(-)
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadReleaseMojo.java
similarity index 60%
copy from maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java
copy to maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadReleaseMojo.java
index d70306fd..0d801782 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadReleaseMojo.java
@@ -18,8 +18,7 @@
*/
package org.apache.maven.plugins.release;
-import javax.inject.Inject;
-
+import java.io.File;
import java.util.Map;
import org.apache.maven.artifact.ArtifactUtils;
@@ -33,83 +32,41 @@ import org.apache.maven.shared.release.ReleaseManager;
import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
/**
- * Abstract Mojo containing SCM parameters
- *
- * @author Robert Scholte
+ * Abstract Mojo containing SCM parameters for read operations.
*/
-// Extra layer since 2.4. Don't use @since doclet, these would be inherited by the subclasses
-public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
- /**
- * The SCM username to use.
- */
- @Parameter(property = "username")
- private String username;
-
- /**
- * The SCM password to use.
- */
- @Parameter(property = "password")
- private String password;
-
- /**
- * The SCM tag to use.
- */
- @Parameter(alias = "releaseLabel", property = "tag")
- private String tag;
-
- /**
- * Format to use when generating the tag name if none is specified. Property interpolation is performed on the
- * tag, but in order to ensure that the interpolation occurs during release, you must use <code>@{...}</code>
- * to reference the properties rather than <code>${...}</code>. The following properties are available:
- * <ul>
- * <li><code>groupId</code> or <code>project.groupId</code> - The groupId of the root project.
- * <li><code>artifactId</code> or <code>project.artifactId</code> - The artifactId of the root project.
- * <li><code>version</code> or <code>project.version</code> - The release version of the root project.
- * </ul>
- *
- * @since 2.2.0
- */
- @Parameter(defaultValue = "@{project.artifactId}-@{project.version}", property = "tagNameFormat")
- private String tagNameFormat;
-
- /**
- * The tag base directory in SVN, you must define it if you don't use the standard svn layout (trunk/tags/branches).
- * For example, <code>http://svn.apache.org/repos/asf/maven/plugins/tags</code>. The URL is an SVN URL and does not
- * include the SCM provider and protocol.
- */
- @Parameter(property = "tagBase")
- private String tagBase;
+public abstract class AbstractScmReadReleaseMojo extends AbstractReleaseMojo {
/**
- * The message prefix to use for all SCM changes.
- *
- * @since 2.0-beta-5
+ * The server id of the server which provides the credentials for the SCM in the <a href="https://maven.apache.org/settings.html">settings.xml</a> file.
+ * If not set the default lookup uses the SCM URL to construct the server id like this:
+ * {@code server-id=scm-host[":"scm-port]}.
+ * <p>
+ * Currently the POM does not allow to specify a server id for the SCM section.
+ * <p>
+ * Explicit authentication information provided via {@link #username}, {@link #password} or {@link #privateKey} will take precedence.
+ * @since 3.2.0
*/
- @Parameter(defaultValue = "[maven-release-plugin] ", property = "scmCommentPrefix")
- private String scmCommentPrefix;
+ @Parameter(property = "project.scm.id", defaultValue = "${project.scm.id}")
+ private String serverId;
/**
- * When cloning a repository if it should be a shallow clone or a full clone.
+ * The username to use for authentication with the SCM.
*/
- @Parameter(defaultValue = "true", property = "scmShallowClone")
- private boolean scmShallowClone = true;
+ @Parameter(property = "username")
+ private String username;
/**
- * Implemented with git will or not push changes to the upstream repository.
- * <code>true</code> by default to preserve backward compatibility.
- * @since 2.1
+ * The password to use for authentication with the SCM.
*/
- @Parameter(defaultValue = "true", property = "pushChanges")
- private boolean pushChanges = true;
+ @Parameter(property = "password")
+ private String password;
/**
- * A workItem for SCMs like RTC, TFS etc, that may require additional
- * information to perform a pushChange operation.
- *
- * @since 3.0.0-M5
+ * The path to the SSH private key to use for authentication with the SCM.
+ * @since 3.2.0
*/
- @Parameter(property = "workItem")
- private String workItem;
+ @Parameter(property = "privateKey")
+ private File privateKey;
/**
* Add a new or overwrite the default implementation per provider.
@@ -122,13 +79,18 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
@Parameter
private Map<String, String> providerImplementations;
+ /**
+ * When cloning a repository if it should be a shallow clone or a full clone.
+ */
+ @Parameter(defaultValue = "true", property = "scmShallowClone")
+ private boolean scmShallowClone = true;
+
/**
* The SCM manager.
*/
private final ScmManager scmManager;
- @Inject
- protected AbstractScmReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
+ protected AbstractScmReadReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
super(releaseManager);
this.scmManager = scmManager;
}
@@ -148,17 +110,13 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
protected ReleaseDescriptorBuilder createReleaseDescriptor() {
ReleaseDescriptorBuilder descriptor = super.createReleaseDescriptor();
+ if (privateKey != null) {
+ descriptor.setScmPrivateKey(privateKey.getAbsolutePath());
+ }
descriptor.setScmPassword(password);
- descriptor.setScmReleaseLabel(tag);
- descriptor.setScmTagNameFormat(tagNameFormat);
- descriptor.setScmTagBase(tagBase);
descriptor.setScmUsername(username);
- descriptor.setScmCommentPrefix(scmCommentPrefix);
descriptor.setScmShallowClone(scmShallowClone);
- descriptor.setPushChanges(pushChanges);
- descriptor.setWorkItem(workItem);
-
if (project.getScm() != null) {
if (project.getScm().getDeveloperConnection() != null) {
descriptor.setScmSourceUrl(project.getScm().getDeveloperConnection());
@@ -167,11 +125,11 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
}
}
- // As long as Scm.getId() does not exist, read it as a property
- descriptor.setScmId(project.getProperties().getProperty("project.scm.id"));
+ descriptor.setScmId(serverId);
for (MavenProject reactorProject : session.getProjects()) {
- if (reactorProject.getScm() != null) {
+ if (reactorProject.getOriginalModel() != null
+ && reactorProject.getOriginalModel().getScm() != null) {
String projectId =
ArtifactUtils.versionlessKey(reactorProject.getGroupId(), reactorProject.getArtifactId());
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadWriteReleaseMojo.java
similarity index 50%
rename from maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java
rename to maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadWriteReleaseMojo.java
index d70306fd..402f14c1 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadWriteReleaseMojo.java
@@ -20,37 +20,18 @@ package org.apache.maven.plugins.release;
import javax.inject.Inject;
-import java.util.Map;
-
-import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.model.Scm;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.MavenProject;
import org.apache.maven.scm.manager.ScmManager;
import org.apache.maven.shared.release.ReleaseManager;
import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
/**
- * Abstract Mojo containing SCM parameters
+ * Abstract Mojo containing SCM parameters for read/write operations.
*
* @author Robert Scholte
*/
// Extra layer since 2.4. Don't use @since doclet, these would be inherited by the subclasses
-public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
- /**
- * The SCM username to use.
- */
- @Parameter(property = "username")
- private String username;
-
- /**
- * The SCM password to use.
- */
- @Parameter(property = "password")
- private String password;
-
+public abstract class AbstractScmReadWriteReleaseMojo extends AbstractScmReadReleaseMojo {
/**
* The SCM tag to use.
*/
@@ -88,12 +69,6 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
@Parameter(defaultValue = "[maven-release-plugin] ", property = "scmCommentPrefix")
private String scmCommentPrefix;
- /**
- * When cloning a repository if it should be a shallow clone or a full clone.
- */
- @Parameter(defaultValue = "true", property = "scmShallowClone")
- private boolean scmShallowClone = true;
-
/**
* Implemented with git will or not push changes to the upstream repository.
* <code>true</code> by default to preserve backward compatibility.
@@ -111,94 +86,24 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
@Parameter(property = "workItem")
private String workItem;
- /**
- * Add a new or overwrite the default implementation per provider.
- * The key is the scm prefix and the value is the role hint of the
- * {@link org.apache.maven.scm.provider.ScmProvider}.
- *
- * @since 2.0-beta-6
- * @see ScmManager#setScmProviderImplementation(String, String)
- */
- @Parameter
- private Map<String, String> providerImplementations;
-
- /**
- * The SCM manager.
- */
- private final ScmManager scmManager;
-
@Inject
- protected AbstractScmReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
- super(releaseManager);
- this.scmManager = scmManager;
- }
-
- @Override
- public void execute() throws MojoExecutionException, MojoFailureException {
- if (providerImplementations != null) {
- for (Map.Entry<String, String> providerEntry : providerImplementations.entrySet()) {
- getLog().info("Change the default '" + providerEntry.getKey() + "' provider implementation to '"
- + providerEntry.getValue() + "'.");
- scmManager.setScmProviderImplementation(providerEntry.getKey(), providerEntry.getValue());
- }
- }
+ protected AbstractScmReadWriteReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
+ super(releaseManager, scmManager);
}
@Override
protected ReleaseDescriptorBuilder createReleaseDescriptor() {
ReleaseDescriptorBuilder descriptor = super.createReleaseDescriptor();
- descriptor.setScmPassword(password);
+ // extend the descriptor with SCM parameter relevant for write operations
descriptor.setScmReleaseLabel(tag);
descriptor.setScmTagNameFormat(tagNameFormat);
descriptor.setScmTagBase(tagBase);
- descriptor.setScmUsername(username);
descriptor.setScmCommentPrefix(scmCommentPrefix);
- descriptor.setScmShallowClone(scmShallowClone);
descriptor.setPushChanges(pushChanges);
descriptor.setWorkItem(workItem);
- if (project.getScm() != null) {
- if (project.getScm().getDeveloperConnection() != null) {
- descriptor.setScmSourceUrl(project.getScm().getDeveloperConnection());
- } else if (project.getScm().getConnection() != null) {
- descriptor.setScmSourceUrl(project.getScm().getConnection());
- }
- }
-
- // As long as Scm.getId() does not exist, read it as a property
- descriptor.setScmId(project.getProperties().getProperty("project.scm.id"));
-
- for (MavenProject reactorProject : session.getProjects()) {
- if (reactorProject.getScm() != null) {
- String projectId =
- ArtifactUtils.versionlessKey(reactorProject.getGroupId(), reactorProject.getArtifactId());
-
- descriptor.addOriginalScmInfo(projectId, buildScm(reactorProject));
- }
- }
-
return descriptor;
}
-
- /**
- * <p>buildScm.</p>
- *
- * @param project a {@link org.apache.maven.project.MavenProject} object
- * @return a {@link org.apache.maven.model.Scm} object
- */
- protected Scm buildScm(MavenProject project) {
- Scm scm;
- if (project.getOriginalModel().getScm() == null) {
- scm = null;
- } else {
- scm = new Scm();
- scm.setConnection(project.getOriginalModel().getScm().getConnection());
- scm.setDeveloperConnection(project.getOriginalModel().getScm().getDeveloperConnection());
- scm.setTag(project.getOriginalModel().getScm().getTag());
- scm.setUrl(project.getOriginalModel().getScm().getUrl());
- }
- return scm;
- }
}
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java
index 01124b3c..f0af488f 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java
@@ -44,7 +44,7 @@ import org.codehaus.plexus.configuration.PlexusConfiguration;
* @since 2.0-beta-6
*/
@Mojo(name = "branch", aggregator = true)
-public class BranchReleaseMojo extends AbstractScmReleaseMojo {
+public class BranchReleaseMojo extends AbstractScmReadWriteReleaseMojo {
/**
* The branch name to use.
*
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java
index 9bb00d23..dc4076f8 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java
@@ -21,7 +21,6 @@ package org.apache.maven.plugins.release;
import javax.inject.Inject;
import java.io.File;
-import java.util.Map;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
@@ -46,7 +45,7 @@ import org.codehaus.plexus.util.StringUtils;
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
*/
@Mojo(name = "perform", aggregator = true, requiresProject = false)
-public class PerformReleaseMojo extends AbstractReleaseMojo {
+public class PerformReleaseMojo extends AbstractScmReadReleaseMojo {
/**
* A space separated list of goals to execute on release perform. Default value is either <code>deploy</code> or
* <code>deploy site-deploy</code>, if the project has a <distributionManagement>/<site> element.
@@ -87,24 +86,6 @@ public class PerformReleaseMojo extends AbstractReleaseMojo {
@Parameter(defaultValue = "false", property = "localCheckout")
private boolean localCheckout;
- /**
- * The SCM username to use.
- */
- @Parameter(property = "username")
- private String username;
-
- /**
- * The SCM password to use.
- */
- @Parameter(property = "password")
- private String password;
-
- /**
- * When cloning a repository if it should be a shallow clone or a full clone.
- */
- @Parameter(defaultValue = "true", property = "scmShallowClone")
- private boolean scmShallowClone = true;
-
/**
* Whether to use the default release profile (Maven 2 and 3) that adds sources and javadocs to the released
* artifact, if appropriate. If set to true, the release plugin sets the property "<code>performRelease</code>" to
@@ -124,26 +105,9 @@ public class PerformReleaseMojo extends AbstractReleaseMojo {
@Parameter(defaultValue = "false", property = "dryRun")
private boolean dryRun;
- /**
- * Add a new or overwrite the default implementation per provider.
- * The key is the scm prefix and the value is the role hint of the
- * {@link org.apache.maven.scm.provider.ScmProvider}.
- *
- * @since 2.5.3
- * @see ScmManager#setScmProviderImplementation(String, String)
- */
- @Parameter
- private Map<String, String> providerImplementations;
-
- /**
- * The SCM manager.
- */
- private final ScmManager scmManager;
-
@Inject
public PerformReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
- super(releaseManager);
- this.scmManager = scmManager;
+ super(releaseManager, scmManager);
}
@Override
@@ -153,13 +117,7 @@ public class PerformReleaseMojo extends AbstractReleaseMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
- if (providerImplementations != null) {
- for (Map.Entry<String, String> providerEntry : providerImplementations.entrySet()) {
- getLog().info("Change the default '" + providerEntry.getKey() + "' provider implementation to '"
- + providerEntry.getValue() + "'.");
- scmManager.setScmProviderImplementation(providerEntry.getKey(), providerEntry.getValue());
- }
- }
+ super.execute();
// goals may be split into multiple lines in configuration.
// Let's build a single line command
@@ -175,16 +133,6 @@ public class PerformReleaseMojo extends AbstractReleaseMojo {
releaseDescriptor.setScmSourceUrl(connectionUrl);
}
- if (username != null) {
- releaseDescriptor.setScmUsername(username);
- }
-
- if (password != null) {
- releaseDescriptor.setScmPassword(password);
- }
-
- releaseDescriptor.setScmShallowClone(scmShallowClone);
-
releaseDescriptor.setLocalCheckout(localCheckout);
releaseDescriptor.setCheckoutDirectory(workingDirectory.getAbsolutePath());
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
index eef995f6..5e21da6e 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
@@ -53,7 +53,7 @@ import org.codehaus.plexus.configuration.PlexusConfiguration;
*/
// TODO [!] check how this works with version ranges
@Mojo(name = "prepare", aggregator = true, requiresDependencyCollection = ResolutionScope.TEST)
-public class PrepareReleaseMojo extends AbstractScmReleaseMojo {
+public class PrepareReleaseMojo extends AbstractScmReadWriteReleaseMojo {
/**
* Resume a previous release attempt from the point where it was stopped.
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java
index 2eb609f4..8e3586ab 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java
@@ -42,7 +42,7 @@ import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
* @author Edwin Punzalan
*/
@Mojo(name = "rollback", aggregator = true)
-public class RollbackReleaseMojo extends AbstractScmReleaseMojo {
+public class RollbackReleaseMojo extends AbstractScmReadWriteReleaseMojo {
/**
* The SCM commit comment when rolling back.