Browse Source

Stop scanning directories where we match the directory but know based

on the pattern that we will never match any of its contents.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277767 13f79535-47bb-0310-9956-ffa450edef68
master
Matthew Jason Benson 20 years ago
parent
commit
7411f2b4a4
1 changed files with 19 additions and 5 deletions
  1. +19
    -5
      src/main/org/apache/tools/ant/DirectoryScanner.java

+ 19
- 5
src/main/org/apache/tools/ant/DirectoryScanner.java View File

@@ -1117,7 +1117,7 @@ public class DirectoryScanner
dirsDeselected.addElement(name);
}
everythingIncluded &= included;
if (fast && (included || couldHoldIncluded(name))) {
if (fast && couldHoldIncluded(name)) {
scandir(file, name + File.separator, fast);
}
}
@@ -1156,15 +1156,29 @@ public class DirectoryScanner
*/
protected boolean couldHoldIncluded(String name) {
for (int i = 0; i < includes.length; i++) {
if (matchPatternStart(includes[i], name, isCaseSensitive())) {
if (isMorePowerfulThanExcludes(name, includes[i])) {
return true;
}
if (matchPatternStart(includes[i], name, isCaseSensitive())
&& isMorePowerfulThanExcludes(name, includes[i])
&& isDeeper(includes[i], name)) {
return true;
}
}
return false;
}

/**
* Verify that a pattern specifies files deeper
* than the level of the specified file.
* @param pattern the pattern to check.
* @param name the name to check.
* @return whether the pattern is deeper than the name.
* @since Ant 1.6.3
*/
private boolean isDeeper(String pattern, String name) {
Vector p = SelectorUtils.tokenizePath(pattern);
Vector n = SelectorUtils.tokenizePath(name);
return p.contains("**") || p.size() > n.size();
}

/**
* Find out whether one particular include pattern is more powerful
* than all the excludes.


Loading…
Cancel
Save