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");

Reply via email to