Author: mbenson
Date: Wed Sep 14 14:24:08 2005
New Revision: 280944
URL: http://svn.apache.org/viewcvs?rev=280944&view=rev
Log:
delete + resource collection support
Added:
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/BCFileSet.java
(with props)
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/FileSystem.java
(with props)
Modified:
ant/core/trunk/docs/manual/CoreTasks/delete.html
ant/core/trunk/src/etc/testcases/taskdefs/delete.xml
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/DeleteTest.java
Modified: ant/core/trunk/docs/manual/CoreTasks/delete.html
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/CoreTasks/delete.html?rev=280944&r1=280943&r2=280944&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/CoreTasks/delete.html (original)
+++ ant/core/trunk/docs/manual/CoreTasks/delete.html Wed Sep 14 14:24:08 2005
@@ -12,11 +12,14 @@
<h3>Description</h3>
<p>Deletes a single file, a specified directory and all its files and
subdirectories, or a set of files specified by one or more
-<a href="../CoreTypes/fileset.html">FileSet</a>s.
-When specifying a set of files, empty directories are <i>not</i> removed by
-default.
-To remove empty directories, use the <code>includeEmptyDirs</code> attribute.
-</p>
+<a href="../CoreTypes/resources.html#collection">resource collection</a>s.
+The literal implication of <code><fileset></code> is that
+directories are not included; however the removal of empty directories can
+be triggered when using nested filesets by setting the
+<code>includeEmptyDirs</code> attribute to <i>true</i>. Note that this
+attribute is meaningless in the context of any of the various resource
+collection types that <i>do</i> include directories, but that no attempt
+will be made to delete non-empty directories in any case.</p>
<p>
If you use this task to delete temporary files created by editors
and it doesn't seem to work, read up on the
@@ -37,7 +40,7 @@
filename (if the file exists in the current base directory), a
relative-path filename, or a full-path filename.</td>
<td align="center" valign="middle" rowspan="2">At least one of the two,
- unless a <code><fileset></code> is specified.</td>
+ unless nested resource collections are specified
</tr>
<tr>
<td valign="top">dir</td>
@@ -88,7 +91,7 @@
</tr>
<tr>
<td valign="top">includes</td>
- <td valign="top"><em>Deprecated.</em> Use <code><fileset></code>.
+ <td valign="top"><em>Deprecated.</em> Use resource collections.
Comma- or space-separated list of patterns of
files that must be deleted. All files are relative to the directory
specified in <code>dir</code>.</td>
@@ -96,14 +99,14 @@
</tr>
<tr>
<td valign="top">includesfile</td>
- <td valign="top"><em>Deprecated.</em> Use <code><fileset></code>.
+ <td valign="top"><em>Deprecated.</em> Use resource collections.
The name of a file. Each line of
this file is taken to be an include pattern.</td>
<td valign="top" align="center">No</td>
</tr>
<tr>
<td valign="top">excludes</td>
- <td valign="top"><em>Deprecated.</em> Use <code><fileset></code>.
+ <td valign="top"><em>Deprecated.</em> Use resource collections.
Comma- or space-separated list of patterns of
files that must be excluded from the deletion list.
All files are relative to the directory specified in <code>dir</code>.
@@ -112,14 +115,14 @@
</tr>
<tr>
<td valign="top">excludesfile</td>
- <td valign="top"><em>Deprecated.</em> Use <code><fileset></code>.
+ <td valign="top"><em>Deprecated.</em> Use resource collections.
The name of a file. Each line of
this file is taken to be an exclude pattern</td>
<td valign="top" align="center">No</td>
</tr>
<tr>
<td valign="top">defaultexcludes</td>
- <td valign="top"><em>Deprecated.</em> Use <code><fileset></code>.
+ <td valign="top"><em>Deprecated.</em> Use resource collections.
Whether to use <a href="../dirtasks.html#defaultexcludes">
default excludes.</a></td>
<td align="center" valign="top">No, default "true"</td>
@@ -131,7 +134,7 @@
failure to delete a file, this causes the jvm to attempt
to delete the file when the jvm process is terminating.
<em>Since Ant 1.6.2</em></td>
- <td align="center" valign="top">No, default "false".</td>
+ <td align="center" valign="top">No, default "false"</td>
</tr>
</table>
<h3>Examples</h3>
@@ -158,7 +161,7 @@
</pre>
<p>deletes all files and subdirectories of <code>build</code>, without
<code>build</code> itself.</p>
-<hr><p align="center">Copyright © 2000-2002,2004-2005 The Apache Software
Foundation.
+<hr><p align="center">Copyright © 2000-2002, 2004-2005 The Apache
Software Foundation.
All rights Reserved.</p>
</body>
Modified: ant/core/trunk/src/etc/testcases/taskdefs/delete.xml
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/etc/testcases/taskdefs/delete.xml?rev=280944&r1=280943&r2=280944&view=diff
==============================================================================
--- ant/core/trunk/src/etc/testcases/taskdefs/delete.xml (original)
+++ ant/core/trunk/src/etc/testcases/taskdefs/delete.xml Wed Sep 14 14:24:08
2005
@@ -2,27 +2,107 @@
<project name="delete-test" basedir="." default="test1">
- <target name="test1">
- <delete/>
- </target>
+ <property name="dirname" value="taskdefs.tmp" />
+ <property name="dir" location="${dirname}" />
+
+ <macrodef name="expectabsent">
+ <sequential>
+ <fail>
+ <condition>
+ <available file="${dir}" />
+ </condition>
+ </fail>
+ </sequential>
+ </macrodef>
+
+ <macrodef name="expectdirsonly">
+ <sequential>
+ <fail>
+ <condition>
+ <or>
+ <resourcecount when="greater" count="0">
+ <fileset refid="fs" />
+ </resourcecount>
+ <not>
+ <resourcecount count="${srcdirs}">
+ <dirset dir="${dir}" />
+ </resourcecount>
+ </not>
+ </or>
+ </condition>
+ </fail>
+ </sequential>
+ </macrodef>
<target name="init">
- <mkdir dir="taskdefs.tmp" />
- <copy todir="taskdefs.tmp">
- <fileset dir="." excludes="taskdefs.tmp,taskdefs.tmp/**" />
+ <resourcecount property="srcdirs">
+ <dirset dir="${basedir}" />
+ </resourcecount>
+
+ <resourcecount property="srcsize">
+ <files includes="${basedir}/" />
+ </resourcecount>
+
+ <mkdir dir="${dir}" />
+
+ <copy todir="${dir}">
+ <fileset dir="${basedir}" excludes="${dirname},${dirname}/**" />
</copy>
</target>
+ <target name="test1">
+ <delete />
+ </target>
+
<target name="test2" depends="init">
- <delete file="taskdefs.tmp"/>
+ <delete file="${dir}" />
+ <fail>
+ <condition>
+ <not>
+ <resourcecount count="${srcsize}">
+ <files includes="${dir}/" />
+ </resourcecount>
+ </not>
+ </condition>
+ </fail>
</target>
<target name="test4" depends="init">
- <delete dir="taskdefs.tmp"/>
+ <delete dir="${dir}" />
+ <expectabsent />
</target>
- <target name="cleanup">
- <delete dir="taskdefs.tmp" />
+ <target name="test5" depends="init">
+ <delete dir="${dir}" includes="**" />
+ <expectdirsonly />
</target>
+
+ <target name="test6" depends="init">
+ <delete dir="${dir}" includes="**" includeemptydirs="true" />
+ <expectabsent />
+ </target>
+
+ <target name="test7" depends="init">
+ <delete>
+ <fileset id="fs" dir="${dir}" />
+ </delete>
+ <expectdirsonly />
+ </target>
+
+ <target name="test8" depends="init">
+ <delete includeemptydirs="true">
+ <fileset dir="${dir}" />
+ </delete>
+ <expectabsent />
+ </target>
+
+ <target name="test9" depends="init">
+ <delete>
+ <files includes="${dir}/**" />
+ </delete>
+ <expectabsent />
+ </target>
+
+ <target name="cleanup" depends="test4" />
</project>
Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java?rev=280944&r1=280943&r2=280944&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java Wed Sep
14 14:24:08 2005
@@ -19,12 +19,21 @@
import java.io.File;
import java.util.Vector;
+import java.util.Iterator;
+
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.condition.Os;
+import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.PatternSet;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.resources.Sort;
+import org.apache.tools.ant.types.resources.BCFileSet;
+import org.apache.tools.ant.types.resources.FileResource;
+import org.apache.tools.ant.types.resources.comparators.FileSystem;
+import org.apache.tools.ant.types.resources.comparators.Reverse;
import org.apache.tools.ant.types.selectors.AndSelector;
import org.apache.tools.ant.types.selectors.ContainsRegexpSelector;
import org.apache.tools.ant.types.selectors.ContainsSelector;
@@ -70,6 +79,7 @@
private boolean quiet = false;
private boolean failonerror = true;
private boolean deleteOnExit = false;
+ private Vector rcs = new Vector();
/**
* Set the name of a single file to be removed.
@@ -87,6 +97,7 @@
*/
public void setDir(File dir) {
this.dir = dir;
+ getImplicitFileSet().setDir(dir);
}
/**
@@ -156,6 +167,14 @@
}
/**
+ * Add an arbitrary ResourceCollection to be deleted.
+ * @param rc the filesystem-only ResourceCollection.
+ */
+ public void add(ResourceCollection rc) {
+ rcs.add(rc);
+ }
+
+ /**
* add a name entry on the include list
* @return a NameEntry object to be configured
*/
@@ -442,9 +461,9 @@
+ "Use a nested fileset element instead.");
}
- if (file == null && dir == null && filesets.size() == 0) {
+ if (file == null && dir == null && filesets.size() == 0 && rcs.size()
== 0) {
throw new BuildException("At least one of the file or dir "
- + "attributes, or a fileset element, "
+ + "attributes, or a nested resource
collection, "
+ "must be set.");
}
@@ -453,7 +472,6 @@
+ "set to true", getLocation());
}
-
// delete the single file
if (file != null) {
if (file.exists()) {
@@ -497,39 +515,32 @@
}
removeDir(dir);
}
-
- // delete the files in the filesets
+ Path p = new Path(getProject());
+ p.addAll(rcs);
for (int i = 0; i < filesets.size(); i++) {
- FileSet fs = (FileSet) filesets.elementAt(i);
- try {
- DirectoryScanner ds = fs.getDirectoryScanner(getProject());
- String[] files = ds.getIncludedFiles();
- String[] dirs = ds.getIncludedDirectories();
- removeFiles(fs.getDir(getProject()), files, dirs);
- } catch (BuildException be) {
- // directory doesn't exist or is not readable
- if (failonerror) {
- throw be;
- } else {
- log(be.getMessage(),
- quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
- }
- }
+ FileSet fs = (FileSet) filesets.get(i);
+ p.add(includeEmpty ? new BCFileSet(fs) : fs);
}
-
- // delete the files from the default fileset
if (usedMatchingTask && dir != null) {
- try {
- DirectoryScanner ds = super.getDirectoryScanner(dir);
- String[] files = ds.getIncludedFiles();
- String[] dirs = ds.getIncludedDirectories();
- removeFiles(dir, files, dirs);
- } catch (BuildException be) {
- // directory doesn't exist or is not readable
- if (failonerror) {
- throw be;
- } else {
- log(be.getMessage(),
+ //add the files from the default fileset:
+ FileSet implicit = getImplicitFileSet();
+ p.add(includeEmpty ? new BCFileSet(implicit) : implicit);
+ }
+ // delete the files in the resource collections; sort to files, then
dirs
+ Sort s = new Sort();
+ s.add(new Reverse(new FileSystem()));
+ s.add(p);
+ for (Iterator iter = s.iterator(); iter.hasNext();) {
+ FileResource r = (FileResource) iter.next();
+ if (!(r.isDirectory()) || r.getFile().list().length == 0) {
+ log("Deleting " + r, verbosity);
+ if (!delete(r.getFile())) {
+ String message = "Unable to delete "
+ + (r.isDirectory() ? "directory " : "file ") + r;
+ if (failonerror) {
+ throw new BuildException(message);
+ }
+ log(message,
quiet ? Project.MSG_VERBOSE : Project.MSG_WARN);
}
}
Added:
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/BCFileSet.java
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/types/resources/BCFileSet.java?rev=280944&view=auto
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/types/resources/BCFileSet.java
(added)
+++ ant/core/trunk/src/main/org/apache/tools/ant/types/resources/BCFileSet.java
Wed Sep 14 14:24:08 2005
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.resources;
+
+import java.util.Iterator;
+
+import org.apache.tools.ant.types.FileSet;
+
+/**
+ * Utility FileSet that includes directories for backwards-compatibility
+ * with certain tasks e.g. Delete.
+ * @since Ant 1.7
+ */
+public class BCFileSet extends FileSet {
+ /**
+ * Default constructor.
+ */
+ public BCFileSet() {
+ }
+
+ /**
+ * Construct a new BCFileSet from the specified FileSet.
+ * @param fs the FileSet from which to inherit config.
+ */
+ public BCFileSet(FileSet fs) {
+ super(fs);
+ }
+
+ /**
+ * Fulfill the ResourceCollection contract.
+ * @return an Iterator of Resources.
+ * @since Ant 1.7
+ */
+ public Iterator iterator() {
+ if (isReference()) {
+ return ((FileSet) getRef(getProject())).iterator();
+ }
+ FileResourceIterator result = new FileResourceIterator(getDir());
+ result.addFiles(getDirectoryScanner().getIncludedFiles());
+ result.addFiles(getDirectoryScanner().getIncludedDirectories());
+ return result;
+ }
+
+ /**
+ * Fulfill the ResourceCollection contract.
+ * @return number of elements as int.
+ * @since Ant 1.7
+ */
+ public int size() {
+ if (isReference()) {
+ return ((FileSet) getRef(getProject())).size();
+ }
+ return getDirectoryScanner().getIncludedFilesCount()
+ + getDirectoryScanner().getIncludedDirsCount();
+ }
+
+}
Propchange:
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/BCFileSet.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/FileSystem.java
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/FileSystem.java?rev=280944&view=auto
==============================================================================
---
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/FileSystem.java
(added)
+++
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/FileSystem.java
Wed Sep 14 14:24:08 2005
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.resources.comparators;
+
+import java.io.File;
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.resources.FileResource;
+import org.apache.tools.ant.util.FileUtils;
+
+/**
+ * Compares filesystem Resources.
+ * @since Ant 1.7
+ */
+public class FileSystem extends ResourceComparator {
+ private static FileUtils fileUtils = FileUtils.getFileUtils();
+
+ /**
+ * Compare two Resources.
+ * @param foo the first Resource.
+ * @param bar the second Resource.
+ * @return a negative integer, zero, or a positive integer as the first
+ * argument is less than, equal to, or greater than the second.
+ * @throws ClassCastException if either resource is not an instance of
FileResource.
+ */
+ protected int resourceCompare(Resource foo, Resource bar) {
+ File foofile = ((FileResource) foo).getFile();
+ File barfile = ((FileResource) bar).getFile();
+ return foofile.equals(barfile) ? 0
+ : fileUtils.isLeadingPath(foofile, barfile) ? -1
+ : fileUtils.normalize(foofile.getAbsolutePath()).compareTo(
+ fileUtils.normalize(barfile.getAbsolutePath()));
+ }
+
+}
Propchange:
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/FileSystem.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java?rev=280944&r1=280943&r2=280944&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java Wed Sep 14
14:24:08 2005
@@ -1342,6 +1342,27 @@
}
/**
+ * Learn whether one path "leads" another.
+ * @param leading The leading path, must not be null, must be absolute.
+ * @param path The path to remove from, must not be null, must be absolute.
+ * @return true if path starts with leading; false otherwise.
+ * @since Ant 1.7
+ */
+ public boolean isLeadingPath(File leading, File path) {
+ String l = normalize(leading.getAbsolutePath()).getAbsolutePath();
+ String p = normalize(path.getAbsolutePath()).getAbsolutePath();
+ if (l.equals(p)) {
+ return true;
+ }
+ // ensure that l ends with a /
+ // so we never think /foo was a parent directory of /foobar
+ if (!l.endsWith(File.separator)) {
+ l += File.separator;
+ }
+ return p.startsWith(l);
+ }
+
+ /**
* Constructs a <code>file:</code> URI that represents the
* external form of the given pathname.
*
Modified:
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/DeleteTest.java
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/DeleteTest.java?rev=280944&r1=280943&r2=280944&view=diff
==============================================================================
--- ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/DeleteTest.java
(original)
+++ ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/DeleteTest.java
Wed Sep 14 14:24:08 2005
@@ -42,8 +42,23 @@
public void test2() {
executeTarget("test2");
}
-
+//where oh where has my test case 3 gone?
public void test4() {
executeTarget("test4");
+ }
+ public void test5() {
+ executeTarget("test5");
+ }
+ public void test6() {
+ executeTarget("test6");
+ }
+ public void test7() {
+ executeTarget("test7");
+ }
+ public void test8() {
+ executeTarget("test8");
+ }
+ public void test9() {
+ executeTarget("test9");
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]