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]

Reply via email to