Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve CommandLineUtil to string methods so they look prettier #1074

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,24 @@ private String[] parseU(String line) {
return CommandLineUtil.argumentsToArray(line);
}

private String join(String[] line) {
return CommandLineUtil.argumentsToStringBash(line, false);
}

private String joinWin(String[] line) {
return CommandLineUtil.argumentsToStringWindowsCreateProcess(line, false);
}

private String joinU(String[] line) {
return CommandLineUtil.argumentsToString(line, false);
}

public void testArgumentsToArraySimple() {
String[] args = parse("A=B C");
assertEquals(2, args.length);
assertEquals("A=B", args[0]);
assertEquals("C", args[1]);
assertEquals("A=B C", join(args));
}

public void testArgumentsToArraySpaces() {
Expand All @@ -48,6 +61,7 @@ public void testArgumentsToArraySpaces() {
assertEquals(2, args.length);
assertEquals("A=B", args[0]);
assertEquals("C", args[1]);
assertEquals("A=B C", join(args));
}

public void testArgumentsToArraySpaces2() {
Expand All @@ -56,55 +70,63 @@ public void testArgumentsToArraySpaces2() {
assertEquals(2, args.length);
assertEquals("A=B", args[0]);
assertEquals("C", args[1]);
assertEquals("A=B C", join(args));
}

public void testArgumentsToArrayDoubleQuotes() {
// [Arg="a b c"]
String[] args = parse("Arg=\"a b c\"");
assertEquals(1, args.length);
assertEquals("Arg=a b c", args[0]);
assertEquals("'Arg=a b c'", join(args));
}

public void testArgumentsToArrayDoubleQuotes2() {
// [Arg="\"quoted\""]
String[] args = parse("Arg=\"\\\"quoted\\\"\"");
assertEquals(1, args.length);
assertEquals("Arg=\"quoted\"", args[0]);
assertEquals("'Arg=\"quoted\"'", join(args));
}

public void testArgumentsToArraySingleQuotes() {
// [Arg='"quoted"']
String[] args = parse("Arg='\"quoted\"'");
assertEquals(1, args.length);
assertEquals("Arg=\"quoted\"", args[0]);
assertEquals("'Arg=\"quoted\"'", join(args));
}

public void testArgumentsToArrayQuote() {
// [\"]
String[] args = parse("\\\"");
assertEquals(1, args.length);
assertEquals("\"", args[0]);
assertEquals("'\"'", join(args));
}

public void testArgumentsToArrayQuotSpaces() {
// [ \"]
String[] args = parse(" \\\"");
assertEquals(1, args.length);
assertEquals("\"", args[0]);
assertEquals("'\"'", join(args));
}

public void testArgumentsToArrayOnlySpaces() {
// [" "]
String[] args = parse("\" \"");
assertEquals(1, args.length);
assertEquals(" ", args[0]);
assertEquals("' '", join(args));
}

public void testArgumentsToArrayJumbledString() {
// ["a b"-c]
String[] args = parse("\"a b\"-c");
assertEquals(1, args.length);
assertEquals("a b-c", args[0]);
assertEquals("'a b-c'", join(args));
}

public void testArgumentsToArrayJumbledString2() {
Expand All @@ -113,6 +135,7 @@ public void testArgumentsToArrayJumbledString2() {
assertEquals(2, args.length);
assertEquals("x", args[0]);
assertEquals("a b-c", args[1]);
assertEquals("x 'a b-c'", join(args));
}

public void testArgumentsToArrayJumbledSQ() {
Expand All @@ -121,20 +144,23 @@ public void testArgumentsToArrayJumbledSQ() {
assertEquals(2, args.length);
assertEquals("x x", args[0]);
assertEquals("y", args[1]);
assertEquals("'x x' y", join(args));
}

public void testArgumentsToArrayEmptyString() {
// [""]
String[] args = parse("\"\"");
assertEquals(1, args.length);
assertEquals("", args[0]);
assertEquals("''", join(args));
}

public void testArgumentsToArrayEmptyString2() {
// ['']
String[] args = parse("''");
assertEquals(1, args.length);
assertEquals("", args[0]);
assertEquals("''", join(args));
}

public void testArgumentsToArrayEmpty3() {
Expand All @@ -143,84 +169,97 @@ public void testArgumentsToArrayEmpty3() {
assertEquals(2, args.length);
assertEquals("", args[0]);
assertEquals("a", args[1]);
assertEquals("'' a", join(args));
}

public void testArgumentsToArrayQuot1() {
// ['"']
String[] args = parse("'\"'");
assertEquals(1, args.length);
assertEquals("\"", args[0]);
assertEquals("'\"'", join(args));
}

public void testArgumentsToArrayQuot2() {
// ["\""]
String[] args = parse("\"\\\"\"");
assertEquals(1, args.length);
assertEquals("\"", args[0]);
assertEquals("'\"'", join(args));
}

public void testArgumentsToArrayNull() {
// []
String[] args = parse(null);
assertEquals(0, args.length);
assertEquals("", join(args));
}

public void testArgumentsToArrayEmpty() {
// []
String[] args = parse("");
assertEquals(0, args.length);
assertEquals("", join(args));
}

public void testArgumentsToArrayEmptySpaces() {
// [ ]
String[] args = parse(" ");
assertEquals(0, args.length);
assertEquals("", join(args));
}

public void testArgumentsToArrayTabs() {
// [a b]
String[] args = parse("a \tb");
assertEquals(2, args.length);
assertEquals("a", args[0]);
assertEquals("a b", join(args));
}

public void testArgumentsToArrayNL() {
// ["a\nb"]
String[] args = parse("\"a\\nb\"");
assertEquals(1, args.length);
assertEquals("a\nb", args[0]);
assertEquals("'a\nb'", join(args));
}

public void testArgumentsToArraySimpleWin() {
String[] args = parseWin("A=B C");
assertEquals(2, args.length);
assertEquals("A=B", args[0]);
assertEquals("C", args[1]);
assertEquals("A=B C", joinWin(args));
}

public void testArgumentsToArrayWindowsFiles() {
String[] args = parseWin("my\\file\\path");
assertEquals(1, args.length);
assertEquals("my\\file\\path", args[0]);
assertEquals("my\\file\\path", joinWin(args));
}

public void testArgumentsToArrayWindowsSpaces() {
String[] args = parseWin("\"my\\file\\path space\"");
assertEquals(1, args.length);
assertEquals("my\\file\\path space", args[0]);
assertEquals("\"my\\file\\path space\"", joinWin(args));
}

public void testArgumentsToArrayWindowsEmpty() {
String[] args = parseWin("\"\"");
assertEquals(1, args.length);
assertEquals("", args[0]);
assertEquals("\"\"", joinWin(args));
}

public void testArgumentsToArrayWindowsQuotes() {
String[] args = parseWin("\\\"a b\\\"");
assertEquals(2, args.length);
assertEquals("\"a", args[0]);
assertEquals("b\"", args[1]);
assertEquals("\"\\\"a\" \"b\\\"\"", joinWin(args));
}

public void testArgumentsToArraySimpleUniversal() {
Expand All @@ -229,5 +268,6 @@ public void testArgumentsToArraySimpleUniversal() {
assertEquals("A=B", args[0]);
assertEquals("C", args[1]);
assertEquals("D", args[2]);
assertEquals("A=B C D", joinU(args));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -346,20 +346,24 @@ public static String argumentsToStringBash(String[] args, boolean encodeNewline)
builder.append(' ');
}

builder.append('\'');
for (int j = 0; j < arg.length(); j++) {
char c = arg.charAt(j);
if (c == '\'') {
builder.append("'\"'\"'"); //$NON-NLS-1$
} else if (c == '\r' && encodeNewline) {
builder.append("'$'\\r''"); //$NON-NLS-1$
} else if (c == '\n' && encodeNewline) {
builder.append("'$'\\n''"); //$NON-NLS-1$
} else {
builder.append(c);
if (needsQuoting(arg)) {
builder.append('\'');
for (int j = 0; j < arg.length(); j++) {
char c = arg.charAt(j);
if (c == '\'') {
builder.append("'\"'\"'"); //$NON-NLS-1$
} else if (c == '\r' && encodeNewline) {
builder.append("'$'\\r''"); //$NON-NLS-1$
} else if (c == '\n' && encodeNewline) {
builder.append("'$'\\n''"); //$NON-NLS-1$
} else {
builder.append(c);
}
}
builder.append('\'');
} else {
builder.append(arg);
}
builder.append('\'');
}

return builder.toString();
Expand All @@ -386,39 +390,50 @@ public static String argumentsToStringWindowsCreateProcess(String[] args, boolea
builder.append(' ');
}

builder.append('"');
for (int j = 0; j < arg.length(); j++) {
/*
* backslashes are special if and only if they are followed by a
* double-quote (") therefore doubling them depends on what is
* next
*/
int numBackslashes = 0;
for (; j < arg.length() && arg.charAt(j) == '\\'; j++) {
numBackslashes++;
}
if (j == arg.length()) {
appendNBackslashes(builder, numBackslashes * 2);
} else if (arg.charAt(j) == '"') {
appendNBackslashes(builder, numBackslashes * 2);
builder.append('"');
} else if ((arg.charAt(j) == '\n' || arg.charAt(j) == '\r') && encodeNewline) {
builder.append(' ');
} else {
if (needsQuoting(arg)) {
builder.append('"');
for (int j = 0; j < arg.length(); j++) {
/*
* this really is numBackslashes (no missing * 2), that is
* because next character is not a double-quote (")
* backslashes are special if and only if they are followed by a
* double-quote (") therefore doubling them depends on what is
* next
*/
appendNBackslashes(builder, numBackslashes);
builder.append(arg.charAt(j));
int numBackslashes = 0;
for (; j < arg.length() && arg.charAt(j) == '\\'; j++) {
numBackslashes++;
}
if (j == arg.length()) {
appendNBackslashes(builder, numBackslashes * 2);
} else if (arg.charAt(j) == '"') {
appendNBackslashes(builder, numBackslashes * 2);
builder.append('\\');
builder.append('"');
} else if ((arg.charAt(j) == '\n' || arg.charAt(j) == '\r') && encodeNewline) {
builder.append(' ');
} else {
/*
* this really is numBackslashes (no missing * 2), that is
* because next character is not a double-quote (")
*/
appendNBackslashes(builder, numBackslashes);
builder.append(arg.charAt(j));
}
}
builder.append('"');
} else {
builder.append(arg);
}
builder.append('"');
}

return builder.toString();
}

private static boolean needsQuoting(String arg) {
boolean needsQuoting = arg.isBlank() || arg.chars().mapToObj(i -> (char) i)
.anyMatch(c1 -> Character.isWhitespace(c1) || c1 == '"' || c1 == '\'');
return needsQuoting;
}

private static void appendNBackslashes(StringBuilder builder, int numBackslashes) {
for (int i = 0; i < numBackslashes; i++) {
builder.append('\\');
Expand Down
Loading