Author: bodewig
Date: Fri Aug 21 07:59:55 2009
New Revision: 806442

URL: http://svn.apache.org/viewvc?rev=806442&view=rev
Log:
delete was scanning the same fileset three times, making modified selector 
useless.  PR 43574

Modified:
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
    ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml
    ant/core/trunk/src/tests/antunit/taskdefs/delete-test.xml
    ant/core/trunk/src/tests/antunit/taskdefs/move-test.xml

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java?rev=806442&r1=806441&r2=806442&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 Fri Aug 
21 07:59:55 2009
@@ -597,15 +597,30 @@
                 fs = (FileSet) fs.clone();
                 fs.setProject(getProject());
             }
-            File fsDir = fs.getDir();
+            final File fsDir = fs.getDir();
             if (fsDir == null) {
                 throw new BuildException(
                         "File or Resource without directory or file 
specified");
             } else if (!fsDir.isDirectory()) {
                 handle("Directory does not exist: " + fsDir);
             } else {
-                resourcesToDelete.add(fs);
                 DirectoryScanner ds = fs.getDirectoryScanner();
+                // the previous line has already scanned the
+                // filesystem, in order to avoid a rescan when later
+                // iterating, capture the results now and store them
+                final String[] files = ds.getIncludedFiles();
+                resourcesToDelete.add(new ResourceCollection() {
+                        public boolean isFilesystemOnly() {
+                            return true;
+                        }
+                        public int size() {
+                            return files.length;
+                        }
+                        public Iterator iterator() {
+                            return new FileResourceIterator(getProject(),
+                                                            fsDir, files);
+                        }
+                    });
                 if (includeEmpty) {
                     filesetDirs.add(new ReverseDirs(getProject(), fsDir,
                                                     ds

Modified: ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml?rev=806442&r1=806441&r2=806442&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml (original)
+++ ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml Fri Aug 21 07:59:55 
2009
@@ -150,4 +150,42 @@
       </copy>
     </au:expectfailure>
   </target>
+
+  <target name="testNotModifiedSelector"
+          
description="https://issues.apache.org/bugzilla/show_bug.cgi?id=43574";
+          >
+    <mkdir dir="${input}/images"/>
+    <mkdir dir="${input}/cache"/>
+    <touch file="${input}/images/foo.jpg"/>
+    <mkdir dir="${output}"/>
+    <selector id="cache.selector">
+      <not>
+        <modified update="true"
+                  seldirs="false"
+                  cache="propertyfile"
+                  algorithm="digest"
+                  comparator="equal">
+          <param name="cache.cachefile"
+                 value="${input}/cache/cache.properties"/>
+          <param name="algorithm.algorithm" value="MD5"/>
+        </modified>
+      </not>
+    </selector>
+    <au:assertFileDoesntExist file="${input}/cache/cache.properties"/>
+    <copy todir="${output}" overwrite="true">
+      <fileset dir="${input}/images">
+        <include name="*.jpg" />
+        <selector refid="cache.selector" />
+      </fileset>
+    </copy>
+    <au:assertFileExists file="${input}/cache/cache.properties"/>
+    <au:assertFileDoesntExist file="${output}/foo.jpg"/>
+    <copy todir="${output}" overwrite="true">
+      <fileset dir="${input}/images">
+        <include name="*.jpg" />
+        <selector refid="cache.selector" />
+      </fileset>
+    </copy>
+    <au:assertFileExists file="${output}/foo.jpg"/>
+  </target>
 </project>

Modified: ant/core/trunk/src/tests/antunit/taskdefs/delete-test.xml
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/delete-test.xml?rev=806442&r1=806441&r2=806442&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/delete-test.xml (original)
+++ ant/core/trunk/src/tests/antunit/taskdefs/delete-test.xml Fri Aug 21 
07:59:55 2009
@@ -94,4 +94,41 @@
     <touch file="${output}/foo"/>
     <au:assertFileDoesntExist file="${output}/link" />
   </target>
+
+  <target name="testNotModifiedSelector"
+          
description="https://issues.apache.org/bugzilla/show_bug.cgi?id=43574";
+          >
+    <mkdir dir="${input}/images"/>
+    <mkdir dir="${input}/cache"/>
+    <touch file="${input}/images/foo.jpg"/>
+    <selector id="cache.selector">
+      <not>
+        <modified update="true"
+                  seldirs="false"
+                  cache="propertyfile"
+                  algorithm="digest"
+                  comparator="equal">
+          <param name="cache.cachefile"
+                 value="${input}/cache/cache.properties"/>
+          <param name="algorithm.algorithm" value="MD5"/>
+        </modified>
+      </not>
+    </selector>
+    <au:assertFileDoesntExist file="${input}/cache/cache.properties"/>
+    <delete>
+      <fileset dir="${input}/images">
+        <include name="*.jpg" />
+        <selector refid="cache.selector" />
+      </fileset>
+    </delete>
+    <au:assertFileExists file="${input}/cache/cache.properties"/>
+    <au:assertFileExists file="${input}/images/foo.jpg"/>
+    <delete>
+      <fileset dir="${input}/images">
+        <include name="*.jpg" />
+        <selector refid="cache.selector" />
+      </fileset>
+    </delete>
+    <au:assertFileDoesntExist file="${input}/images/foo.jpg"/>
+  </target>
 </project>

Modified: ant/core/trunk/src/tests/antunit/taskdefs/move-test.xml
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/move-test.xml?rev=806442&r1=806441&r2=806442&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/move-test.xml (original)
+++ ant/core/trunk/src/tests/antunit/taskdefs/move-test.xml Fri Aug 21 07:59:55 
2009
@@ -59,4 +59,43 @@
     <au:assertFileExists file="${output}/foo/bar/baz.txt"/>
   </target>
 
+  <target name="testNotModifiedSelector"
+          
description="https://issues.apache.org/bugzilla/show_bug.cgi?id=43574";
+          >
+    <mkdir dir="${input}/images"/>
+    <mkdir dir="${input}/cache"/>
+    <touch file="${input}/images/foo.jpg"/>
+    <mkdir dir="${output}"/>
+    <selector id="cache.selector">
+      <not>
+        <modified update="true"
+                  seldirs="false"
+                  cache="propertyfile"
+                  algorithm="digest"
+                  comparator="equal">
+          <param name="cache.cachefile"
+                 value="${input}/cache/cache.properties"/>
+          <param name="algorithm.algorithm" value="MD5"/>
+        </modified>
+      </not>
+    </selector>
+    <au:assertFileDoesntExist file="${input}/cache/cache.properties"/>
+    <move todir="${output}" overwrite="true">
+      <fileset dir="${input}/images">
+        <include name="*.jpg" />
+        <selector refid="cache.selector" />
+      </fileset>
+    </move>
+    <au:assertFileExists file="${input}/cache/cache.properties"/>
+    <au:assertFileExists file="${input}/images/foo.jpg"/>
+    <au:assertFileDoesntExist file="${output}/foo.jpg"/>
+    <move todir="${output}" overwrite="true">
+      <fileset dir="${input}/images">
+        <include name="*.jpg" />
+        <selector refid="cache.selector" />
+      </fileset>
+    </move>
+    <au:assertFileDoesntExist file="${input}/images/foo.jpg"/>
+    <au:assertFileExists file="${output}/foo.jpg"/>
+  </target>
 </project>


Reply via email to