This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch release-manager
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/release-manager by this push:
new c09f0e6bc5 Fix Javadoc links and SonarQube findings; add SvnArgs
constants
c09f0e6bc5 is described below
commit c09f0e6bc5b1e6baafb13b2e20c9471508b67d18
Author: James Bognar <[email protected]>
AuthorDate: Sun Aug 16 11:14:18 2026 -0400
Fix Javadoc links and SonarQube findings; add SvnArgs constants
- Repoint stale NexusStagingClient {@link} Javadoc to the real create(...)
factory overloads.
- Replace assertTrue(...equals...) with assertEquals in
BinaryArtifactsStageStepTest (java:S5785).
- Reuse the existing LOG_STEP_ID constant in DropRcService (java:S1192).
- Refactor DistPromoteStep.priorReleaseOnLine() to remove multiple continue
statements (java:S135).
- Extract svn --username / --password-from-stdin flags into a new
util/SvnArgs constants holder, reused across DistPromoteStep,
BinaryArtifactsStageStep, DropRcService, DevDistVerifyStep (java:S1192).
---
.../apache/juneau/releng/engine/DropRcService.java | 11 ++++---
.../engine/steps/BinaryArtifactsStageStep.java | 8 ++---
.../releng/engine/steps/DevDistVerifyStep.java | 3 +-
.../releng/engine/steps/DistPromoteStep.java | 19 ++++++------
.../juneau/releng/nexus/NexusStagingClient.java | 5 +--
.../org/apache/juneau/releng/util/SvnArgs.java | 36 ++++++++++++++++++++++
.../engine/steps/BinaryArtifactsStageStepTest.java | 4 +--
7 files changed, 62 insertions(+), 24 deletions(-)
diff --git a/src/main/java/org/apache/juneau/releng/engine/DropRcService.java
b/src/main/java/org/apache/juneau/releng/engine/DropRcService.java
index 082f7b1662..f2f1c9c577 100644
--- a/src/main/java/org/apache/juneau/releng/engine/DropRcService.java
+++ b/src/main/java/org/apache/juneau/releng/engine/DropRcService.java
@@ -32,6 +32,7 @@ import org.apache.juneau.releng.log.LogBroadcaster;
import org.apache.juneau.releng.log.RunLog;
import org.apache.juneau.releng.nexus.NexusStagingClient;
import org.apache.juneau.releng.util.ProcessRunner;
+import org.apache.juneau.releng.util.SvnArgs;
/** The one coarse Drop-RC action: drop remote state, bump RC, reset from
workspace-setup. */
public class DropRcService {
@@ -104,7 +105,7 @@ public class DropRcService {
public Preview preview(String version) {
var rs = store.load(version).orElseThrow();
var tag = "juneau-" + rs.version + "-RC" + rs.rc;
- var p = new Preview("drop-rc", true);
+ var p = new Preview(LOG_STEP_ID, true);
p.line("Drop Nexus staging repo: " + rs.nexusRepoId);
p.line("svn rm dist/dev/juneau/{source,binaries}/" + tag);
p.line("Delete tag " + tag + " (local + remote)");
@@ -132,12 +133,12 @@ public class DropRcService {
}
// b) svn checkout dist/dev, rm the rejected RC's directories,
commit
var dist = stateDir.resolve("dist");
- tierB(List.of("svn", "checkout", "--username", availid.get(),
"--password-from-stdin", target.distDevBase(),
- dist.toString()), pw + "\n", Map.of(), log);
+ tierB(List.of("svn", "checkout", SvnArgs.USERNAME,
availid.get(), SvnArgs.PASSWORD_FROM_STDIN,
+ target.distDevBase(), dist.toString()), pw +
"\n", Map.of(), log);
tierB(List.of("svn", "rm",
dist.resolve("source").resolve(tag).toString()), null, null, log);
tierB(List.of("svn", "rm",
dist.resolve("binaries").resolve(tag).toString()), null, null, log);
- tierB(List.of("svn", "commit", dist.toString(), "-m", "Drop " +
tag, "--username", availid.get(),
- "--password-from-stdin"), pw + "\n", Map.of(),
log);
+ tierB(List.of("svn", "commit", dist.toString(), "-m", "Drop " +
tag, SvnArgs.USERNAME, availid.get(),
+ SvnArgs.PASSWORD_FROM_STDIN), pw + "\n",
Map.of(), log);
// c) delete tag local + remote
tierB(List.of("git", "-C", git, "tag", "-d", tag), null, null,
log);
tierB(List.of("git", "-C", git, "push", "origin", ":refs/tags/"
+ tag), null, null, log);
diff --git
a/src/main/java/org/apache/juneau/releng/engine/steps/BinaryArtifactsStageStep.java
b/src/main/java/org/apache/juneau/releng/engine/steps/BinaryArtifactsStageStep.java
index c9de33c764..3876db97a2 100644
---
a/src/main/java/org/apache/juneau/releng/engine/steps/BinaryArtifactsStageStep.java
+++
b/src/main/java/org/apache/juneau/releng/engine/steps/BinaryArtifactsStageStep.java
@@ -29,6 +29,7 @@ import org.apache.juneau.releng.engine.Preview;
import org.apache.juneau.releng.engine.ReleaseStep;
import org.apache.juneau.releng.engine.StepContext;
import org.apache.juneau.releng.engine.StepResult;
+import org.apache.juneau.releng.util.SvnArgs;
/** §5.12 binary-artifacts-stage: pull signed artifacts, rename to ASF
convention, commit to dist/dev SVN. Mutating. */
public class BinaryArtifactsStageStep implements ReleaseStep {
@@ -66,7 +67,7 @@ public class BinaryArtifactsStageStep implements ReleaseStep {
var pw = ctx.ldapPassword + "\n";
// svn auth: --username <availid> --password-from-stdin
(passphrase via stdin, never argv).
- var co = ctx.dryRunOr(List.of("svn", "checkout", "--username",
ctx.availid, "--password-from-stdin",
+ var co = ctx.dryRunOr(List.of("svn", "checkout",
SvnArgs.USERNAME, ctx.availid, SvnArgs.PASSWORD_FROM_STDIN,
ctx.target.distDevBase(), dist.toString()), pw,
null);
if (!co.ok())
return StepResult.fail("svn checkout of dist/dev
failed.");
@@ -96,9 +97,8 @@ public class BinaryArtifactsStageStep implements ReleaseStep {
ctx.dryRunOr(List.of("svn", "add", sourceRc.toString()));
ctx.dryRunOr(List.of("svn", "add", binariesRc.toString()));
- var commit = ctx.dryRunOr(
- List.of("svn", "commit", dist.toString(), "-m",
rc, "--username", ctx.availid, "--password-from-stdin"),
- pw, Map.of());
+ var commit = ctx.dryRunOr(List.of("svn", "commit",
dist.toString(), "-m", rc, SvnArgs.USERNAME, ctx.availid,
+ SvnArgs.PASSWORD_FROM_STDIN), pw, Map.of());
return commit.ok() ? StepResult.ok("Artifacts staged +
committed to dist/dev.")
: StepResult.fail("svn commit to dist/dev
failed.");
}
diff --git
a/src/main/java/org/apache/juneau/releng/engine/steps/DevDistVerifyStep.java
b/src/main/java/org/apache/juneau/releng/engine/steps/DevDistVerifyStep.java
index 4309d247a1..3d27078094 100644
--- a/src/main/java/org/apache/juneau/releng/engine/steps/DevDistVerifyStep.java
+++ b/src/main/java/org/apache/juneau/releng/engine/steps/DevDistVerifyStep.java
@@ -25,6 +25,7 @@ import org.apache.juneau.releng.engine.Preview;
import org.apache.juneau.releng.engine.ReleaseStep;
import org.apache.juneau.releng.engine.StepContext;
import org.apache.juneau.releng.engine.StepResult;
+import org.apache.juneau.releng.util.SvnArgs;
/** §5.13 dev-dist-verify: confirm the 6 expected files present + non-empty;
open dist URL for spot-check. */
public class DevDistVerifyStep implements ReleaseStep {
@@ -78,7 +79,7 @@ public class DevDistVerifyStep implements ReleaseStep {
private List<String> missingOrEmptyFiles(StepContext ctx) {
var rc = "juneau-" + ctx.run.version + "-RC" + ctx.run.rc;
var dist = ctx.stateDir.resolve("dist");
- ctx.dryRunOr(List.of("svn", "checkout", "--username",
ctx.availid, "--password-from-stdin",
+ ctx.dryRunOr(List.of("svn", "checkout", SvnArgs.USERNAME,
ctx.availid, SvnArgs.PASSWORD_FROM_STDIN,
ctx.target.distDevBase(), dist.toString()),
ctx.ldapPassword + "\n", null);
var missing = new ArrayList<String>();
diff --git
a/src/main/java/org/apache/juneau/releng/engine/steps/DistPromoteStep.java
b/src/main/java/org/apache/juneau/releng/engine/steps/DistPromoteStep.java
index 8a0cf10e7a..ee11e77695 100644
--- a/src/main/java/org/apache/juneau/releng/engine/steps/DistPromoteStep.java
+++ b/src/main/java/org/apache/juneau/releng/engine/steps/DistPromoteStep.java
@@ -24,6 +24,7 @@ import org.apache.juneau.releng.engine.ReleaseStep;
import org.apache.juneau.releng.engine.StepContext;
import org.apache.juneau.releng.engine.StepResult;
import org.apache.juneau.releng.release.ReleaseVersion;
+import org.apache.juneau.releng.util.SvnArgs;
/** §5.19 dist-promote: svn move dist/dev -> dist/release/<version>; remove
prior release on the line. Mutating. */
public class DistPromoteStep implements ReleaseStep {
@@ -66,12 +67,12 @@ public class DistPromoteStep implements ReleaseStep {
var release = ctx.stateDir.resolve("dist-release");
var pw = ctx.ldapPassword + "\n";
- var coDev = ctx.dryRunOr(List.of("svn", "checkout",
"--username", ctx.availid, "--password-from-stdin",
- ctx.target.distDevBase(), dev.toString()), pw,
null);
+ var coDev = ctx.dryRunOr(List.of("svn", "checkout",
SvnArgs.USERNAME, ctx.availid,
+ SvnArgs.PASSWORD_FROM_STDIN,
ctx.target.distDevBase(), dev.toString()), pw, null);
if (!coDev.ok())
return StepResult.fail("svn checkout of dist/dev
failed.");
- var coRelease = ctx.dryRunOr(List.of("svn", "checkout",
"--username", ctx.availid, "--password-from-stdin",
- ctx.target.distReleaseBase(),
release.toString()), pw, null);
+ var coRelease = ctx.dryRunOr(List.of("svn", "checkout",
SvnArgs.USERNAME, ctx.availid,
+ SvnArgs.PASSWORD_FROM_STDIN,
ctx.target.distReleaseBase(), release.toString()), pw, null);
if (!coRelease.ok())
return StepResult.fail("svn checkout of dist/release
failed.");
@@ -93,7 +94,8 @@ public class DistPromoteStep implements ReleaseStep {
ctx.dryRunOr(List.of("svn", "rm",
release.resolve(prior).toString()));
var commit = ctx.dryRunOr(List.of("svn", "commit",
dev.toString(), release.toString(), "-m",
- "Apache Juneau " + version, "--username",
ctx.availid, "--password-from-stdin"), pw, Map.of());
+ "Apache Juneau " + version, SvnArgs.USERNAME,
ctx.availid, SvnArgs.PASSWORD_FROM_STDIN), pw,
+ Map.of());
return commit.ok() ? StepResult.ok("Promoted to dist/release.")
: StepResult.fail("svn promote failed.");
}
@@ -104,11 +106,8 @@ public class DistPromoteStep implements ReleaseStep {
ReleaseVersion best = null;
for (var t : tags) {
var v = ReleaseVersion.ofTag(t);
- if (v.isPrerelease() || v.major() != target.major() ||
v.minor() != target.minor())
- continue;
- if (v.compareTo(target) >= 0)
- continue;
- if (best == null || v.compareTo(best) > 0)
+ var onSameLine = !v.isPrerelease() && v.major() ==
target.major() && v.minor() == target.minor();
+ if (onSameLine && v.compareTo(target) < 0 && (best ==
null || v.compareTo(best) > 0))
best = v;
}
return best == null ? null : best.version();
diff --git
a/src/main/java/org/apache/juneau/releng/nexus/NexusStagingClient.java
b/src/main/java/org/apache/juneau/releng/nexus/NexusStagingClient.java
index ad65183f04..6885feaa1d 100644
--- a/src/main/java/org/apache/juneau/releng/nexus/NexusStagingClient.java
+++ b/src/main/java/org/apache/juneau/releng/nexus/NexusStagingClient.java
@@ -34,8 +34,9 @@ import org.apache.juneau.marshall.marshaller.Json;
/**
* In-process HTTPS client for the Apache Nexus staging suite. No CLI, no argv
exposure — Basic auth built
* in-process, normally from the committer's Keychain-backed Apache LDAP
credentials (see
- * {@link #create(String, String)}), falling back to {@code
~/.m2/settings.xml}'s {@code apache.releases.https}
- * server entry (see {@link #create(String)}) only when that Keychain entry is
absent.
+ * {@link #create(String, String, String, String)}), falling back to {@code
~/.m2/settings.xml}'s
+ * {@code apache.releases.https} server entry (see {@link #create(String,
String, String)}) only when that
+ * Keychain entry is absent.
*/
public class NexusStagingClient {
diff --git a/src/main/java/org/apache/juneau/releng/util/SvnArgs.java
b/src/main/java/org/apache/juneau/releng/util/SvnArgs.java
new file mode 100644
index 0000000000..9343cfff31
--- /dev/null
+++ b/src/main/java/org/apache/juneau/releng/util/SvnArgs.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.juneau.releng.util;
+
+/**
+ * Shared {@code svn} CLI flag literals for the credential-passing convention
every svn-invoking step
+ * follows: the Apache LDAP availid goes on argv via {@link #USERNAME}, while
the password is piped through
+ * stdin via {@link #PASSWORD_FROM_STDIN} so it never appears on argv (visible
in {@code ps}, shell history,
+ * or logs).
+ */
+public final class SvnArgs {
+
+ /** {@code svn} flag introducing the Apache LDAP availid that follows
it on argv. */
+ public static final String USERNAME = "--username";
+
+ /** {@code svn} flag directing svn to read the password from stdin
instead of argv. */
+ public static final String PASSWORD_FROM_STDIN =
"--password-from-stdin";
+
+ private SvnArgs() {
+ }
+}
diff --git
a/src/test/java/org/apache/juneau/releng/engine/steps/BinaryArtifactsStageStepTest.java
b/src/test/java/org/apache/juneau/releng/engine/steps/BinaryArtifactsStageStepTest.java
index 83868c5c36..ba57608bc0 100644
---
a/src/test/java/org/apache/juneau/releng/engine/steps/BinaryArtifactsStageStepTest.java
+++
b/src/test/java/org/apache/juneau/releng/engine/steps/BinaryArtifactsStageStepTest.java
@@ -119,8 +119,8 @@ class BinaryArtifactsStageStepTest {
var gpgCalls = calls.stream().filter(x ->
x.contains("gpg")).toList();
assertEquals(2, gpgCalls.size());
- assertTrue(gpgCalls.get(0).equals(
- List.of("gpg", "--print-md", "SHA512", dist +
"/source/" + rc + "/apache-juneau-9.2.1-src.zip")));
+ assertEquals(List.of("gpg", "--print-md", "SHA512", dist +
"/source/" + rc + "/apache-juneau-9.2.1-src.zip"),
+ gpgCalls.get(0));
// gpg --print-md SHA512 output is written to the .sha512 file
(ProcessRunner has no shell redirect).
var shaFile =
dist.resolve("source").resolve(rc).resolve("apache-juneau-9.2.1-src.zip.sha512");