diff --git a/src/etc/testcases/taskdefs/optional/net/ftp.xml b/src/etc/testcases/taskdefs/optional/net/ftp.xml
index e9c7e59b4..9219db1f0 100644
--- a/src/etc/testcases/taskdefs/optional/net/ftp.xml
+++ b/src/etc/testcases/taskdefs/optional/net/ftp.xml
@@ -77,4 +77,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
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 a78fecf72..9f9ef7f30 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
@@ -1357,30 +1357,34 @@ public class FTP
}
bw = new BufferedWriter(new FileWriter(listing));
}
-
- for (int i = 0; i < dsfiles.length; i++) {
- switch (action) {
- case SEND_FILES:
- sendFile(ftp, dir, dsfiles[i]);
- break;
- case GET_FILES:
- getFile(ftp, dir, dsfiles[i]);
- break;
- case DEL_FILES:
- delFile(ftp, dsfiles[i]);
- break;
- case LIST_FILES:
- listFile(ftp, bw, dsfiles[i]);
- break;
- case CHMOD:
- doSiteCommand(ftp, "chmod " + chmod + " " + resolveFile(dsfiles[i]));
- transferred++;
- break;
- case RM_DIR:
- rmDir(ftp, dsfiles[i]);
- break;
- default:
- throw new BuildException("unknown ftp action " + action);
+ if (action == RM_DIR) {
+ // to remove directories, start by the end of the list
+ // the trunk does not let itself be removed before the leaves
+ for (int i = dsfiles.length - 1; i >= 0; i--) {
+ rmDir(ftp, dsfiles[i]);
+ }
+ } else {
+ for (int i = 0; i < dsfiles.length; i++) {
+ switch (action) {
+ case SEND_FILES:
+ sendFile(ftp, dir, dsfiles[i]);
+ break;
+ case GET_FILES:
+ getFile(ftp, dir, dsfiles[i]);
+ break;
+ case DEL_FILES:
+ delFile(ftp, dsfiles[i]);
+ break;
+ case LIST_FILES:
+ listFile(ftp, bw, dsfiles[i]);
+ break;
+ case CHMOD:
+ doSiteCommand(ftp, "chmod " + chmod + " " + resolveFile(dsfiles[i]));
+ transferred++;
+ break;
+ default:
+ throw new BuildException("unknown ftp action " + action);
+ }
}
}
} finally {
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java
index be9539436..6dd7509a0 100644
--- a/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java
@@ -570,7 +570,12 @@ public class FTPTest extends BuildFileTest{
new String[] {"alpha/beta", "alpha/beta/gamma", "delta"});
}
-
+ /**
+ * this test is inspired by a user reporting that deletions of directories with the ftp task do not work
+ */
+ public void testFTPDelete() {
+ getProject().executeTarget("ftp-delete");
+ }
private void compareFiles(DirectoryScanner ds, String[] expectedFiles,
String[] expectedDirectories) {
String includedFiles[] = ds.getIncludedFiles();