Trim multi-line arguments for task name and ssh_log

Previously, the task name of review command could be multi line string
because of --message argument.

Keep only the first line of the multi-line arguments to improve
readability for the task name in output of show-queue command and logs.
This applies to any multi line argument of any command, not only to
review command.

Change-Id: Ic8f3c167a73fae9f5f883e8cc3b43f84647e1b8d
This commit is contained in:
Borui Tao 2018-02-12 11:10:20 -05:00 committed by David Pursehouse
parent 85f4551fba
commit a0ae281aa9
2 changed files with 33 additions and 5 deletions

View File

@ -16,6 +16,7 @@ package com.google.gerrit.sshd;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.base.Joiner;
import com.google.common.util.concurrent.Atomics;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.TimeUtil;
@ -98,6 +99,9 @@ public abstract class BaseCommand implements Command {
/** Unparsed command line options. */
private String[] argv;
/** trimmed command line arguments. */
private String[] trimmedArgv;
public BaseCommand() {
task = Atomics.newReference();
}
@ -143,6 +147,26 @@ public abstract class BaseCommand implements Command {
this.argv = argv;
}
/**
* Trim the argument if it is spanning multiple lines.
*
* @return the arguments where all the multiple-line fields are trimmed.
*/
protected String[] getTrimmedArguments() {
if (trimmedArgv == null && argv != null) {
trimmedArgv = new String[argv.length];
for (int i = 0; i < argv.length; i++) {
String arg = argv[i];
int indexOfMultiLine = arg.indexOf("\n");
if (indexOfMultiLine > -1) {
arg = arg.substring(0, indexOfMultiLine).concat(" [trimmed]");
}
trimmedArgv[i] = arg;
}
}
return trimmedArgv;
}
@Override
public void destroy() {
Future<?> future = task.getAndSet(null);
@ -370,8 +394,11 @@ public abstract class BaseCommand implements Command {
}
protected String getTaskDescription() {
StringBuilder m = new StringBuilder();
m.append(context.getCommandLine());
StringBuilder m = new StringBuilder(commandName);
String[] ta = getTrimmedArguments();
if (ta != null) {
m.append(Joiner.on(" ").join(ta));
}
return m.toString();
}

View File

@ -14,6 +14,7 @@
package com.google.gerrit.sshd;
import com.google.common.base.Joiner;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.MultimapBuilder;
import com.google.gerrit.audit.AuditService;
@ -282,9 +283,9 @@ class SshLog implements LifecycleListener {
return "Command was already destroyed";
}
StringBuilder commandName = new StringBuilder(dcmd.getCommandName());
String[] args = dcmd.getArguments();
for (int i = 1; i < args.length; i++) {
commandName.append(".").append(args[i]);
String[] trimmedArgs = dcmd.getTrimmedArguments();
if (trimmedArgs != null) {
commandName.append(Joiner.on(".").join(trimmedArgs));
}
return commandName.toString();
}