git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@789271 13f79535-47bb-0310-9956-ffa450edef68master
@@ -741,6 +741,10 @@ Other changes: | |||||
optional prefix and suffix attributes. | optional prefix and suffix attributes. | ||||
Bugzilla Report 47365 | Bugzilla Report 47365 | ||||
* <apply>'s srcfile and targetfile child elements can now have | |||||
optional prefix and suffix attributes. | |||||
Bugzilla Report 45625 | |||||
Changes from Ant 1.7.0 TO Ant 1.7.1 | Changes from Ant 1.7.0 TO Ant 1.7.1 | ||||
============================================= | ============================================= | ||||
@@ -333,12 +333,50 @@ end of the command line (unless you set addsourcefile to | |||||
<code>false</code>). If you need to place it somewhere different, | <code>false</code>). If you need to place it somewhere different, | ||||
use a nested <code><srcfile></code> element between your | use a nested <code><srcfile></code> element between your | ||||
<code><arg></code> elements to mark the insertion point.</p> | <code><arg></code> elements to mark the insertion point.</p> | ||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tr> | |||||
<td valign="top"><b>Attribute</b></td> | |||||
<td valign="top"><b>Description</b></td> | |||||
<td align="center" valign="top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">prefix</td> | |||||
<td valign="top">a prefix to place in front of the file name when | |||||
building the command line argument. <em>Since Ant 1.8.0</em></td> | |||||
<td align="center" valign="top">No.</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">suffix</td> | |||||
<td valign="top">a suffix to append to the file name when | |||||
building the command line argument. <em>Since Ant 1.8.0</em></td> | |||||
<td align="center" valign="top">No.</td> | |||||
</tr> | |||||
</table> | |||||
<h4>targetfile</h4> | <h4>targetfile</h4> | ||||
<p><code><targetfile></code> is similar to | <p><code><targetfile></code> is similar to | ||||
<code><srcfile></code> and marks the position of the target | <code><srcfile></code> and marks the position of the target | ||||
filename on the command line. If omitted, the target filenames will | filename on the command line. If omitted, the target filenames will | ||||
not be added to the command line at all. This element can only be | not be added to the command line at all. This element can only be | ||||
specified if you also define a nested mapper.</p> | specified if you also define a nested mapper.</p> | ||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tr> | |||||
<td valign="top"><b>Attribute</b></td> | |||||
<td valign="top"><b>Description</b></td> | |||||
<td align="center" valign="top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">prefix</td> | |||||
<td valign="top">a prefix to place in front of the file name when | |||||
building the command line argument. <em>Since Ant 1.8.0</em></td> | |||||
<td align="center" valign="top">No.</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">suffix</td> | |||||
<td valign="top">a suffix to append to the file name when | |||||
building the command line argument. <em>Since Ant 1.8.0</em></td> | |||||
<td align="center" valign="top">No.</td> | |||||
</tr> | |||||
</table> | |||||
<h4>env</h4> | <h4>env</h4> | ||||
<p>It is possible to specify environment variables to pass to the | <p>It is possible to specify environment variables to pass to the | ||||
system command via nested <code><env></code> elements. See the | system command via nested <code><env></code> elements. See the | ||||
@@ -576,10 +576,10 @@ public class ExecuteOn extends ExecTask { | |||||
srcIndex + srcFiles.length, | srcIndex + srcFiles.length, | ||||
targetIndex - srcIndex); | targetIndex - srcIndex); | ||||
// targets are already absolute file names | |||||
System.arraycopy(targetFiles, 0, result, | |||||
targetIndex + srcFiles.length, | |||||
targetFiles.length); | |||||
insertTargetFiles(targetFiles, result, | |||||
targetIndex + srcFiles.length, | |||||
targetFilePos.getPrefix(), | |||||
targetFilePos.getSuffix()); | |||||
// targetIndex --> end | // targetIndex --> end | ||||
System.arraycopy(orig, targetIndex, result, | System.arraycopy(orig, targetIndex, result, | ||||
@@ -589,10 +589,9 @@ public class ExecuteOn extends ExecTask { | |||||
// 0 --> targetIndex | // 0 --> targetIndex | ||||
System.arraycopy(orig, 0, result, 0, targetIndex); | System.arraycopy(orig, 0, result, 0, targetIndex); | ||||
// targets are already absolute file names | |||||
System.arraycopy(targetFiles, 0, result, | |||||
targetIndex, | |||||
targetFiles.length); | |||||
insertTargetFiles(targetFiles, result, targetIndex, | |||||
targetFilePos.getPrefix(), | |||||
targetFilePos.getSuffix()); | |||||
// targetIndex --> srcIndex | // targetIndex --> srcIndex | ||||
System.arraycopy(orig, targetIndex, result, | System.arraycopy(orig, targetIndex, result, | ||||
@@ -626,6 +625,11 @@ public class ExecuteOn extends ExecTask { | |||||
if (forwardSlash && fileSeparator != '/') { | if (forwardSlash && fileSeparator != '/') { | ||||
src = src.replace(fileSeparator, '/'); | src = src.replace(fileSeparator, '/'); | ||||
} | } | ||||
if (srcFilePos != null && | |||||
(srcFilePos.getPrefix().length() > 0 | |||||
|| srcFilePos.getSuffix().length() > 0)) { | |||||
src = srcFilePos.getPrefix() + src + srcFilePos.getSuffix(); | |||||
} | |||||
result[srcIndex + i] = src; | result[srcIndex + i] = src; | ||||
} | } | ||||
return result; | return result; | ||||
@@ -735,6 +739,26 @@ public class ExecuteOn extends ExecTask { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* Inserts target file names (which are already absolute paths) | |||||
* into the list of arguments, taking prefix and postfix into | |||||
* account. | |||||
*/ | |||||
private static void insertTargetFiles(String[] targetFiles, | |||||
String[] arguments, | |||||
int insertPosition, | |||||
String prefix, String suffix) { | |||||
if (prefix.length() == 0 && suffix.length() == 0) { | |||||
System.arraycopy(targetFiles, 0, arguments, insertPosition, | |||||
targetFiles.length); | |||||
} else { | |||||
for (int i = 0; i < targetFiles.length; i++) { | |||||
arguments[insertPosition + i] = | |||||
prefix + targetFiles[i] + suffix; | |||||
} | |||||
} | |||||
} | |||||
/** | /** | ||||
* Enumerated attribute with the values "file", "dir" and "both" | * Enumerated attribute with the values "file", "dir" and "both" | ||||
* for the type attribute. | * for the type attribute. | ||||
@@ -202,14 +202,16 @@ public class Commandline implements Cloneable { | |||||
/** | /** | ||||
* Class to keep track of the position of an Argument. | * Class to keep track of the position of an Argument. | ||||
<p>This class is there to support the srcfile and targetfile | |||||
elements of <execon> and <transform> - don't know | |||||
whether there might be additional use cases.</p> --SB | |||||
* | |||||
* <p>This class is there to support the srcfile and targetfile | |||||
* elements of <apply>.</p> | |||||
*/ | */ | ||||
public class Marker { | public class Marker { | ||||
private int position; | private int position; | ||||
private int realPos = -1; | private int realPos = -1; | ||||
private String prefix = ""; | |||||
private String suffix = ""; | |||||
/** | /** | ||||
* Construct a marker for the specified position. | * Construct a marker for the specified position. | ||||
@@ -236,6 +238,45 @@ public class Commandline implements Cloneable { | |||||
} | } | ||||
return realPos; | return realPos; | ||||
} | } | ||||
/** | |||||
* Set the prefix to be placed in front of the inserted argument. | |||||
* | |||||
* @param prefix fixed prefix string. | |||||
* @since Ant 1.8.0 | |||||
*/ | |||||
public void setPrefix(String prefix) { | |||||
this.prefix = prefix != null ? prefix : ""; | |||||
} | |||||
/** | |||||
* Get the prefix to be placed in front of the inserted argument. | |||||
* | |||||
* @since Ant 1.8.0 | |||||
*/ | |||||
public String getPrefix() { | |||||
return prefix; | |||||
} | |||||
/** | |||||
* Set the suffix to be placed at the end of the inserted argument. | |||||
* | |||||
* @param suffix fixed suffix string. | |||||
* @since Ant 1.8.0 | |||||
*/ | |||||
public void setSuffix(String suffix) { | |||||
this.suffix = suffix != null ? suffix : ""; | |||||
} | |||||
/** | |||||
* Get the suffix to be placed at the end of the inserted argument. | |||||
* | |||||
* @since Ant 1.8.0 | |||||
*/ | |||||
public String getSuffix() { | |||||
return suffix; | |||||
} | |||||
} | } | ||||
/** | /** | ||||
@@ -731,6 +731,29 @@ | |||||
</au:assertTrue> | </au:assertTrue> | ||||
</target> | </target> | ||||
<target name="testSrcfilePrefix" if="test.can.run" depends="xyz"> | |||||
<apply executable="sh" force="true"> | |||||
<arg value="parrot.sh" /> | |||||
<srcfile prefix="-Dfoo="/> | |||||
<fileset refid="xyz" /> | |||||
</apply> | |||||
<au:assertLogContains text="-Dfoo=${x} out" /> | |||||
<au:assertLogContains text="-Dfoo=${y} out" /> | |||||
<au:assertLogContains text="-Dfoo=${z} out" /> | |||||
</target> | |||||
<target name="testTargetfileSuffix" if="test.can.run" depends="xyz"> | |||||
<apply executable="sh" addsourcefile="false" dest="${basedir}"> | |||||
<arg value="parrot.sh" /> | |||||
<targetfile suffix=",x"/> | |||||
<fileset refid="xyz" /> | |||||
<globmapper from="*" to="*.bar"/> | |||||
</apply> | |||||
<au:assertLogContains text="${x}.bar,x out" /> | |||||
<au:assertLogContains text="${y}.bar,x out" /> | |||||
<au:assertLogContains text="${z}.bar,x out" /> | |||||
</target> | |||||
<target name="tearDown"> | <target name="tearDown"> | ||||
<delete> | <delete> | ||||
<fileset refid="xyz" /> | <fileset refid="xyz" /> | ||||