This is an automated email from the ASF dual-hosted git repository.
janhoy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new c9c87d78368 SOLR-18515: Preserve hyphenated picocli command names in
generated CLI docs (#5068)
c9c87d78368 is described below
commit c9c87d7836856ab1df01f9de50f2edb581b7535e
Author: Jalaz Kumar <[email protected]>
AuthorDate: Thu Oct 15 22:15:44 2026 +0530
SOLR-18515: Preserve hyphenated picocli command names in generated CLI docs
(#5068)
---
solr/solr-ref-guide/build.gradle | 60 ++++++++++++----------
.../modules/deployment-guide/deployment-nav.adoc | 10 ++--
.../modules/deployment-guide/pages/cli/index.adoc | 10 ++--
.../pages/cli/solr-package-add-key.adoc | 2 +-
.../pages/cli/solr-package-add-repo.adoc | 2 +-
.../pages/cli/solr-package-list-available.adoc | 2 +-
.../pages/cli/solr-package-list-deployed.adoc | 2 +-
.../pages/cli/solr-package-list-installed.adoc | 2 +-
8 files changed, 48 insertions(+), 42 deletions(-)
diff --git a/solr/solr-ref-guide/build.gradle b/solr/solr-ref-guide/build.gradle
index 80ee1136386..c84ce7c4b10 100644
--- a/solr/solr-ref-guide/build.gradle
+++ b/solr/solr-ref-guide/build.gradle
@@ -609,16 +609,28 @@ def DO_NOT_EDIT_NOTICE = """\
"""
// Convert a generated filename stem (e.g. "solr-zk-ls") to an Antora page
title
-// e.g. "solr-zk-ls" -> "bin/solr zk ls"
-String cliFileNameToTitle(String baseName) {
- def parts = baseName.split('-')
- return "bin/solr " + parts.drop(1).join(' ')
-}
-
-// Return the short nav label for a command file (last segment of
dash-separated name)
-// e.g. "solr-zk-ls" -> "ls"
-String cliFileNameToNavLabel(String baseName) {
- return baseName.split('-').last()
+// A dash separated commands only when that prefix is itself a generated page,
+// so a hyphen inside the leaf name is kept
+// e.g. "solr-zk-ls" -> "bin/solr zk ls". "solr-package-add-key" -> "bin/solr
package add-key"
+String cliFileNameToTitle(String baseName, Set stems) {
+ return "bin/solr " + cliCommandPath(baseName, stems).join(' ')
+}
+
+// Tokens of the title after "solr". That last token is the nav label.
+// e.g. "solr-zk-ls" -> [zk, ls], "solr-package-add-key" -> [package, add-key]
+List<String> cliCommandPath(String baseName, Set stems) {
+ def cuts = [baseName.indexOf('-')]
+ for (def i = baseName.indexOf('-', cuts[0] + 1); i >= 0; i =
baseName.indexOf('-', i + 1)) {
+ if (stems.contains(baseName.substring(0, i))) {
+ cuts.add(i)
+ }
+ }
+ cuts.add(baseName.length())
+ def segments = []
+ for (def c = 0; c < cuts.size() - 1; c++) {
+ segments.add(baseName.substring(cuts[c] + 1, cuts[c + 1]))
+ }
+ return segments
}
// Strip "[...]" (optional groups) and "(...)" (required groups whose members
@@ -707,10 +719,10 @@ String markRequiredOptionsAndArgs(String content) {
// Post-process a raw ManPageGenerator AsciiDoc file for Antora compatibility.
// The title lives inside the man-section-header block, so we replace the whole
// header block with an Antora-compatible page title + attributes.
-String postProcessCliManPage(File rawFile, String asfHeader, String
doNotEditNotice, String experimentalNotice) {
+String postProcessCliManPage(File rawFile, Set stems, String asfHeader, String
doNotEditNotice, String experimentalNotice) {
def content = rawFile.text
def baseName = rawFile.name.replace('.adoc', '')
- def newTitle = cliFileNameToTitle(baseName)
+ def newTitle = cliFileNameToTitle(baseName, stems)
// Replace the entire man-section-header block (which contains
:doctype:manpage, the page title
// "= solr-start(1)", etc.) with our Antora-compatible title and page
attributes.
@@ -776,9 +788,10 @@ String buildCliCommandTable(File cliDir) {
def files = ((cliDir.listFiles() ?: []) as List<File>)
.findAll { it.name.startsWith('solr-') && it.name.endsWith('.adoc') }
.sort { it.name }
+ def stems = files.collect { it.name.replace('.adoc', '') } as Set
def rows = files.collect { file ->
def baseName = file.name.replace('.adoc', '')
- "|xref:cli/${file.name}[${cliFileNameToTitle(baseName)}]"
+ "|xref:cli/${file.name}[${cliFileNameToTitle(baseName, stems)}]"
}
return "[cols=\"1\",options=\"header\"]\n|===\n|Command\n\n" +
rows.join('\n') + "\n|==="
}
@@ -792,18 +805,9 @@ List<String> buildCliNavEntries(File cliDir) {
.sort { (it.name.replace('.adoc', '') + '\u0000') }
def stems = files.collect { it.name.replace('.adoc', '') } as Set
return files.collect { file ->
- def baseName = file.name.replace('.adoc', '')
- def label = cliFileNameToNavLabel(baseName)
- // Nest under the deepest ancestor that is itself a generated page.
Counting dashes instead
- // would mis-nest a command whose own name contains one, e.g. a future
"snapshot-create"
- // would be filed under a "solr-snapshot" page that does not exist.
- def depth = 0
- for (def stem = baseName; stem.contains('-'); ) {
- stem = stem.substring(0, stem.lastIndexOf('-'))
- if (stems.contains(stem)) {
- depth++
- }
- }
+ def path = cliCommandPath(file.name.replace('.adoc', ''), stems)
+ def label = path.last()
+ def depth = path.size() - 1
// Generated pages hang off cli/index.adoc, which itself sits under the
control script page,
// so the shallowest generated page is already three levels deep.
def stars = '*' * (depth + 3)
@@ -855,9 +859,10 @@ task generateCliDocs {
destDir.mkdirs()
def rawFiles = runManPageGenerator(rawOutputDir)
+ def stems = rawFiles.collect { it.name.replace('.adoc', '') } as Set
rawFiles.each { rawFile ->
- def processed = postProcessCliManPage(rawFile, ASF_LICENSE_HEADER,
DO_NOT_EDIT_NOTICE, EXPERIMENTAL_NOTICE)
+ def processed = postProcessCliManPage(rawFile, stems,
ASF_LICENSE_HEADER, DO_NOT_EDIT_NOTICE, EXPERIMENTAL_NOTICE)
new File(destDir, rawFile.name).text = processed
}
@@ -910,10 +915,11 @@ task checkCliDocsUpToDate {
rawOutputDir.mkdirs()
def rawFiles = runManPageGenerator(rawOutputDir)
+ def stems = rawFiles.collect { it.name.replace('.adoc', '') } as Set
def issues = []
rawFiles.each { rawFile ->
- def processed = postProcessCliManPage(rawFile, ASF_LICENSE_HEADER,
DO_NOT_EDIT_NOTICE, EXPERIMENTAL_NOTICE)
+ def processed = postProcessCliManPage(rawFile, stems,
ASF_LICENSE_HEADER, DO_NOT_EDIT_NOTICE, EXPERIMENTAL_NOTICE)
def committed = new File(committedDir, rawFile.name)
if (!committed.exists()) {
issues << "MISSING committed file (new command): ${rawFile.name}"
diff --git a/solr/solr-ref-guide/modules/deployment-guide/deployment-nav.adoc
b/solr/solr-ref-guide/modules/deployment-guide/deployment-nav.adoc
index b001d404ba3..e22a51c7be1 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/deployment-nav.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/deployment-nav.adoc
@@ -30,13 +30,13 @@
*** xref:cli/solr-export.adoc[export]
*** xref:cli/solr-healthcheck.adoc[healthcheck]
*** xref:cli/solr-package.adoc[package]
-**** xref:cli/solr-package-add-key.adoc[key]
-**** xref:cli/solr-package-add-repo.adoc[repo]
+**** xref:cli/solr-package-add-key.adoc[add-key]
+**** xref:cli/solr-package-add-repo.adoc[add-repo]
**** xref:cli/solr-package-deploy.adoc[deploy]
**** xref:cli/solr-package-install.adoc[install]
-**** xref:cli/solr-package-list-available.adoc[available]
-**** xref:cli/solr-package-list-deployed.adoc[deployed]
-**** xref:cli/solr-package-list-installed.adoc[installed]
+**** xref:cli/solr-package-list-available.adoc[list-available]
+**** xref:cli/solr-package-list-deployed.adoc[list-deployed]
+**** xref:cli/solr-package-list-installed.adoc[list-installed]
**** xref:cli/solr-package-undeploy.adoc[undeploy]
**** xref:cli/solr-package-uninstall.adoc[uninstall]
*** xref:cli/solr-post.adoc[post]
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/index.adoc
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/index.adoc
index 318010391d5..fb8ea48e30e 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/index.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/index.adoc
@@ -68,13 +68,13 @@ Any command not listed here is unavailable when the picocli
implementation is en
|xref:cli/solr-delete.adoc[bin/solr delete]
|xref:cli/solr-export.adoc[bin/solr export]
|xref:cli/solr-healthcheck.adoc[bin/solr healthcheck]
-|xref:cli/solr-package-add-key.adoc[bin/solr package add key]
-|xref:cli/solr-package-add-repo.adoc[bin/solr package add repo]
+|xref:cli/solr-package-add-key.adoc[bin/solr package add-key]
+|xref:cli/solr-package-add-repo.adoc[bin/solr package add-repo]
|xref:cli/solr-package-deploy.adoc[bin/solr package deploy]
|xref:cli/solr-package-install.adoc[bin/solr package install]
-|xref:cli/solr-package-list-available.adoc[bin/solr package list available]
-|xref:cli/solr-package-list-deployed.adoc[bin/solr package list deployed]
-|xref:cli/solr-package-list-installed.adoc[bin/solr package list installed]
+|xref:cli/solr-package-list-available.adoc[bin/solr package list-available]
+|xref:cli/solr-package-list-deployed.adoc[bin/solr package list-deployed]
+|xref:cli/solr-package-list-installed.adoc[bin/solr package list-installed]
|xref:cli/solr-package-undeploy.adoc[bin/solr package undeploy]
|xref:cli/solr-package-uninstall.adoc[bin/solr package uninstall]
|xref:cli/solr-package.adoc[bin/solr package]
diff --git
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-add-key.adoc
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-add-key.adoc
index 801afac3091..d3627e3b970 100644
---
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-add-key.adoc
+++
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-add-key.adoc
@@ -19,7 +19,7 @@
// To update: modify the @Command/@Option annotations in the Java source, then
run:
// ./gradlew :solr:solr-ref-guide:generateCliDocs
-= bin/solr package add key
+= bin/solr package add-key
:page-toclevels: 2
[WARNING]
diff --git
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-add-repo.adoc
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-add-repo.adoc
index 04f1eccd2fc..23fdc5e602f 100644
---
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-add-repo.adoc
+++
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-add-repo.adoc
@@ -19,7 +19,7 @@
// To update: modify the @Command/@Option annotations in the Java source, then
run:
// ./gradlew :solr:solr-ref-guide:generateCliDocs
-= bin/solr package add repo
+= bin/solr package add-repo
:page-toclevels: 2
[WARNING]
diff --git
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-available.adoc
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-available.adoc
index 83110eb433d..2f3aa96e0e5 100644
---
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-available.adoc
+++
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-available.adoc
@@ -19,7 +19,7 @@
// To update: modify the @Command/@Option annotations in the Java source, then
run:
// ./gradlew :solr:solr-ref-guide:generateCliDocs
-= bin/solr package list available
+= bin/solr package list-available
:page-toclevels: 2
[WARNING]
diff --git
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-deployed.adoc
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-deployed.adoc
index ecd8cdfb609..988f0e0768b 100644
---
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-deployed.adoc
+++
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-deployed.adoc
@@ -19,7 +19,7 @@
// To update: modify the @Command/@Option annotations in the Java source, then
run:
// ./gradlew :solr:solr-ref-guide:generateCliDocs
-= bin/solr package list deployed
+= bin/solr package list-deployed
:page-toclevels: 2
[WARNING]
diff --git
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-installed.adoc
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-installed.adoc
index 216b3e58bfb..f57b076cc22 100644
---
a/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-installed.adoc
+++
b/solr/solr-ref-guide/modules/deployment-guide/pages/cli/solr-package-list-installed.adoc
@@ -19,7 +19,7 @@
// To update: modify the @Command/@Option annotations in the Java source, then
run:
// ./gradlew :solr:solr-ref-guide:generateCliDocs
-= bin/solr package list installed
+= bin/solr package list-installed
:page-toclevels: 2
[WARNING]