git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@986290 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -166,6 +166,9 @@ Other changes: | |||
| the imported resource. This means that several kinds of different build | |||
| files can import each other. | |||
| * <copy tofile=""> now also works for non-filesystem resources. | |||
| Bugzilla Report 49756. | |||
| Changes from Ant 1.8.0 TO Ant 1.8.1 | |||
| =================================== | |||
| @@ -73,12 +73,15 @@ operation as <a href="../Types/filterset.html">filtersets</a>. | |||
| <td valign="top">The file to copy to.</td> | |||
| <td valign="top" align="center" rowspan="2">With the <code>file</code> | |||
| attribute, either <code>tofile</code> or <code>todir</code> can be used.<br/> | |||
| With nested resource collection elements, if the collection | |||
| contains non-filesystem resources, the number of included files | |||
| With nested resource collection elements, if the number of | |||
| included resources | |||
| is greater than 1, or if only the <code>dir</code> attribute is | |||
| specified in the <code><fileset></code>, or if the | |||
| <code>file</code> attribute is also specified, then only | |||
| <code>todir</code> is allowed.</td> | |||
| <code>todir</code> is allowed.<br/> | |||
| <em>Prior to Ant 1.8.2</em> the <code>tofile</code> attribute | |||
| only supported filesystem resources top copy from.</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">todir</td> | |||
| @@ -102,6 +102,10 @@ public class Copy extends Task { | |||
| private long granularity = 0; | |||
| private boolean force = false; | |||
| // used to store the single non-file resource to copy when the | |||
| // tofile attribute has been used | |||
| private Resource singleResource = null; | |||
| /** | |||
| * Copy task constructor. | |||
| */ | |||
| @@ -550,11 +554,15 @@ public class Copy extends Task { | |||
| } | |||
| } | |||
| if (nonFileResources.size() > 0) { | |||
| if (nonFileResources.size() > 0 || singleResource != null) { | |||
| Resource[] nonFiles = | |||
| (Resource[]) nonFileResources.toArray(new Resource[nonFileResources.size()]); | |||
| // restrict to out-of-date resources | |||
| Map map = scan(nonFiles, destDir); | |||
| if (singleResource != null) { | |||
| map.put(singleResource, | |||
| new String[] { destFile.getAbsolutePath() }); | |||
| } | |||
| try { | |||
| doResourceOperations(map); | |||
| } catch (BuildException e) { | |||
| @@ -568,6 +576,7 @@ public class Copy extends Task { | |||
| } finally { | |||
| // clean up again, so this instance can be used a second | |||
| // time | |||
| singleResource = null; | |||
| file = savedFile; | |||
| destFile = savedDestFile; | |||
| destDir = savedDestDir; | |||
| @@ -661,10 +670,9 @@ public class Copy extends Task { | |||
| "Cannot concatenate multiple files into a single file."); | |||
| } else { | |||
| ResourceCollection rc = (ResourceCollection) rcs.elementAt(0); | |||
| if (!rc.isFilesystemOnly()) { | |||
| if (!rc.isFilesystemOnly() && !supportsNonFileResources()) { | |||
| throw new BuildException("Only FileSystem resources are" | |||
| + " supported when concatenating" | |||
| + " files."); | |||
| + " supported."); | |||
| } | |||
| if (rc.size() == 0) { | |||
| throw new BuildException(MSG_WHEN_COPYING_EMPTY_RC_TO_FILE); | |||
| @@ -672,7 +680,11 @@ public class Copy extends Task { | |||
| Resource res = (Resource) rc.iterator().next(); | |||
| FileProvider r = (FileProvider) res.as(FileProvider.class); | |||
| if (file == null) { | |||
| file = r.getFile(); | |||
| if (r != null) { | |||
| file = r.getFile(); | |||
| } else { | |||
| singleResource = res; | |||
| } | |||
| rcs.removeElementAt(0); | |||
| } else { | |||
| throw new BuildException( | |||
| @@ -403,4 +403,40 @@ public class NullByteStreamResource extends Resource { | |||
| </copy> | |||
| </target> | |||
| <target name="testCopyWithResourceAndFile" | |||
| description="https://issues.apache.org/bugzilla/show_bug.cgi?id=49756" | |||
| > | |||
| <mkdir dir="${input}"/> | |||
| <au:assertFileDoesntExist file="${input}/somefile"/> | |||
| <copy tofile="${input}/somefile"> | |||
| <first> | |||
| <union> | |||
| <restrict> | |||
| <exists/> | |||
| <fileset file="${input}/somefile"/> | |||
| </restrict> | |||
| <string value="default contents"/> | |||
| </union> | |||
| </first> | |||
| </copy> | |||
| <au:assertFileExists file="${input}/somefile"/> | |||
| <au:assertResourceContains resource="${input}/somefile" | |||
| value="default contents"/> | |||
| <delete file="${input}/somefile"/> | |||
| <touch file="${input}/somefile"/> | |||
| <copy tofile="${input}/somefile"> | |||
| <first> | |||
| <union> | |||
| <restrict> | |||
| <exists/> | |||
| <fileset file="${input}/somefile"/> | |||
| </restrict> | |||
| <string value="default contents"/> | |||
| </union> | |||
| </first> | |||
| </copy> | |||
| <au:assertFileExists file="${input}/somefile"/> | |||
| <au:assertResourceDoesntContain resource="${input}/somefile" | |||
| value="default contents"/> | |||
| </target> | |||
| </project> | |||