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))); + } }