From dcbf4ae2c2e8c3e497af28c054dbc0002ca23cad Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Tue, 8 Dec 2020 22:28:59 +0100 Subject: [PATCH] Use client terminal width to format help --- .../mvndaemon/mvnd/client/DefaultClient.java | 1 + .../mvndaemon/mvnd/common/Environment.java | 5 ++++- .../mvnd/common/logging/ClientOutput.java | 2 ++ .../mvnd/common/logging/TerminalOutput.java | 5 +++++ .../org/apache/maven/cli/DaemonMavenCli.java | 5 ++++- .../apache/maven/cli/MvndHelpFormatter.java | 22 +++++++++++++------ .../mvnd/assertj/TestClientOutput.java | 5 +++++ .../mvnd/junit/NativeTestClient.java | 1 + 8 files changed, 37 insertions(+), 9 deletions(-) diff --git a/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java b/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java index 83ecc1707..2959ee932 100644 --- a/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java +++ b/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java @@ -242,6 +242,7 @@ public ExecutionResult execute(ClientOutput output, List argv) { if (localMavenRepository != null && args.stream().noneMatch(arg -> arg.startsWith("-Dmaven.repo.local="))) { args.add("-Dmaven.repo.local=" + localMavenRepository.toString()); } + Environment.MVND_TERMINAL_WIDTH.appendAsCommandLineOption(args::add, Integer.toString(output.getTerminalWidth())); final DaemonConnector connector = new DaemonConnector(parameters, registry); try (DaemonClientConnection daemon = connector.connect(output)) { diff --git a/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java b/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java index 96501e11e..0ac478cec 100644 --- a/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java +++ b/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java @@ -191,7 +191,10 @@ public enum Environment { */ MVND_DUPLICATE_DAEMON_GRACE_PERIOD("mvnd.duplicateDaemonGracePeriod", null, "10 seconds", OptionType.DURATION, Flags.DISCRIMINATING), - ; + /** + * Internal property to tell the daemon the width of the terminal + */ + MVND_TERMINAL_WIDTH("mvnd.terminalWidth", null, 0, OptionType.INTEGER, Flags.INTERNAL); static Properties properties; diff --git a/common/src/main/java/org/mvndaemon/mvnd/common/logging/ClientOutput.java b/common/src/main/java/org/mvndaemon/mvnd/common/logging/ClientOutput.java index 680ca1a9d..c634c86e1 100644 --- a/common/src/main/java/org/mvndaemon/mvnd/common/logging/ClientOutput.java +++ b/common/src/main/java/org/mvndaemon/mvnd/common/logging/ClientOutput.java @@ -33,4 +33,6 @@ public interface ClientOutput extends AutoCloseable { void accept(List messages); void describeTerminal(); + + int getTerminalWidth(); } diff --git a/common/src/main/java/org/mvndaemon/mvnd/common/logging/TerminalOutput.java b/common/src/main/java/org/mvndaemon/mvnd/common/logging/TerminalOutput.java index e4438b48d..0efc002f2 100644 --- a/common/src/main/java/org/mvndaemon/mvnd/common/logging/TerminalOutput.java +++ b/common/src/main/java/org/mvndaemon/mvnd/common/logging/TerminalOutput.java @@ -355,6 +355,11 @@ public void describeTerminal() { this.accept(Message.log(sb.toString())); } + @Override + public int getTerminalWidth() { + return terminal.getWidth(); + } + void readInputLoop() { try { while (!closing) { diff --git a/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java b/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java index 46eb059ab..d270dd80b 100644 --- a/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java +++ b/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java @@ -182,6 +182,7 @@ public int doMain(CliRequest cliRequest, Map clientEnv) throws E initialize(cliRequest); cli(cliRequest); properties(cliRequest); + help(cliRequest); logging(cliRequest); container(cliRequest); configure(cliRequest); @@ -266,9 +267,11 @@ void cli(CliRequest cliRequest) AbstractLoggingSpy.instance().append(MvndHelpFormatter.displayHelp(cliManager)); throw e; } + } + private void help(CliRequest cliRequest) throws Exception { if (cliRequest.commandLine.hasOption(CLIManager.HELP)) { - AbstractLoggingSpy.instance().append(MvndHelpFormatter.displayHelp(cliManager)); + AbstractLoggingSpy.instance().append(MvndHelpFormatter.displayHelp(new CLIManager())); throw new ExitException(0); } diff --git a/daemon/src/main/java/org/apache/maven/cli/MvndHelpFormatter.java b/daemon/src/main/java/org/apache/maven/cli/MvndHelpFormatter.java index d2583375b..f9116f28f 100644 --- a/daemon/src/main/java/org/apache/maven/cli/MvndHelpFormatter.java +++ b/daemon/src/main/java/org/apache/maven/cli/MvndHelpFormatter.java @@ -17,6 +17,7 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.List; @@ -47,9 +48,15 @@ static String toPlainText(String javadocText) { * @return the string containing the help message */ public static String displayHelp(CLIManager cliManager) { + int terminalWidth = Environment.MVND_TERMINAL_WIDTH.asInt(); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (PrintStream out = new PrintStream(baos, false, StandardCharsets.UTF_8.name())) { - cliManager.displayHelp(out); + out.println(); + PrintWriter pw = new PrintWriter(out); + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp(pw, terminalWidth, "mvn [options] [] []", "\nOptions:", cliManager.options, + 1, 3, "\n", false); + pw.flush(); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } @@ -68,7 +75,7 @@ public static String displayHelp(CLIManager cliManager) { final Environment env = entry.getEntry(); help.append(lineSeparator); int indentPos = help.length() + indent.length(); - int lineEnd = help.length() + HelpFormatter.DEFAULT_WIDTH; + int lineEnd = help.length() + terminalWidth; spaces(help, HelpFormatter.DEFAULT_LEFT_PAD); help .append("-D") @@ -92,7 +99,7 @@ public static String displayHelp(CLIManager cliManager) { help.append(' '); spaces(help, indentPos - help.length()); - wrap(help, toPlainText(entry.getJavaDoc()), HelpFormatter.DEFAULT_WIDTH, lineEnd, indent); + wrap(help, toPlainText(entry.getJavaDoc()), terminalWidth, lineEnd, indent); indentedLine(help, "Default", env.getDefault(), indent); indentedLine(help, "Env. variable", env.getEnvironmentVariable(), indent); @@ -110,11 +117,11 @@ public static String displayHelp(CLIManager cliManager) { final OptionType type = entry.getEntry(); help.append(lineSeparator); int indentPos = help.length() + indent.length(); - int lineEnd = help.length() + HelpFormatter.DEFAULT_WIDTH; + int lineEnd = help.length() + terminalWidth; spaces(help, HelpFormatter.DEFAULT_LEFT_PAD); help.append(type.name().toLowerCase(Locale.ROOT)); spaces(help, indentPos - help.length()); - wrap(help, toPlainText(entry.getJavaDoc()), HelpFormatter.DEFAULT_WIDTH, lineEnd, indent); + wrap(help, toPlainText(entry.getJavaDoc()), terminalWidth, lineEnd, indent); }); return help.toString(); @@ -123,11 +130,12 @@ public static String displayHelp(CLIManager cliManager) { private static void indentedLine(final StringBuilder stringBuilder, String key, final String value, final String indent) { int lineEnd; if (value != null) { - lineEnd = stringBuilder.length() + HelpFormatter.DEFAULT_WIDTH; + int terminalWidth = Environment.MVND_TERMINAL_WIDTH.asInt(); + lineEnd = stringBuilder.length() + terminalWidth; stringBuilder .append(System.lineSeparator()) .append(indent); - wrap(stringBuilder, key + ": " + value, HelpFormatter.DEFAULT_WIDTH, lineEnd, indent); + wrap(stringBuilder, key + ": " + value, terminalWidth, lineEnd, indent); } } diff --git a/integration-tests/src/test/java/org/mvndaemon/mvnd/assertj/TestClientOutput.java b/integration-tests/src/test/java/org/mvndaemon/mvnd/assertj/TestClientOutput.java index 0b9714a06..d97114e73 100644 --- a/integration-tests/src/test/java/org/mvndaemon/mvnd/assertj/TestClientOutput.java +++ b/integration-tests/src/test/java/org/mvndaemon/mvnd/assertj/TestClientOutput.java @@ -57,6 +57,11 @@ public void describeTerminal() { accept(Message.display("Test terminal")); } + @Override + public int getTerminalWidth() { + return 74; + } + public List getMessages() { return messages; } diff --git a/integration-tests/src/test/java/org/mvndaemon/mvnd/junit/NativeTestClient.java b/integration-tests/src/test/java/org/mvndaemon/mvnd/junit/NativeTestClient.java index 947a1ca9a..575c8267e 100644 --- a/integration-tests/src/test/java/org/mvndaemon/mvnd/junit/NativeTestClient.java +++ b/integration-tests/src/test/java/org/mvndaemon/mvnd/junit/NativeTestClient.java @@ -70,6 +70,7 @@ public ExecutionResult execute(ClientOutput output, List args) throws In final String threads = parameters.threads(); Environment.MVND_THREADS.appendAsCommandLineOption(cmd::add, threads); } + Environment.MVND_TERMINAL_WIDTH.appendAsCommandLineOption(cmd::add, Integer.toString(output.getTerminalWidth())); final ProcessBuilder builder = new ProcessBuilder(cmd.toArray(new String[0])) .directory(parameters.userDir().toFile()) //