PR: 5906 Don't use <arg line="..." />! git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273209 13f79535-47bb-0310-9956-ffa450edef68master
@@ -25,6 +25,10 @@ Fixed bugs: | |||
* <property>'s classpathref attribute was broken. | |||
* <arg line="''" /> would result in no command line argument, will now | |||
be a single empty argument. Use <arg value="''"/> if you need the | |||
quotes literally. | |||
Other changes: | |||
-------------- | |||
@@ -431,10 +431,6 @@ that contain space characters, nested <code>arg</code> elements can be used.</p> | |||
characters.</td> | |||
<td align="center" rowspan="4">Exactly one of these.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">line</td> | |||
<td valign="top">a space-delimited list of command-line arguments.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">file</td> | |||
<td valign="top">The name of a file as a single command-line | |||
@@ -448,7 +444,17 @@ that contain space characters, nested <code>arg</code> elements can be used.</p> | |||
path separators and Ant will convert it to the platform's local | |||
conventions.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">line</td> | |||
<td valign="top">a space-delimited list of command-line arguments.</td> | |||
</tr> | |||
</table> | |||
<p>It is highly recommended to avoid the <code>line</code> 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.</p> | |||
<h4>Examples</h4> | |||
<blockquote><pre> | |||
<arg value="-l -a"/> | |||
@@ -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()); | |||
} | |||
@@ -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 | |||