This is an automated email from the ASF dual-hosted git repository. jbonofre pushed a commit to branch cherry-pick-2306-karaf-4.4.x in repository https://gitbox.apache.org/repos/asf/karaf.git
commit 81b3b48c77d2baa979a0eeab3f34ad7b9418e2c7 Author: JB Onofré <[email protected]> AuthorDate: Thu Mar 12 09:26:35 2026 +0100 fix(tooling): use LinkedHashSet for deterministic option ordering in help generation (#2306) * Revert "Use single file generation to avoid verify race condition (#2285)" This reverts commit 3b067c9dc0c4b26bcd4c31d78702c9a0d2a44b93. * fix(tooling): use LinkedHashSet for deterministic option ordering in help generation Replace HashSet with LinkedHashSet in all CommandHelpPrinter implementations (Markdown, AsciiDoctor, DocBook, UserConf) to preserve insertion order of options. HashSet provides no ordering guarantee, causing non-deterministic output that breaks the test-commands-generate-help invoker test when dependencies change (e.g. jline upgrade from 3.30.6 to 3.30.8). --- .../apache/karaf/tooling/commands/AsciiDoctorCommandHelpPrinter.java | 2 +- .../org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java | 3 ++- .../org/apache/karaf/tooling/commands/MarkdownCommandHelpPrinter.java | 2 +- .../org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/AsciiDoctorCommandHelpPrinter.java b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/AsciiDoctorCommandHelpPrinter.java index 1aecb99b1c..5d0fc03073 100644 --- a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/AsciiDoctorCommandHelpPrinter.java +++ b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/AsciiDoctorCommandHelpPrinter.java @@ -36,7 +36,7 @@ public class AsciiDoctorCommandHelpPrinter extends AbstractCommandHelpPrinter { @Override public void printHelp(Action action, PrintStream out, boolean includeHelpOption) { Command command = action.getClass().getAnnotation(Command.class); - Set<Option> options = new HashSet<>(); + Set<Option> options = new LinkedHashSet<>(); List<Argument> arguments = new ArrayList<>(); Map<Argument, Field> argFields = new HashMap<>(); Map<Option, Field> optFields = new HashMap<>(); diff --git a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java index 2cdad99650..cf259fcb60 100644 --- a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java +++ b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java @@ -23,6 +23,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -41,7 +42,7 @@ public class DocBookCommandHelpPrinter extends AbstractCommandHelpPrinter { @Override public void printHelp(Action action, PrintStream out, boolean includeHelpOption) { Command command = action.getClass().getAnnotation(Command.class); - Set<Option> options = new HashSet<>(); + Set<Option> options = new LinkedHashSet<>(); List<Argument> arguments = new ArrayList<>(); Map<Argument, Field> argFields = new HashMap<>(); Map<Option, Field> optFields = new HashMap<>(); diff --git a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/MarkdownCommandHelpPrinter.java b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/MarkdownCommandHelpPrinter.java index 7b54ab773f..d5269a91d7 100644 --- a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/MarkdownCommandHelpPrinter.java +++ b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/MarkdownCommandHelpPrinter.java @@ -31,7 +31,7 @@ public class MarkdownCommandHelpPrinter extends AbstractCommandHelpPrinter { @Override public void printHelp(Action action, PrintStream out, boolean includeHelpOption) { Command command = action.getClass().getAnnotation(Command.class); - Set<Option> options = new HashSet<>(); + Set<Option> options = new LinkedHashSet<>(); List<Argument> arguments = new ArrayList<>(); Map<Argument, Field> argFields = new HashMap<>(); Map<Option, Field> optFields = new HashMap<>(); diff --git a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java index 23af956d03..4ac2633b10 100644 --- a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java +++ b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java @@ -23,6 +23,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -41,7 +42,7 @@ public class UserConfCommandHelpPrinter extends AbstractCommandHelpPrinter { @Override public void printHelp(Action action, PrintStream out, boolean includeHelpOption) { Command command = action.getClass().getAnnotation(Command.class); - Set<Option> options = new HashSet<>(); + Set<Option> options = new LinkedHashSet<>(); List<Argument> arguments = new ArrayList<>(); Map<Argument, Field> argFields = new HashMap<>(); Map<Option, Field> optFields = new HashMap<>();
