You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by bo...@apache.org on 2002/05/10 14:53:58 UTC

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

bodewig     02/05/10 05:53:58

  Modified:    .        Tag: ANT_15_BRANCH WHATSNEW
               docs/manual/CoreTypes Tag: ANT_15_BRANCH dirset.html
                        fileset.html
               src/main/org/apache/tools/ant Tag: ANT_15_BRANCH
                        DirectoryScanner.java
               src/main/org/apache/tools/ant/types Tag: ANT_15_BRANCH
                        AbstractFileSet.java
               src/main/org/apache/tools/ant/util Tag: ANT_15_BRANCH
                        FileUtils.java
               src/testcases/org/apache/tools/ant Tag: ANT_15_BRANCH
                        DirectoryScannerTest.java
  Log:
  Add a new followsymlinks attribute to fileset and friends.
  
  Based on a submission by:          Patrick (Gus) Heck <pa...@olin.edu>
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.263.2.10 +3 -0      jakarta-ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/WHATSNEW,v
  retrieving revision 1.263.2.9
  retrieving revision 1.263.2.10
  diff -u -r1.263.2.9 -r1.263.2.10
  --- WHATSNEW	10 May 2002 11:33:54 -0000	1.263.2.9
  +++ WHATSNEW	10 May 2002 12:53:57 -0000	1.263.2.10
  @@ -36,6 +36,9 @@
   
   * z/OS now gets detected by the os condition.
   
  +* <fileset> and <dirset> now have an optional followsymlink attribute
  +that can prevent Ant from following symbolic links on some platforms.
  +
   Changes from Ant 1.4.1 to 1.5beta1
   ==================================
   
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.4.2.1   +6 -0      jakarta-ant/docs/manual/CoreTypes/dirset.html
  
  Index: dirset.html
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/docs/manual/CoreTypes/dirset.html,v
  retrieving revision 1.4
  retrieving revision 1.4.2.1
  diff -u -r1.4 -r1.4.2.1
  --- dirset.html	23 Apr 2002 13:49:47 -0000	1.4
  +++ dirset.html	10 May 2002 12:53:57 -0000	1.4.2.1
  @@ -63,6 +63,12 @@
        <code>false</code>|<code>no</code>|<code>off</code>).</td>
       <td valign="top" align="center">No; defaults to true.</td>
     </tr>
  +  <tr>
  +    <td valign="top">followsymlinks</td>
  +    <td valign="top">Shall symbolic links be followed? Defaults to
  +      true. See <a href="fileset.html#symlink">fileset's documentation</a>.</td>
  +    <td valign="top" align="center">No</td>
  +  </tr>
   </table>
   
   <h4>Examples</h4>
  
  
  
  1.12.2.2  +12 -0     jakarta-ant/docs/manual/CoreTypes/fileset.html
  
  Index: fileset.html
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/docs/manual/CoreTypes/fileset.html,v
  retrieving revision 1.12.2.1
  retrieving revision 1.12.2.2
  diff -u -r1.12.2.1 -r1.12.2.2
  --- fileset.html	3 May 2002 09:40:30 -0000	1.12.2.1
  +++ fileset.html	10 May 2002 12:53:57 -0000	1.12.2.2
  @@ -68,7 +68,19 @@
           Defaults to true.</td>
       <td valign="top" align="center">No</td>
     </tr>
  +  <tr>
  +    <td valign="top">followsymlinks</td>
  +    <td valign="top">Shall symbolic links be followed? Defaults to
  +      true. See <a href="symlink">below</a>.</td>
  +    <td valign="top" align="center">No</td>
  +  </tr>
   </table>
  +
  +<p><a name="symlink"><b>Note</b></a>: All files/directories for which
  +the canonical path is different from its path are considered symbolic
  +links.  On Unix systems this usually means the file really is a
  +symbolic links but it may lead to false results on other
  +platforms.</p>
   
   <h4>Examples</h4>
   <blockquote><pre>
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.25.2.1  +48 -0     jakarta-ant/src/main/org/apache/tools/ant/DirectoryScanner.java
  
  Index: DirectoryScanner.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/DirectoryScanner.java,v
  retrieving revision 1.25
  retrieving revision 1.25.2.1
  diff -u -r1.25 -r1.25.2.1
  --- DirectoryScanner.java	30 Apr 2002 22:38:35 -0000	1.25
  +++ DirectoryScanner.java	10 May 2002 12:53:57 -0000	1.25.2.1
  @@ -55,12 +55,14 @@
   package org.apache.tools.ant;
   
   import java.io.File;
  +import java.io.IOException;
   import java.util.Vector;
   import java.util.StringTokenizer;
   
   import org.apache.tools.ant.types.selectors.SelectorScanner;
   import org.apache.tools.ant.types.selectors.FileSelector;
   import org.apache.tools.ant.types.selectors.SelectorUtils;
  +import org.apache.tools.ant.util.FileUtils;
   
   /**
    * Class for scanning a directory for files/directories which match certain
  @@ -229,6 +231,16 @@
        */
       protected boolean isCaseSensitive = true;
   
  +    /**
  +     * Whether or not symbolic links should be followed.
  +     *
  +     * @since Ant 1.5
  +     */
  +    private boolean followSymlinks = true;
  +
  +    /** Helper. */
  +    private static final FileUtils fileUtils = FileUtils.newFileUtils();
  +
       /** Whether or not everything tested so far has been included. */
       protected boolean everythingIncluded = true;
   
  @@ -411,6 +423,15 @@
       }
   
       /**
  +     * Sets whether or not symbolic links should be followed.
  +     *
  +     * @param followSymlinks whether or not symbolic links should be followed
  +     */
  +    public void setFollowSymlinks(boolean followSymlinks) {
  +        this.followSymlinks = followSymlinks;
  +    }
  +
  +    /**
        * Sets the list of include patterns to use. All '/' and '\' characters
        * are replaced by <code>File.separatorChar</code>, so the separator used
        * need not match <code>File.separatorChar</code>.
  @@ -617,6 +638,33 @@
                */
               throw new BuildException("IO error scanning directory "
                                        + dir.getAbsolutePath());
  +        }
  +
  +        if (!followSymlinks) {
  +            Vector noLinks = new Vector();
  +            for (int i = 0; i < newfiles.length; i++) {
  +                try {
  +                    if (fileUtils.isSymbolicLink(dir, newfiles[i])) {
  +                        String name = vpath + newfiles[i];
  +                        File   file = new File(dir, newfiles[i]);
  +                        if (file.isDirectory()) {
  +                            dirsExcluded.addElement(name);
  +                        } else {
  +                            filesExcluded.addElement(name);
  +                        }
  +                    } else {
  +                        noLinks.add(newfiles[i]);
  +                    }
  +                } catch (IOException ioe) {
  +                    String msg = "IOException caught while checking "
  +                        + "for links, couldn't get cannonical path!";
  +                    // will be caught and redirected to Ant's logging system
  +                    System.err.println(msg);
  +                    noLinks.add(newfiles[i]);
  +                }
  +            }
  +            newfiles = new String[noLinks.size()]; 
  +            noLinks.copyInto(newfiles);
           }
   
           for (int i = 0; i < newfiles.length; i++) {
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.5.2.1   +11 -2     jakarta-ant/src/main/org/apache/tools/ant/types/AbstractFileSet.java
  
  Index: AbstractFileSet.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/types/AbstractFileSet.java,v
  retrieving revision 1.5
  retrieving revision 1.5.2.1
  diff -u -r1.5 -r1.5.2.1
  --- AbstractFileSet.java	30 Apr 2002 22:38:35 -0000	1.5
  +++ AbstractFileSet.java	10 May 2002 12:53:57 -0000	1.5.2.1
  @@ -89,7 +89,7 @@
       private File dir;
       private boolean useDefaultExcludes = true;
       private boolean isCaseSensitive = true;
  -
  +    private boolean followSymlinks = true;
   
       public AbstractFileSet() {
           super();
  @@ -101,6 +101,7 @@
           this.additionalPatterns = fileset.additionalPatterns;
           this.useDefaultExcludes = fileset.useDefaultExcludes;
           this.isCaseSensitive = fileset.isCaseSensitive;
  +        this.followSymlinks = fileset.followSymlinks;
           setProject(fileset.getProject());
       }
   
  @@ -276,7 +277,14 @@
           this.isCaseSensitive = isCaseSensitive;
       }
   
  -
  +    /**
  +     * Sets whether or not symbolic links should be followed.
  +     *
  +     * @param followSymlinks whether or not symbolic links should be followed
  +     */
  +    public void setFollowSymlinks(boolean followSymlinks) {
  +        this.followSymlinks = followSymlinks;
  +    }
   
       /**
        * sets the name used for this datatype instance.
  @@ -327,6 +335,7 @@
   
           DirectoryScanner ds = new DirectoryScanner();
           setupDirectoryScanner(ds, p);
  +        ds.setFollowSymlinks(followSymlinks);
           ds.scan();
           return ds;
       }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.25.2.1  +20 -1     jakarta-ant/src/main/org/apache/tools/ant/util/FileUtils.java
  
  Index: FileUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/util/FileUtils.java,v
  retrieving revision 1.25
  retrieving revision 1.25.2.1
  diff -u -r1.25 -r1.25.2.1
  --- FileUtils.java	23 Apr 2002 08:15:52 -0000	1.25
  +++ FileUtils.java	10 May 2002 12:53:58 -0000	1.25.2.1
  @@ -95,7 +95,7 @@
    * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
    * @author <a href="mailto:jtulley@novell.com">Jeff Tulley</a> 
    *
  - * @version $Revision: 1.25 $
  + * @version $Revision: 1.25.2.1 $
    */
   
   public class FileUtils {
  @@ -829,6 +829,25 @@
               return true;
           }
           return false;
  +    }
  +
  +    /**
  +     * Checks whether a given file is a symbolic link.
  +     *
  +     * <p>It doesn't really test for symbolic links but whether the
  +     * canonical and absolute paths of the file are identical - this
  +     * may lead to false positives on some platforms.</p>
  +     *
  +     * @param parent the parent directory of the file to test
  +     * @param name the name of the file to test.
  +     *
  +     * @since Ant 1.5
  +     */
  +    public boolean isSymbolicLink(File parent, String name)
  +        throws IOException {
  +        File resolvedParent = new File(parent.getCanonicalPath());
  +        File toTest = new File(resolvedParent, name);
  +        return !toTest.getAbsolutePath().equals(toTest.getCanonicalPath());
       }
   
   }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.4.2.1   +93 -1     jakarta-ant/src/testcases/org/apache/tools/ant/DirectoryScannerTest.java
  
  Index: DirectoryScannerTest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/testcases/org/apache/tools/ant/DirectoryScannerTest.java,v
  retrieving revision 1.4
  retrieving revision 1.4.2.1
  diff -u -r1.4 -r1.4.2.1
  --- DirectoryScannerTest.java	10 Jan 2002 10:13:11 -0000	1.4
  +++ DirectoryScannerTest.java	10 May 2002 12:53:58 -0000	1.4.2.1
  @@ -1,7 +1,7 @@
   /*
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 2001 The Apache Software Foundation.  All rights
  + * Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -54,9 +54,12 @@
   
   package org.apache.tools.ant;
   
  +import org.apache.tools.ant.taskdefs.condition.Os;
  +
   import junit.framework.TestCase;
   import junit.framework.AssertionFailedError;
   import java.io.File;
  +import java.io.IOException;
   
   /**
    * JUnit 3 testcases for org.apache.tools.ant.DirectoryScanner
  @@ -66,6 +69,95 @@
   public class DirectoryScannerTest extends TestCase {
   
       public DirectoryScannerTest(String name) {super(name);}
  +
  +
  +    // keep track of what operating systems are supported here.
  +    private boolean supportsSymlinks = Os.isFamily("unix");
  +
  +    /**
  +     * Test case for setFollowLinks() and associated funtionality.
  +     * Only supports test on linux, at the moment because Java has
  +     * no real notion of symlinks built in, so an os-specfic call
  +     * to Runtime.exec() must be made to create a link to test against.
  +     */
  +
  +    public void testSetFollowLinks() {
  +        if (supportsSymlinks) {
  +            try {
  +                // add conditions and more commands as soon as the need arises
  +                String[] command = new String[] {
  +                    "ln", "-s", "ant", "src/main/org/apache/tools/ThisIsALink"
  +                };
  +                try {
  +                    Runtime.getRuntime().exec(command);
  +                    // give ourselves some time for the system call
  +                    // to execute... tweak if you have a really over
  +                    // loaded system.
  +                    Thread.sleep(1000);    
  +                } catch (IOException ioe) {
  +                    fail("IOException making link "+ioe);
  +                } catch (InterruptedException ie) {
  +                }
  +                
  +                File dir = new File("src/main/org/apache/tools");
  +                DirectoryScanner ds = new DirectoryScanner();
  +
  +                // followLinks should be true by default, but if this ever
  +                // changes we will need this line.
  +                ds.setFollowSymlinks(true);
  +                
  +                ds.setBasedir(dir);
  +                ds.setExcludes(new String[] {"ant/**"});
  +                ds.scan();
  +            
  +                boolean haveZipPackage = false;
  +                boolean haveTaskdefsPackage = false;
  +
  +                String[] included = ds.getIncludedDirectories();
  +                for (int i=0; i<included.length; i++) {
  +                    if (included[i].equals("zip")) {
  +                        haveZipPackage = true;
  +                    } else if (included[i].equals("ThisIsALink"+File.separator+
  +                                                  "taskdefs")) {
  +                        haveTaskdefsPackage = true;
  +                    }
  +                }
  +
  +                // if we followed the symlink we just made we should
  +                // bypass the excludes.
  +                
  +                assertTrue("(1) zip package included", haveZipPackage);
  +                assertTrue("(1) taskdefs package included", 
  +                           haveTaskdefsPackage);
  +
  +            
  +                ds = new DirectoryScanner();
  +                ds.setFollowSymlinks(false);
  +                
  +                ds.setBasedir(dir);
  +                ds.setExcludes(new String[] {"ant/**"});
  +                ds.scan();
  +            
  +                haveZipPackage = false;
  +                haveTaskdefsPackage = false;
  +                included = ds.getIncludedDirectories();
  +                for (int i=0; i<included.length; i++) {
  +                    if (included[i].equals("zip")) {
  +                        haveZipPackage = true;
  +                    } else if (included[i].equals("ThisIsALink"+File.separator+
  +                                                  "taskdefs")) {
  +                        haveTaskdefsPackage = true;
  +                    }
  +                }
  +                assertTrue("(2) zip package included", haveZipPackage);
  +                assertTrue("(2) taskdefs package not included", 
  +                           !haveTaskdefsPackage);
  +                
  +            } finally {
  +                (new File("src/main/org/apache/tools/ThisIsALink")).delete();
  +            } 
  +        }
  +    }
   
       /**
        * Test inspired by Bug#1415.
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


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

Posted by Stefan Bodewig <bo...@apache.org>.
On 10 May 2002, <bo...@apache.org> wrote:

>   Add a new followsymlinks attribute to fileset and friends.

Tested on Linux 2.4, FreeBSD 4.5 and Solaris 2.8 - more tests more
than welcome.

Stefan

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>