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/05/23 21:31:14 UTC

cvs commit: ant/src/etc/testcases/core directoryscanner.xml

mbenson     2005/05/23 12:31:14

  Modified:    src/main/org/apache/tools/ant DirectoryScanner.java
               src/main/org/apache/tools/ant/types/selectors
                        SelectorUtils.java
               src/testcases/org/apache/tools/ant DirectoryScannerTest.java
               src/etc/testcases/core directoryscanner.xml
  Log:
  allow absolute include paths & no basedir for Directory scanning
  
  Revision  Changes    Path
  1.101     +71 -35    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.100
  retrieving revision 1.101
  diff -u -r1.100 -r1.101
  --- DirectoryScanner.java	10 May 2005 07:37:04 -0000	1.100
  +++ DirectoryScanner.java	23 May 2005 19:31:13 -0000	1.101
  @@ -35,6 +35,7 @@
   import org.apache.tools.ant.types.selectors.FileSelector;
   import org.apache.tools.ant.types.selectors.SelectorUtils;
   import org.apache.tools.ant.types.selectors.SelectorScanner;
  +import org.apache.tools.ant.types.resources.FileResource;
   import org.apache.tools.ant.util.FileUtils;
   
   /**
  @@ -555,11 +556,11 @@
        * <code>File.separatorChar</code>.
        *
        * @param basedir The base directory to scan.
  -     *                Must not be <code>null</code>.
        */
       public void setBasedir(String basedir) {
  -        setBasedir(new File(basedir.replace('/', File.separatorChar).replace(
  -                '\\', File.separatorChar)));
  +        setBasedir(basedir == null ? (File) null
  +            : new File(basedir.replace('/', File.separatorChar).replace(
  +            '\\', File.separatorChar)));
       }
   
       /**
  @@ -567,7 +568,6 @@
        * scanned recursively.
        *
        * @param basedir The base directory for scanning.
  -     *                Should not be <code>null</code>.
        */
       public synchronized void setBasedir(File basedir) {
           this.basedir = basedir;
  @@ -577,7 +577,7 @@
        * Return the base directory to be scanned.
        * This is the directory which is scanned recursively.
        *
  -     * @return the base directory to be scanned
  +     * @return the base directory to be scanned.
        */
       public synchronized File getBasedir() {
           return basedir;
  @@ -741,13 +741,14 @@
       }
   
       /**
  -     * Scan the base directory for files which match at least one include
  -     * pattern and don't match any exclude patterns. If there are selectors
  -     * then the files must pass muster there, as well.
  +     * Scan for files which match at least one include pattern and don't match
  +     * any exclude patterns. If there are selectors then the files must pass
  +     * muster there, as well.  Scans under basedir, if set; otherwise the
  +     * include patterns without leading wildcards specify the absolute paths of
  +     * the files that may be included.
        *
        * @exception IllegalStateException if the base directory was set
  -     *            incorrectly (i.e. if it is <code>null</code>, doesn't exist,
  -     *            or isn't a directory).
  +     *            incorrectly (i.e. if it doesn't exist or isn't a directory).
        */
       public void scan() throws IllegalStateException {
           synchronized (scanLock) {
  @@ -778,19 +779,22 @@
                   excludes = nullExcludes ? new String[0] : excludes;
   
                   if (basedir == null) {
  -                    illegal = new IllegalStateException("No basedir set");
  +                    // if no basedir and no includes, nothing to do:
  +                    if (nullIncludes) {
  +                        return;
  +                    }
                   } else {
                       if (!basedir.exists()) {
                           illegal = new IllegalStateException("basedir " + basedir
  -                                                        + " does not exist");
  +                                                            + " does not exist");
                       }
                       if (!basedir.isDirectory()) {
                           illegal = new IllegalStateException("basedir " + basedir
  -                                                        + " is not a directory");
  +                                                            + " is not a directory");
  +                    }
  +                    if (illegal != null) {
  +                        throw illegal;
                       }
  -                }
  -                if (illegal != null) {
  -                    throw illegal;
                   }
                   if (isIncluded("")) {
                       if (!isExcluded("")) {
  @@ -828,10 +832,21 @@
           // put in the newroots vector the include patterns without
           // wildcard tokens
           for (int icounter = 0; icounter < includes.length; icounter++) {
  +            if (FileUtils.isAbsolutePath(includes[icounter])) {
  +                //skip abs. paths not under basedir, if set:
  +                if (basedir != null
  +                    && !SelectorUtils.matchPatternStart(includes[icounter],
  +                    basedir.getAbsolutePath(), isCaseSensitive())) {
  +                    continue;
  +                }
  +            } else if (basedir == null) {
  +                //skip non-abs. paths if basedir == null:
  +                continue;
  +            }
               newroots.put(SelectorUtils.rtrimWildcardTokens(
                   includes[icounter]), includes[icounter]);
           }
  -        if (newroots.containsKey("")) {
  +        if (newroots.containsKey("") && basedir != null) {
               // we are going to scan everything anyway
               scandir(basedir, "", true);
           } else {
  @@ -840,13 +855,18 @@
               Enumeration enum2 = newroots.keys();
   
               File canonBase = null;
  -            try {
  -                canonBase = basedir.getCanonicalFile();
  -            } catch (IOException ex) {
  -                throw new BuildException(ex);
  +            if (basedir != null) {
  +                try {
  +                    canonBase = basedir.getCanonicalFile();
  +                } catch (IOException ex) {
  +                    throw new BuildException(ex);
  +                }
               }
               while (enum2.hasMoreElements()) {
                   String currentelement = (String) enum2.nextElement();
  +                if (basedir == null && !FileUtils.isAbsolutePath(currentelement)) {
  +                    continue;
  +                }
                   String originalpattern = (String) newroots.get(currentelement);
                   File myfile = new File(basedir, currentelement);
   
  @@ -855,15 +875,15 @@
                       // the results to show what's really on the disk, so
                       // we need to double check.
                       try {
  -                        File canonFile = myfile.getCanonicalFile();
  -                        String path = FILE_UTILS.removeLeadingPath(canonBase,
  -                                                                  canonFile);
  +                        String path = (basedir == null)
  +                            ? myfile.getCanonicalPath()
  +                            : FILE_UTILS.removeLeadingPath(canonBase,
  +                            myfile.getCanonicalFile());
                           if (!path.equals(currentelement) || ON_VMS) {
                               myfile = findFile(basedir, currentelement, true);
  -                            if (myfile != null) {
  -                                currentelement =
  -                                    FILE_UTILS.removeLeadingPath(basedir,
  -                                                                 myfile);
  +                            if (myfile != null && basedir != null) {
  +                                currentelement = FILE_UTILS.removeLeadingPath(
  +                                    basedir, myfile);
                               }
                           }
                       } catch (IOException ex) {
  @@ -875,8 +895,9 @@
                       if (f != null && f.exists()) {
                           // adapt currentelement to the case we've
                           // actually found
  -                        currentelement = FILE_UTILS.removeLeadingPath(basedir,
  -                                                                     f);
  +                        currentelement = (basedir == null)
  +                            ? f.getAbsolutePath()
  +                            : FILE_UTILS.removeLeadingPath(basedir, f);
                           myfile = f;
                       }
                   }
  @@ -1475,9 +1496,7 @@
        * @since Ant 1.5.2
        */
       public synchronized Resource getResource(String name) {
  -        File f = FILE_UTILS.resolveFile(basedir, name);
  -        return new Resource(name, f.exists(), f.lastModified(),
  -                            f.isDirectory(), f.length());
  +        return new FileResource(basedir, name);
       }
   
       /**
  @@ -1510,6 +1529,21 @@
        * @since Ant 1.6.3
        */
       private File findFile(File base, String path, boolean cs) {
  +        if (FileUtils.isAbsolutePath(path)) {
  +            if (base == null) {
  +                String[] s = FILE_UTILS.dissect(path);
  +                base = new File(s[0]);
  +                path = s[1];
  +            } else {
  +                File f = FILE_UTILS.normalize(path);
  +                String s = FILE_UTILS.removeLeadingPath(base, f);
  +                if (s.equals(f.getAbsolutePath())) {
  +                    //removing base from path yields no change; path not child of base
  +                    return null;
  +                }
  +                path = s;
  +            }
  +        }
           return findFile(base, SelectorUtils.tokenizePath(path), cs);
       }
   
  @@ -1528,6 +1562,10 @@
           if (pathElements.size() == 0) {
               return base;
           }
  +        String current = (String) pathElements.remove(0);
  +        if (base == null) {
  +            return findFile(new File(current), pathElements, cs);
  +        }
           if (!base.isDirectory()) {
               return null;
           }
  @@ -1536,8 +1574,6 @@
               throw new BuildException("IO error scanning directory "
                                        + base.getAbsolutePath());
           }
  -        String current = (String) pathElements.remove(0);
  -
           boolean[] matchCase = cs ? CS_SCAN_ONLY : CS_THEN_NON_CS;
           for (int i = 0; i < matchCase.length; i++) {
               for (int j = 0; j < files.length; j++) {
  
  
  
  1.21      +22 -12    ant/src/main/org/apache/tools/ant/types/selectors/SelectorUtils.java
  
  Index: SelectorUtils.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/selectors/SelectorUtils.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- SelectorUtils.java	9 Mar 2004 16:48:47 -0000	1.20
  +++ SelectorUtils.java	23 May 2005 19:31:14 -0000	1.21
  @@ -22,6 +22,7 @@
   import java.util.Vector;
   
   import org.apache.tools.ant.types.Resource;
  +import org.apache.tools.ant.util.FileUtils;
   
   /**
    * <p>This is a utility class used by selectors and DirectoryScanner. The
  @@ -36,6 +37,7 @@
   public final class SelectorUtils {
   
       private static SelectorUtils instance = new SelectorUtils();
  +    private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
   
       /**
        * Private Constructor
  @@ -164,15 +166,6 @@
        */
       public static boolean matchPath(String pattern, String str,
                                       boolean isCaseSensitive) {
  -        // When str starts with a File.separator, pattern has to start with a
  -        // File.separator.
  -        // When pattern starts with a File.separator, str has to start with a
  -        // File.separator.
  -        if (str.startsWith(File.separator)
  -                != pattern.startsWith(File.separator)) {
  -            return false;
  -        }
  -
           String[] patDirs = tokenizePathAsArray(pattern);
           String[] strDirs = tokenizePathAsArray(str);
   
  @@ -502,6 +495,11 @@
        */
       public static Vector tokenizePath (String path, String separator) {
           Vector ret = new Vector();
  +        if (FileUtils.isAbsolutePath(path)) {
  +            String[] s = FILE_UTILS.dissect(path);
  +            ret.add(s[0]);
  +            path = s[1];
  +        }
           StringTokenizer st = new StringTokenizer(path, separator);
           while (st.hasMoreTokens()) {
               ret.addElement(st.nextToken());
  @@ -513,6 +511,12 @@
        * Same as {@link #tokenizePath tokenizePath} but hopefully faster.
        */
       private static String[] tokenizePathAsArray(String path) {
  +        String root = null;
  +        if (FileUtils.isAbsolutePath(path)) {
  +            String[] s = FILE_UTILS.dissect(path);
  +            root = s[0];
  +            path = s[1];
  +        }
           char sep = File.separatorChar;
           int start = 0;
           int len = path.length();
  @@ -528,8 +532,14 @@
           if (len != start) {
               count++;
           }
  -        String[] l = new String[count];
  -        count = 0;
  +        String[] l = new String[count + ((root == null) ? 0 : 1)];
  +
  +        if (root != null) {
  +            l[0] = root;
  +            count = 1;
  +        } else {
  +            count = 0;
  +        }
           start = 0;
           for (int pos = 0; pos < len; pos++) {
               if (path.charAt(pos) == sep) {
  @@ -643,7 +653,7 @@
               if (hasWildcards((String) v.elementAt(counter))) {
                   break;
               }
  -            if (counter > 0) {
  +            if (counter > 0 && sb.charAt(sb.length() - 1) != File.separatorChar) {
                   sb.append(File.separator);
               }
               sb.append((String) v.elementAt(counter));
  
  
  
  1.35      +69 -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.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- DirectoryScannerTest.java	7 Mar 2005 23:25:51 -0000	1.34
  +++ DirectoryScannerTest.java	23 May 2005 19:31:14 -0000	1.35
  @@ -415,6 +415,75 @@
           assertFalse("scanned " + s, set.contains(s));
       }
   
  +    public void testAbsolute1() {
  +        getProject().executeTarget("extended-setup");
  +        DirectoryScanner ds = new DirectoryScanner();
  +        String tmpdir = getProject().getBaseDir().getAbsolutePath().replace(
  +            File.separatorChar, '/') + "/tmp";
  +        ds.setIncludes(new String[] {tmpdir + "/**/*"});
  +        ds.scan();
  +        compareFiles(ds, new String[] {tmpdir + "/alpha/beta/beta.xml",
  +                                       tmpdir + "/alpha/beta/gamma/gamma.xml",
  +                                       tmpdir + "/delta/delta.xml"},
  +                     new String[] {tmpdir + "/alpha",
  +                                   tmpdir + "/alpha/beta",
  +                                   tmpdir + "/alpha/beta/gamma",
  +                                   tmpdir + "/delta"});
  +    }
  +
  +    public void testAbsolute2() {
  +        getProject().executeTarget("setup");
  +        DirectoryScanner ds = new DirectoryScanner();
  +        ds.setIncludes(new String[] {"alpha/**", "alpha/beta/gamma/**"});
  +        ds.scan();
  +        String[] mt = new String[0];
  +        compareFiles(ds, mt, mt);
  +    }
  +
  +    public void testAbsolute3() {
  +        getProject().executeTarget("extended-setup");
  +        DirectoryScanner ds = new DirectoryScanner();
  +        String tmpdir = getProject().getBaseDir().getAbsolutePath().replace(
  +            File.separatorChar, '/') + "/tmp";
  +        ds.setIncludes(new String[] {tmpdir + "/**/*"});
  +        ds.setExcludes(new String[] {"**/alpha",
  +                                     "**/delta/*"});
  +        ds.scan();
  +        compareFiles(ds, new String[] {tmpdir + "/alpha/beta/beta.xml",
  +                                       tmpdir + "/alpha/beta/gamma/gamma.xml"},
  +                     new String[] {tmpdir + "/alpha/beta",
  +                                   tmpdir + "/alpha/beta/gamma",
  +                                   tmpdir + "/delta"});
  +    }
  +
  +    public void testAbsolute4() {
  +        getProject().executeTarget("extended-setup");
  +        DirectoryScanner ds = new DirectoryScanner();
  +        String tmpdir = getProject().getBaseDir().getAbsolutePath().replace(
  +            File.separatorChar, '/') + "/tmp";
  +        ds.setIncludes(new String[] {tmpdir + "/alpha/beta/**/*",
  +                                     tmpdir + "/delta/*"});
  +        ds.setExcludes(new String[] {"**/beta.xml"});
  +        ds.scan();
  +        compareFiles(ds, new String[] {tmpdir + "/alpha/beta/gamma/gamma.xml",
  +                                       tmpdir + "/delta/delta.xml"},
  +                     new String[] {tmpdir + "/alpha/beta/gamma"});
  +    }
  +
  +    public void testAbsolute5() {
  +        //testing drive letter search from root:
  +        if (!(Os.isFamily("dos") || Os.isFamily("netware"))) {
  +            return;
  +        }
  +        DirectoryScanner ds = new DirectoryScanner();
  +        String pattern = new File(File.separator).getAbsolutePath().toUpperCase() + "*";
  +        ds.setIncludes(new String[] {pattern});
  +        ds.scan();
  +        //if this is our context we assume there must be something here:
  +        assertTrue("should have at least one resident file",
  +            ds.getIncludedFilesCount() + ds.getIncludedDirsCount() > 0);
  +    }
  +
       private void compareFiles(DirectoryScanner ds, String[] expectedFiles,
                                 String[] expectedDirectories) {
           String includedFiles[] = ds.getIncludedFiles();
  
  
  
  1.4       +9 -2      ant/src/etc/testcases/core/directoryscanner.xml
  
  Index: directoryscanner.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/core/directoryscanner.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- directoryscanner.xml	28 Jul 2003 22:07:47 -0000	1.3
  +++ directoryscanner.xml	23 May 2005 19:31:14 -0000	1.4
  @@ -1,14 +1,20 @@
   <project name="directoryscanner-test" basedir=".">
  +
       <property name="tmp.dir" location="tmp"/>
  +
       <target name="setup">
           <mkdir dir="${tmp.dir}/alpha/beta/gamma"/>
           <touch file="${tmp.dir}/alpha/beta/gamma/gamma.xml"/>
           <touch file="${tmp.dir}/alpha/beta/beta.xml"/>
       </target>
  -    <target name="children-of-excluded-dir-setup" depends="setup">
  +
  +    <target name="extended-setup" depends="setup">
           <mkdir dir="${tmp.dir}/delta"/>
           <touch file="${tmp.dir}/delta/delta.xml"/>
       </target>
  +
  +    <target name="children-of-excluded-dir-setup" depends="extended-setup" />
  +
       <target name="cleanup">
           <delete dir="${tmp.dir}" quiet="true"/>
       </target>
  @@ -19,4 +25,5 @@
           <symlink link="${tmp.dir}/alpha/beta" resource="${tmp.dir}/epsilon"/>
           <touch file="${tmp.dir}/alpha/beta/gamma/gamma.xml"/>
       </target>
  -</project>
  \ No newline at end of file
  +
  +</project>
  
  
  

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