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. | |||
| 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 | |||
| ============================================= | |||
| @@ -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, | |||
| use a nested <code><srcfile></code> element between your | |||
| <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> | |||
| <p><code><targetfile></code> is similar to | |||
| <code><srcfile></code> and marks the position of the target | |||
| 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 | |||
| 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> | |||
| <p>It is possible to specify environment variables to pass to the | |||
| system command via nested <code><env></code> elements. See the | |||
| @@ -576,10 +576,10 @@ public class ExecuteOn extends ExecTask { | |||
| srcIndex + srcFiles.length, | |||
| 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 | |||
| System.arraycopy(orig, targetIndex, result, | |||
| @@ -589,10 +589,9 @@ public class ExecuteOn extends ExecTask { | |||
| // 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 | |||
| System.arraycopy(orig, targetIndex, result, | |||
| @@ -626,6 +625,11 @@ public class ExecuteOn extends ExecTask { | |||
| if (forwardSlash && 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; | |||
| } | |||
| 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" | |||
| * for the type attribute. | |||
| @@ -202,14 +202,16 @@ public class Commandline implements Cloneable { | |||
| /** | |||
| * 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 { | |||
| private int position; | |||
| private int realPos = -1; | |||
| private String prefix = ""; | |||
| private String suffix = ""; | |||
| /** | |||
| * Construct a marker for the specified position. | |||
| @@ -236,6 +238,45 @@ public class Commandline implements Cloneable { | |||
| } | |||
| 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> | |||
| </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"> | |||
| <delete> | |||
| <fileset refid="xyz" /> | |||