Author: bodewig
Date: Wed Nov 12 21:14:25 2008
New Revision: 713641

URL: http://svn.apache.org/viewvc?rev=713641&view=rev
Log:
add an attribute that allows symbolic links to be deleted without following 
them.  PR 36658.

Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/docs/manual/CoreTasks/delete.html
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
    ant/core/trunk/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml

Modified: ant/core/trunk/WHATSNEW
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=713641&r1=713640&r2=713641&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Wed Nov 12 21:14:25 2008
@@ -523,6 +523,11 @@
  * a new task <include> provides an alternative to <import> that
    should be preferred when you don't want to override any targets.
 
+ * delete has a new attribute removeNotFollowedSymlink.  If set to
+   true, symbolic links not followed (because followSymlinks was false
+   or the number of symlinks was too big) will be removed.
+   Bugzilla Report 36658.
+
 Changes from Ant 1.7.0 TO Ant 1.7.1
 =============================================
 

Modified: ant/core/trunk/docs/manual/CoreTasks/delete.html
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/CoreTasks/delete.html?rev=713641&r1=713640&r2=713641&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/CoreTasks/delete.html (original)
+++ ant/core/trunk/docs/manual/CoreTasks/delete.html Wed Nov 12 21:14:25 2008
@@ -154,6 +154,16 @@
       <em>Since Ant 1.6.2</em></td>
     <td align="center" valign="top">No, default &quot;false&quot;</td>
   </tr>
+  <tr>
+    <td valign="top">removeNotFollowedSymlinks</td>
+    <td valign="top">
+      Whether symbolic links (not the files/directories they link to)
+      should be removed if they haven't been followed because
+      followSymlinks was false or the maximum number of symbolic links
+      was too big.
+      <em>Since Ant 1.8.0</em></td>
+    <td align="center" valign="top">No, default &quot;false&quot;</td>
+  </tr>
 </table>
 
 <h3>Examples</h3>

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java?rev=713641&r1=713640&r2=713641&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java Wed Nov 
12 21:14:25 2008
@@ -26,6 +26,7 @@
 
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
 import org.apache.tools.ant.taskdefs.condition.Os;
 import org.apache.tools.ant.types.FileSet;
 import org.apache.tools.ant.types.PatternSet;
@@ -113,6 +114,7 @@
     private boolean quiet = false;
     private boolean failonerror = true;
     private boolean deleteOnExit = false;
+    private boolean removeNotFollowedSymlinks = false;
     private Resources rcs = null;
     private static FileUtils FILE_UTILS = FileUtils.getFileUtils();
     private static SymbolicLinkUtils SYMLINK_UTILS =
@@ -338,6 +340,16 @@
     }
 
     /**
+     * Sets whether the symbolic links that have not been followed
+     * shall be removed (the links, not the locations they point at).
+     *
+     * @since Ant 1.8.0
+     */
+    public void setRemoveNotFollowedSymlinks(boolean b) {
+        removeNotFollowedSymlinks = b;
+    }
+
+    /**
      * add a "Select" selector entry on the selector list
      * @param selector the selector to be added
      */
@@ -592,9 +604,29 @@
                 handle("Directory does not exist:" + fsDir);
             } else {
                 resourcesToDelete.add(fs);
+                DirectoryScanner ds = fs.getDirectoryScanner();
                 if (includeEmpty) {
-                    filesetDirs.add(new ReverseDirs(getProject(), fsDir, fs
-                            .getDirectoryScanner().getIncludedDirectories()));
+                    filesetDirs.add(new ReverseDirs(getProject(), fsDir,
+                                                    ds
+                                                    
.getIncludedDirectories()));
+                }
+
+                if (removeNotFollowedSymlinks) {
+                    String[] n = ds.getNotFollowedSymlinks();
+                    if (n.length > 0) {
+                        String[] links = new String[n.length];
+                        System.arraycopy(n, 0, links, 0, n.length);
+                        Arrays.sort(links, ReverseDirs.REVERSE);
+                        for (int l = 0; l < links.length; l++) {
+                            try {
+                                SYMLINK_UTILS
+                                    .deleteSymbolicLink(new File(links[l]),
+                                                        this);
+                            } catch (java.io.IOException ex) {
+                                handle(ex);
+                            }
+                        }
+                    }
                 }
             }
         }

Modified: ant/core/trunk/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml?rev=713641&r1=713640&r2=713641&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml 
(original)
+++ ant/core/trunk/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml Wed 
Nov 12 21:14:25 2008
@@ -37,4 +37,27 @@
     <symlink link="${link}" resource="${input}/A"/>
     <delete dir="${input}"/>
   </target>
+
+  <target name="testNotFollowedLink" if="unix">
+    <mkdir dir="${input}/A/B"/>
+    <mkdir dir="${input}/C"/>
+    <property name="link" location="${input}/A/B/C"/>
+    <symlink link="${link}" resource="${input}/C"/>
+    <delete>
+      <fileset dir="${input}" followSymlinks="false"/>
+    </delete>
+    <au:assertFileExists file="${input}/A/B/C"/>
+  </target>
+
+  <target name="testRemoveNotFollowedLink" if="unix">
+    <mkdir dir="${input}/A/B"/>
+    <mkdir dir="${input}/C"/>
+    <property name="link" location="${input}/A/B/C"/>
+    <symlink link="${link}" resource="${input}/C"/>
+    <delete removeNotFollowedSymlinks="true">
+      <fileset dir="${input}/A" followSymlinks="false"/>
+    </delete>
+    <au:assertFileDoesntExist file="${input}/A/B/C"/>
+    <au:assertFileExists file="${input}/C"/>
+  </target>
 </project>


Reply via email to