diff --git a/picocli-codegen/src/main/java/picocli/codegen/docgen/manpage/ManPageGenerator.java b/picocli-codegen/src/main/java/picocli/codegen/docgen/manpage/ManPageGenerator.java index 6ece7996..b017f6a2 100644 --- a/picocli-codegen/src/main/java/picocli/codegen/docgen/manpage/ManPageGenerator.java +++ b/picocli-codegen/src/main/java/picocli/codegen/docgen/manpage/ManPageGenerator.java @@ -196,7 +196,7 @@ public class ManPageGenerator { // recursively create man pages for subcommands for (CommandLine sub : spec.subcommands().values()) { CommandSpec subSpec = sub.getCommandSpec(); - if (done.contains(subSpec)) {continue;} + if (done.contains(subSpec) || subSpec.usageMessage().hidden()) {continue;} done.add(subSpec); result = generateManPage(config, subSpec); if (result != CommandLine.ExitCode.OK) { @@ -384,6 +384,14 @@ public class ManPageGenerator { IParameterRenderer parameterRenderer = spec.commandLine().getHelp().createDefaultParameterRenderer(); List options = new ArrayList(spec.options()); // options are stored in order of declaration + + // remove hidden options + for (Iterator iter = options.iterator(); iter.hasNext();) { + if (iter.next().hidden()) { + iter.remove(); + } + } + List groups = optionListGroups(spec); for (ArgGroupSpec group : groups) { options.removeAll(group.options()); } @@ -444,12 +452,14 @@ public class ManPageGenerator { } private static void writePositional(PrintWriter pw, PositionalParamSpec positional, IParameterRenderer parameterRenderer, IParamLabelRenderer paramLabelRenderer) { - pw.println(); - Text[][] rows = parameterRenderer.render(positional, paramLabelRenderer, COLOR_SCHEME); - pw.printf("%s::%n", join(", ", rows[0][1], rows[0][3])); - pw.printf(" %s%n", rows[0][4]); - for (int i = 1; i < rows.length; i++) { - pw.printf("+%n%s%n", rows[i][4]); + if (!positional.hidden()) { + pw.println(); + Text[][] rows = parameterRenderer.render(positional, paramLabelRenderer, COLOR_SCHEME); + pw.printf("%s::%n", join(", ", rows[0][1], rows[0][3])); + pw.printf(" %s%n", rows[0][4]); + for (int i = 1; i < rows.length; i++) { + pw.printf("+%n%s%n", rows[i][4]); + } } } @@ -484,6 +494,15 @@ public class ManPageGenerator { } static void genCommands(PrintWriter pw, CommandSpec spec) { + + // remove hidden subcommands + Map subCommands = new LinkedHashMap(spec.subcommands()); + for (Iterator> iter = subCommands.entrySet().iterator(); iter.hasNext();) { + if (iter.next().getValue().getCommandSpec().usageMessage().hidden()) { + iter.remove(); + } + } + if (spec.subcommands().isEmpty()) { return; } diff --git a/picocli-codegen/src/test/java/picocli/codegen/docgen/manpage/ManPageGeneratorTest.java b/picocli-codegen/src/test/java/picocli/codegen/docgen/manpage/ManPageGeneratorTest.java index afd97939..c6ff2990 100644 --- a/picocli-codegen/src/test/java/picocli/codegen/docgen/manpage/ManPageGeneratorTest.java +++ b/picocli-codegen/src/test/java/picocli/codegen/docgen/manpage/ManPageGeneratorTest.java @@ -21,10 +21,6 @@ import static org.junit.Assert.*; public class ManPageGeneratorTest { - @Test - public void main() { - } - @Test public void generateManPage() throws IOException { @Command(name = "myapp", mixinStandardHelpOptions = true, @@ -153,6 +149,53 @@ public class ManPageGeneratorTest { assertEquals(expected, sw.toString()); } + @Test + public void testHidden() throws IOException { + + @Command(name = "a-sub", mixinStandardHelpOptions = true, description = "A sub command") + class ASubCommand { + @Option(names = "input-a") + String inputA; + } + + @Command(name = "hidden-sub", mixinStandardHelpOptions = true, hidden = true) + class HiddenSubCommand { + @Option(names = "input-b") + String inputB; + } + + @Command(name = "testHidden", mixinStandardHelpOptions = true, + version = { + "Versioned Command 1.0", + "Picocli " + picocli.CommandLine.VERSION, + "JVM: ${java.version} (${java.vendor} ${java.vm.name} ${java.vm.version})", + "OS: ${os.name} ${os.version} ${os.arch}"}, + description = "This app does great things.", + subcommands = { ASubCommand.class, HiddenSubCommand.class } + + ) + class MyApp { + @Option(names = {"-o", "--output"}, description = "Output location full path.") + File outputFolder; + + @Option(names = {"--hidden-test"}, hidden = true) + File hidden; + + @Parameters(hidden = true) + List values; + } + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); //System.out, true + ManPageGenerator.writeSingleManPage(pw, new CommandLine(new MyApp()).getCommandSpec()); + pw.flush(); + + String expected = read("/testHidden.manpage.adoc"); + expected = expected.replace("\r\n", "\n"); + expected = expected.replace("\n", System.getProperty("line.separator")); + assertEquals(expected, sw.toString()); + } + private String read(String resource) throws IOException { return readAndClose(getClass().getResourceAsStream(resource)); } diff --git a/picocli-codegen/src/test/resources/testHidden.manpage.adoc b/picocli-codegen/src/test/resources/testHidden.manpage.adoc new file mode 100644 index 00000000..1042cb7e --- /dev/null +++ b/picocli-codegen/src/test/resources/testHidden.manpage.adoc @@ -0,0 +1,60 @@ +// tag::picocli-generated-full-manpage[] +// tag::picocli-generated-man-section-header[] +:doctype: manpage +:revnumber: Versioned Command 1.0 +:manmanual: TestHidden Manual +:mansource: Versioned Command 1.0 +:man-linkstyle: pass:[blue R < >] += testHidden(1) + +// end::picocli-generated-man-section-header[] + +// tag::picocli-generated-man-section-name[] +== Name + +testHidden - This app does great things. + +// end::picocli-generated-man-section-name[] + +// tag::picocli-generated-man-section-synopsis[] +== Synopsis + +*testHidden* [*-hV*] [*-o*=__] [COMMAND] + +// end::picocli-generated-man-section-synopsis[] + +// tag::picocli-generated-man-section-description[] +== Description + +This app does great things. + +// end::picocli-generated-man-section-description[] + +// tag::picocli-generated-man-section-options[] +== Options + +*-h*, *--help*:: + Show this help message and exit. + +*-o*, *--output*=__:: + Output location full path. + +*-V*, *--version*:: + Print version information and exit. + +// end::picocli-generated-man-section-options[] + +// tag::picocli-generated-man-section-arguments[] +== Arguments + +// end::picocli-generated-man-section-arguments[] + +// tag::picocli-generated-man-section-commands[] +== Commands + +*a-sub*:: + A sub command + +// end::picocli-generated-man-section-commands[] + +// end::picocli-generated-full-manpage[]