diff --git a/WHATSNEW b/WHATSNEW index e88a6097c..1ab45fb9a 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -68,6 +68,11 @@ Other changes: "unknown" for Test implementations that don't extend TestCase but have a public String getName() method. +* now has a preservelastmodified attribute to preserve the + timestamp of a downloaded file. + +* new rmdir action for that removes directories from a fileset. + Changes from Ant 1.5beta3 to Ant 1.5 ==================================== diff --git a/docs/manual/OptionalTasks/ftp.html b/docs/manual/OptionalTasks/ftp.html index 2db8a5912..7935921b3 100644 --- a/docs/manual/OptionalTasks/ftp.html +++ b/docs/manual/OptionalTasks/ftp.html @@ -66,7 +66,8 @@ the code to parse MS-DOS listings -any takers? action the ftp action to perform, defaulting to "send". Currently supports "put", "get", - "del", "list", "chmod" and "mkdir". + "del", "list", "chmod", + "mkdir" and "rmdir". No @@ -269,6 +270,55 @@ remotedir attribute.

This creates the directory some/remote/dir beneath the default root directory. As with all other actions, the directory separator character must be correct according to the desires of the FTP server.

+

Removing Directories

+This action uses nested fileset elements to +select the directories to remove from the remote FTP server. The +filesets are relative to the remote directory, not a local directory. +The dir attribute of the fileset is ignored completely. +The directories to be removed must be empty, or contain only +other directories that have been also selected to be removed by the filesets +patterns, otherwise a BuildException will be thrown. +Also, if you don't have permission to remove a directory, a BuildException is +thrown. + +
+  <ftp action="rmdir"
+       server="ftp.apache.org"
+       userid="anonymous"
+       password="me@myorg.com" 
+       remotedir="/somedir" >
+    <fileset>
+      <include name="dira"/>
+      <include name="dirb/**"/>
+    </fileset>
+  </ftp>
+
+

Logs in to ftp.apache.org as anonymous and +tries to remove /somedir/dira directory and +all the directories tree starting at, and including, /somedir/dirb. +When removing the /somedir/dirb tree, +it will start at the leaves moving up to the root, so that when +it tries to remove a directory it is sure all the directories under it are +already removed. +Obviuosly all the files in the tree must have been already deleted. +

+

As an example suppose you want to delete everything contained into +/somedir, so invoke first the <ftp> task with +action="delete", then with +action="rmdir" specifying in both cases +remotedir="/somedir" and + +

+    <fileset>
+        <include name="**"/>
+    </fileset>
+
+ +The directory specified in the remotedir parameter is never +selected for remove, so if you need to remove it, specify its parent in +remotedir parameter and include it in the +<fileset> pattern, like "somedir/**". +


Copyright © 2000-2002 Apache Software Foundation. All rights Reserved.

diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java index f2734ffa7..e8c6a2df1 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java @@ -86,6 +86,8 @@ import org.apache.tools.ant.util.FileUtils; *
  • del - delete files from a remote server.
  • *
  • list - create a file listing.
  • *
  • chmod - change unix file permissions.
  • + *
  • rmdir - remove directories, if empty, from a + * remote server.
  • * * Note: Some FTP servers - notably the Solaris server - seem * to hold data ports open after a "retr" operation, allowing them to timeout @@ -109,6 +111,7 @@ public class FTP protected static final int LIST_FILES = 3; protected static final int MK_DIR = 4; protected static final int CHMOD = 5; + protected static final int RM_DIR = 6; private String remotedir; private String server; @@ -139,7 +142,8 @@ public class FTP "deleting", "listing", "making directory", - "chmod" + "chmod", + "removing" }; protected static final String[] COMPLETED_ACTION_STRS = { @@ -148,7 +152,18 @@ public class FTP "deleted", "listed", "created directory", - "mode changed" + "mode changed", + "removed" + }; + + protected static final String[] ACTION_TARGET_STRS = { + "files", + "files", + "files", + "files", + "directory", + "files", + "directories" }; @@ -212,11 +227,11 @@ public class FTP String name = vpath + file.getName(); if (isIncluded(name)) { if (!isExcluded(name)) { - dirsIncluded.addElement(name); if (fast) { scandir(file.getName(), name + File.separator, fast); } + dirsIncluded.addElement(name); } else { dirsExcluded.addElement(name); if (fast && couldHoldIncluded(name)) { @@ -486,7 +501,12 @@ public class FTP ds.scan(); } - String[] dsfiles = ds.getIncludedFiles(); + String[] dsfiles = null; + if (action == RM_DIR) { + dsfiles = ds.getIncludedDirectories(); + } else { + dsfiles = ds.getIncludedFiles(); + } String dir = null; if ((ds.getBasedir() == null) @@ -545,6 +565,12 @@ public class FTP break; } + case RM_DIR: + { + rmDir(ftp, dsfiles[i]); + break; + } + default: { throw new BuildException("unknown ftp action " + action); @@ -583,10 +609,12 @@ public class FTP } } - log(transferred + " files " + COMPLETED_ACTION_STRS[action]); + log(transferred + " " + ACTION_TARGET_STRS[action] + " " + + COMPLETED_ACTION_STRS[action]); if (skipped != 0) { - log(skipped + " files were not successfully " - + COMPLETED_ACTION_STRS[action]); + log(skipped + " " + ACTION_TARGET_STRS[action] + + " were not successfully " + + COMPLETED_ACTION_STRS[action]); } } @@ -783,6 +811,29 @@ public class FTP } } + /** Delete a directory, if empty, from the remote host. */ + protected void rmDir(FTPClient ftp, String dirname) + throws IOException, BuildException { + if (verbose) { + log("removing " + dirname); + } + + if (!ftp.removeDirectory(resolveFile(dirname))) { + String s = "could not remove directory: " + ftp.getReplyString(); + + if (skipFailedTransfers == true) { + log(s, Project.MSG_WARN); + skipped++; + } else { + throw new BuildException(s); + } + } else { + log("Directory " + dirname + " removed from " + server, + Project.MSG_VERBOSE); + transferred++; + } + } + /** * Retrieve a single file to the remote host. filename may @@ -991,7 +1042,7 @@ public class FTP ftp.getReplyString()); } } - log(ACTION_STRS[action] + " files"); + log(ACTION_STRS[action] + " " + ACTION_TARGET_STRS[action]); transferFiles(ftp); } @@ -1013,13 +1064,14 @@ public class FTP /** * an action to perform, one of - * "send", "put", "recv", "get", "del", "delete", "list", "mkdir", "chmod" + * "send", "put", "recv", "get", "del", "delete", "list", "mkdir", "chmod", + * "rmdir" */ public static class Action extends EnumeratedAttribute { private static final String[] validActions = { "send", "put", "recv", "get", "del", "delete", "list", "mkdir", - "chmod" + "chmod", "rmdir" }; @@ -1046,6 +1098,8 @@ public class FTP return CHMOD; } else if (actionL.equals("mkdir")) { return MK_DIR; + } else if (actionL.equals("rmdir")) { + return RM_DIR; } return SEND_FILES; }