diff --git a/WHATSNEW b/WHATSNEW index f5b6c62ba..6e41b0519 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -523,6 +523,11 @@ Other changes: * a new task provides an alternative to 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 ============================================= diff --git a/docs/manual/CoreTasks/delete.html b/docs/manual/CoreTasks/delete.html index 27ba707d3..a43491139 100644 --- a/docs/manual/CoreTasks/delete.html +++ b/docs/manual/CoreTasks/delete.html @@ -154,6 +154,16 @@ in Directory-based Tasks, and see the Since Ant 1.6.2 No, default "false" + + removeNotFollowedSymlinks + + 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. + Since Ant 1.8.0 + No, default "false" +

Examples

diff --git a/src/main/org/apache/tools/ant/taskdefs/Delete.java b/src/main/org/apache/tools/ant/taskdefs/Delete.java index 6f752e276..f131e1c74 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Delete.java +++ b/src/main/org/apache/tools/ant/taskdefs/Delete.java @@ -26,6 +26,7 @@ import java.util.Comparator; 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 @@ public class Delete extends MatchingTask { 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 = @@ -337,6 +339,16 @@ public class Delete extends MatchingTask { super.setFollowSymlinks(followSymlinks); } + /** + * 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 @@ public class Delete extends MatchingTask { 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); + } + } + } } } } diff --git a/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml b/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml index 7e850c2b0..d80553721 100644 --- a/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml +++ b/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml @@ -37,4 +37,27 @@ + + + + + + + + + + + + + + + + + + + + + + +