--- FTP.java.orig Tue Sep 17 13:39:35 2002 +++ FTP.java Tue Sep 17 14:40:21 2002 @@ -87,6 +87,8 @@ *
  • 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 @@ -110,6 +112,7 @@ 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 @@ "deleting", "listing", "making directory", - "chmod" + "chmod", + "removing" }; protected static final String[] COMPLETED_ACTION_STRS = { @@ -148,7 +152,18 @@ "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 @@ 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)) { @@ -478,7 +493,12 @@ 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) @@ -537,6 +557,12 @@ break; } + case RM_DIR: + { + rmDir(ftp, dsfiles[i]); + break; + } + default: { throw new BuildException("unknown ftp action " + action); @@ -575,10 +601,12 @@ } } - 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]); } } @@ -775,6 +803,29 @@ } } + /** 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 @@ -973,7 +1024,7 @@ ftp.getReplyString()); } } - log(ACTION_STRS[action] + " files"); + log(ACTION_STRS[action] + " " + ACTION_TARGET_STRS[action]); transferFiles(ftp); } @@ -995,13 +1046,14 @@ /** * 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" }; @@ -1028,6 +1080,8 @@ return CHMOD; } else if (actionL.equals("mkdir")) { return MK_DIR; + } else if (actionL.equals("rmdir")) { + return RM_DIR; } return SEND_FILES; }