You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by mb...@apache.org on 2005/03/05 00:41:21 UTC

cvs commit: ant/src/testcases/org/apache/tools/ant DirectoryScannerTest.java

mbenson     2005/03/04 15:41:21

  Modified:    src/main/org/apache/tools/ant DirectoryScanner.java
               src/testcases/org/apache/tools/ant DirectoryScannerTest.java
  Log:
  By popular demand:  Do not scan directories if their contents are excluded.
  Changed scannedDirs from a cache to a result and added a gettor method
  with a warning in the Javadoc that it was a testing method only.
  
  Revision  Changes    Path
  1.93      +27 -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.92
  retrieving revision 1.93
  diff -u -r1.92 -r1.93
  --- DirectoryScanner.java	3 Mar 2005 20:42:43 -0000	1.92
  +++ DirectoryScanner.java	4 Mar 2005 23:41:21 -0000	1.93
  @@ -920,6 +920,7 @@
           dirsExcluded     = new Vector();
           dirsDeselected   = new Vector();
           everythingIncluded = (basedir != null);
  +        scannedDirs.clear();
       }
   
       /**
  @@ -1118,7 +1119,7 @@
               dirsDeselected.addElement(name);
           }
           everythingIncluded &= included;
  -        if (fast && couldHoldIncluded(name)) {
  +        if (fast && couldHoldIncluded(name) && !contentsExcluded(name)) {
               scandir(file, name + File.separator, fast);
           }
       }
  @@ -1207,6 +1208,22 @@
       }
   
       /**
  +     * Test whether all contents of the specified directory must be excluded.
  +     * @param name the directory name to check.
  +     */
  +    private boolean contentsExcluded(String name) {
  +        name = (name.endsWith(File.separator)) ? name : name + File.separator;
  +        for (int i = 0; i < excludes.length; i++) {
  +            String e = excludes[i];
  +            if (e.endsWith(File.separator + "**") && SelectorUtils.matchPath(
  +                e.substring(0, e.length() - 2), name, isCaseSensitive())) {
  +                return true;
  +            }
  +        }
  +        return false;
  +    }
  +
  +    /**
        * Test whether or not a name matches against at least one exclude
        * pattern.
        *
  @@ -1566,13 +1583,21 @@
       }
   
       /**
  +     * This method is of interest for testing purposes.  The returned
  +     * Set is live and should not be modified.
  +     * @return the Set of relative directory names that have been scanned.
  +     */
  +    public Set getScannedDirs() {
  +        return scannedDirs;
  +    }
  +
  +    /**
        * Clear internal caches.
        *
        * @since Ant 1.6
        */
       private synchronized void clearCaches() {
           fileListMap.clear();
  -        scannedDirs.clear();
           includeNonPatterns.clear();
           excludeNonPatterns.clear();
           includePatterns = null;
  
  
  
  1.33      +14 -0     ant/src/testcases/org/apache/tools/ant/DirectoryScannerTest.java
  
  Index: DirectoryScannerTest.java
  ===================================================================
  RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/DirectoryScannerTest.java,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- DirectoryScannerTest.java	25 Feb 2005 13:15:41 -0000	1.32
  +++ DirectoryScannerTest.java	4 Mar 2005 23:41:21 -0000	1.33
  @@ -26,6 +26,7 @@
   import junit.framework.AssertionFailedError;
   import java.io.File;
   import java.io.IOException;
  +import java.util.Set;
   import java.util.TreeSet;
   import java.util.Iterator;
   
  @@ -397,6 +398,19 @@
   
       }
   
  +    public void testIsExcludedDirectoryScanned() {
  +        getProject().executeTarget("children-of-excluded-dir-setup");
  +        DirectoryScanner ds = new DirectoryScanner();
  +        ds.setBasedir(new File(getProject().getBaseDir(), "tmp"));
  +        ds.setExcludes(new String[] {"**/gamma/**"});
  +        ds.setFollowSymlinks(false);
  +        ds.scan();
  +        Set set = ds.getScannedDirs();
  +        assertFalse("empty set", set.isEmpty());
  +        String s = "alpha/beta/gamma/".replace('/', File.separatorChar);
  +        assertFalse("scanned " + s, set.contains(s));
  +    }
  +
       private void compareFiles(DirectoryScanner ds, String[] expectedFiles,
                                 String[] expectedDirectories) {
           String includedFiles[] = ds.getIncludedFiles();
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: cvs commit: ant/src/testcases/org/apache/tools/ant DirectoryScannerTest.java

Posted by Antoine Levy-Lambert <an...@gmx.de>.
Hello Matt,

this change could speed up directory scanning very much.
Let's see what it is going to do.

Cheers,

Antoine

mbenson@apache.org wrote:

>mbenson     2005/03/04 15:41:21
>
>  Modified:    src/main/org/apache/tools/ant DirectoryScanner.java
>               src/testcases/org/apache/tools/ant DirectoryScannerTest.java
>  Log:
>  By popular demand:  Do not scan directories if their contents are excluded.
>  Changed scannedDirs from a cache to a result and added a gettor method
>  with a warning in the Javadoc that it was a testing method only.
>  
>  
>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org