From 130a54050b7affe36ed9c41c4e8f77f83e4d6ed5 Mon Sep 17 00:00:00 2001
From: Stefan Bodewig arg
elements can be used.
arg
elements can be used.
path separators and Ant will convert it to the platform's local
conventions.It is highly recommended to avoid the line
version
+when possible. Ant will try to split the command line in a way
+similar to what a (Unix) shell would do, but may create something that
+is very different from what you expect under some circumstances.
<arg value="-l -a"/> diff --git a/src/main/org/apache/tools/ant/types/Commandline.java b/src/main/org/apache/tools/ant/types/Commandline.java index 32b0cfd97..c651b17a4 100644 --- a/src/main/org/apache/tools/ant/types/Commandline.java +++ b/src/main/org/apache/tools/ant/types/Commandline.java @@ -356,12 +356,14 @@ public class Commandline implements Cloneable { StringTokenizer tok = new StringTokenizer(to_process, "\"\' ", true); Vector v = new Vector(); StringBuffer current = new StringBuffer(); + boolean lastTokenHasBeenQuoted = false; while (tok.hasMoreTokens()) { String nextTok = tok.nextToken(); switch (state) { case inQuote: if ("\'".equals(nextTok)) { + lastTokenHasBeenQuoted = true; state = normal; } else { current.append(nextTok); @@ -369,6 +371,7 @@ public class Commandline implements Cloneable { break; case inDoubleQuote: if ("\"".equals(nextTok)) { + lastTokenHasBeenQuoted = true; state = normal; } else { current.append(nextTok); @@ -380,18 +383,19 @@ public class Commandline implements Cloneable { } else if ("\"".equals(nextTok)) { state = inDoubleQuote; } else if (" ".equals(nextTok)) { - if (current.length() != 0) { + if (lastTokenHasBeenQuoted || current.length() != 0) { v.addElement(current.toString()); current.setLength(0); } } else { current.append(nextTok); } + lastTokenHasBeenQuoted = false; break; } } - if (current.length() != 0) { + if (lastTokenHasBeenQuoted || current.length() != 0) { v.addElement(current.toString()); } diff --git a/src/testcases/org/apache/tools/ant/types/CommandlineTest.java b/src/testcases/org/apache/tools/ant/types/CommandlineTest.java index 67c92319f..334ed9797 100644 --- a/src/testcases/org/apache/tools/ant/types/CommandlineTest.java +++ b/src/testcases/org/apache/tools/ant/types/CommandlineTest.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000-2001 The Apache Software Foundation. All rights + * Copyright (c) 2000-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -118,6 +118,31 @@ public class CommandlineTest extends TestCase { assertEquals("case with quoted whitespace", 4, s.length); assertEquals("backslash included", "2\\", s[1]); + // "" should become a single empty argument, same for '' + // PR 5906 + s = Commandline.translateCommandline("\"\" a"); + assertEquals("Doublequoted null arg prepend", 2, s.length); + assertEquals("Doublequoted null arg prepend", "", s[0]); + assertEquals("Doublequoted null arg prepend", "a", s[1]); + s = Commandline.translateCommandline("a \"\""); + assertEquals("Doublequoted null arg append", 2, s.length); + assertEquals("Doublequoted null arg append", "a", s[0]); + assertEquals("Doublequoted null arg append", "", s[1]); + s = Commandline.translateCommandline("\"\""); + assertEquals("Doublequoted null arg", 1, s.length); + assertEquals("Doublequoted null arg", "", s[0]); + + s = Commandline.translateCommandline("\'\' a"); + assertEquals("Singlequoted null arg prepend", 2, s.length); + assertEquals("Singlequoted null arg prepend", "", s[0]); + assertEquals("Singlequoted null arg prepend", "a", s[1]); + s = Commandline.translateCommandline("a \'\'"); + assertEquals("Singlequoted null arg append", 2, s.length); + assertEquals("Singlequoted null arg append", "a", s[0]); + assertEquals("Singlequoted null arg append", "", s[1]); + s = Commandline.translateCommandline("\'\'"); + assertEquals("Singlequoted null arg", 1, s.length); + assertEquals("Singlequoted null arg", "", s[0]); // now to the expected failures