aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcushon <cushon@google.com>2019-01-28 21:16:47 -0800
committerLiam Miller-Cushon <cushon@google.com>2019-01-28 21:35:39 -0800
commit86a7c8a2f17d1ac976d94880c3123e6820f7d5cc (patch)
tree5db8980d6b3b60b78b4c4575d2f6428b44324fcf
parentbf9349300bed8d29daf8eb80d3766d88fa41d316 (diff)
downloadturbine-86a7c8a2f17d1ac976d94880c3123e6820f7d5cc.tar.gz
Perform best-effort unescaping of command line options
ninja [1] shell-escapes paths that contain single quotes: https://android.googlesource.com/platform/external/ninja/+/6f903faaf5488dc052ffc4e3e0b12757b426e088/src/util.cc#274 MOE_MIGRATED_REVID=231341543
-rw-r--r--java/com/google/turbine/options/TurbineOptionsParser.java8
-rw-r--r--javatests/com/google/turbine/options/TurbineOptionsTest.java20
2 files changed, 28 insertions, 0 deletions
diff --git a/java/com/google/turbine/options/TurbineOptionsParser.java b/java/com/google/turbine/options/TurbineOptionsParser.java
index 055eca1..55697ca 100644
--- a/java/com/google/turbine/options/TurbineOptionsParser.java
+++ b/java/com/google/turbine/options/TurbineOptionsParser.java
@@ -16,6 +16,7 @@
package com.google.turbine.options;
+import static com.google.common.base.Preconditions.checkArgument;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.base.CharMatcher;
@@ -144,6 +145,13 @@ public class TurbineOptionsParser {
if (arg.isEmpty()) {
continue;
}
+ if (arg.charAt(0) == '\'') {
+ // perform best-effort unescaping as a concession to ninja, see:
+ // https://android.googlesource.com/platform/external/ninja/+/6f903faaf5488dc052ffc4e3e0b12757b426e088/src/util.cc#274
+ checkArgument(arg.charAt(arg.length() - 1) == '\'', arg);
+ arg = arg.substring(1, arg.length() - 1);
+ checkArgument(!arg.contains("'"), arg);
+ }
if (arg.startsWith("@@")) {
argumentDeque.addLast(arg.substring(1));
} else if (arg.startsWith("@")) {
diff --git a/javatests/com/google/turbine/options/TurbineOptionsTest.java b/javatests/com/google/turbine/options/TurbineOptionsTest.java
index f406856..a5872d9 100644
--- a/javatests/com/google/turbine/options/TurbineOptionsTest.java
+++ b/javatests/com/google/turbine/options/TurbineOptionsTest.java
@@ -330,4 +330,24 @@ public class TurbineOptionsTest {
assertThat(options.shouldReduceClassPath()).isFalse();
}
}
+
+ @Test
+ public void unescape() throws Exception {
+ String[] lines = {
+ "--sources", "Test.java", "'Foo$Bar.java'",
+ };
+ TurbineOptions options =
+ TurbineOptionsParser.parse(Iterables.concat(BASE_ARGS, Arrays.asList(lines)));
+ assertThat(options.sources()).containsExactly("Test.java", "Foo$Bar.java").inOrder();
+ }
+
+ @Test
+ public void invalidUnescape() throws Exception {
+ String[] lines = {"--sources", "'Foo$Bar.java"};
+ try {
+ TurbineOptionsParser.parse(Iterables.concat(BASE_ARGS, Arrays.asList(lines)));
+ fail();
+ } catch (IllegalArgumentException expected) {
+ }
+ }
}