antoine 2003/07/29 03:49:12
Modified: src/main/org/apache/tools/ant DirectoryScanner.java
Log:
do not scan needlessly excluded directories
PR: 21941
Revision Changes Path
1.60 +37 -2 ant/src/main/org/apache/tools/ant/DirectoryScanner.java
Index: DirectoryScanner.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/DirectoryScanner.java,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -r1.59 -r1.60
--- DirectoryScanner.java 29 Jul 2003 09:10:07 -0000 1.59
+++ DirectoryScanner.java 29 Jul 2003 10:49:11 -0000 1.60
@@ -825,7 +825,6 @@
if (fast && hasBeenScanned(vpath)) {
return;
}
-
String[] newfiles = dir.list();
if (newfiles == null) {
@@ -980,12 +979,48 @@
protected boolean couldHoldIncluded(String name) {
for (int i = 0; i < includes.length; i++) {
if (matchPatternStart(includes[i], name, isCaseSensitive)) {
- return true;
+ if (isMorePowerfulThanExcludes(name, includes[i])) {
+ return true;
+ }
}
}
return false;
}
+ /**
+ * find out whether one particular include pattern is more powerful
+ * than all the excludes
+ * note : the power comparison is based on the length of the include
pattern
+ * and of the exclude patterns without the wildcards
+ * ideally the comparison should be done based on the depth
+ * of the match, that is to say how many file separators have been
matched
+ * before the first ** or the end of the pattern
+ *
+ * IMPORTANT : this function should return false "with care"
+ *
+ * @param name the relative path that one want to test
+ * @param includepattern one include pattern
+ * @return true if there is no exclude pattern more powerful than this
include pattern
+ * @since ant1.6
+ */
+ private boolean isMorePowerfulThanExcludes(String name, String
includepattern) {
+ String shortpattern =
SelectorUtils.rtrimWildcardTokens(includepattern);
+ for (int counter=0; counter <excludes.length; counter++) {
+ String shortexclude =
SelectorUtils.rtrimWildcardTokens(excludes[counter]);
+ // here we are checking that the trimmed exclude pattern is not
a plain directory
+ // <exclude name="foo"/> means exclude only the directory foo,
but not its subdirs
+ if (shortexclude.length() < excludes[counter].length()) {
+ if (excludes[counter].charAt(shortexclude.length()) ==
File.separatorChar) {
+ if (matchPath(shortexclude, name, isCaseSensitive)) {
+ if (shortexclude.length() > shortpattern.length()) {
+ return false;
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
/**
* Tests whether or not a name matches against at least one exclude
* pattern.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]