diff options
author | cushon <cushon@google.com> | 2019-01-28 21:16:47 -0800 |
---|---|---|
committer | Liam Miller-Cushon <cushon@google.com> | 2019-01-28 21:35:39 -0800 |
commit | 86a7c8a2f17d1ac976d94880c3123e6820f7d5cc (patch) | |
tree | 5db8980d6b3b60b78b4c4575d2f6428b44324fcf | |
parent | bf9349300bed8d29daf8eb80d3766d88fa41d316 (diff) | |
download | turbine-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.java | 8 | ||||
-rw-r--r-- | javatests/com/google/turbine/options/TurbineOptionsTest.java | 20 |
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) { + } + } } |