Browse Source

Make <arg line="''"/> closer to what a shell would do.

PR: 5906

Don't use <arg line="..." />!


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273209 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 23 years ago
parent
commit
130a54050b
4 changed files with 46 additions and 7 deletions
  1. +4
    -0
      WHATSNEW
  2. +10
    -4
      docs/manual/using.html
  3. +6
    -2
      src/main/org/apache/tools/ant/types/Commandline.java
  4. +26
    -1
      src/testcases/org/apache/tools/ant/types/CommandlineTest.java

+ 4
- 0
WHATSNEW View File

@@ -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:
--------------



+ 10
- 4
docs/manual/using.html View File

@@ -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>
&lt;arg value=&quot;-l -a&quot;/&gt;


+ 6
- 2
src/main/org/apache/tools/ant/types/Commandline.java View File

@@ -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());
}



+ 26
- 1
src/testcases/org/apache/tools/ant/types/CommandlineTest.java View File

@@ -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


Loading…
Cancel
Save