diff --git a/WHATSNEW b/WHATSNEW
index cbdf1b3fc..0f79bd3fb 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -309,6 +309,11 @@ Fixed bugs:
command failed.
Bugzilla Report 46340.
+ * DirectoryScanner's slow-scanning algorithm that is used when you
+ ask for excluded or not-included files and/or directories could
+ miss some files and directories in the presence of recursive
+ exclude patterns.
+
Other changes:
--------------
diff --git a/src/main/org/apache/tools/ant/DirectoryScanner.java b/src/main/org/apache/tools/ant/DirectoryScanner.java
index 476b855ea..d5a777504 100644
--- a/src/main/org/apache/tools/ant/DirectoryScanner.java
+++ b/src/main/org/apache/tools/ant/DirectoryScanner.java
@@ -1116,7 +1116,7 @@ public class DirectoryScanner
private void processSlowScan(String[] arr) {
for (int i = 0; i < arr.length; i++) {
TokenizedPath path = new TokenizedPath(arr[i]);
- if (!couldHoldIncluded(path)) {
+ if (!couldHoldIncluded(path) || contentsExcluded(path)) {
scandir(new File(basedir, arr[i]), path, false);
}
}
diff --git a/src/tests/antunit/taskdefs/sync-test.xml b/src/tests/antunit/taskdefs/sync-test.xml
index 1dbdbe5f2..7ac988bcb 100644
--- a/src/tests/antunit/taskdefs/sync-test.xml
+++ b/src/tests/antunit/taskdefs/sync-test.xml
@@ -57,7 +57,7 @@
-
+
@@ -72,7 +72,7 @@
-
+
diff --git a/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java b/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java
index 6d4bcca1b..59b8ff25d 100644
--- a/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java
+++ b/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java
@@ -25,9 +25,11 @@ import org.apache.tools.ant.util.SymbolicLinkUtils;
import java.io.File;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
import java.util.Set;
import java.util.TreeSet;
-import java.util.Iterator;
/**
* JUnit 3 testcases for org.apache.tools.ant.DirectoryScanner
@@ -532,4 +534,25 @@ public class DirectoryScannerTest extends BuildFileTest {
}
}
+ public void testRecursiveExcludes() throws Exception {
+ DirectoryScanner ds = new DirectoryScanner();
+ ds.setBasedir(new File(getProject().getBaseDir(), "tmp"));
+ ds.setExcludes(new String[] {"**/beta/**"});
+ ds.scan();
+ List dirs = Arrays.asList(ds.getExcludedDirectories());
+ assertEquals(2, dirs.size());
+ assertTrue("beta is excluded",
+ dirs.contains("alpha/beta".replace('/', File.separatorChar)));
+ assertTrue("gamma is excluded",
+ dirs.contains("alpha/beta/gamma".replace('/',
+ File.separatorChar)));
+ List files = Arrays.asList(ds.getExcludedFiles());
+ assertEquals(2, files.size());
+ assertTrue("beta.xml is excluded",
+ files.contains("alpha/beta/beta.xml"
+ .replace('/', File.separatorChar)));
+ assertTrue("gamma.xml is excluded",
+ files.contains("alpha/beta/gamma/gamma.xml"
+ .replace('/', File.separatorChar)));
+ }
}