added --delete-after option (suggested by Jason)
authorAndrew Tridgell <tridge@samba.org>
Mon, 8 Nov 1999 13:03:05 +0000 (13:03 +0000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 8 Nov 1999 13:03:05 +0000 (13:03 +0000)
options.c
receiver.c
rsync.yo

index cd56b2a..623385a 100644 (file)
--- a/options.c
+++ b/options.c
@@ -62,6 +62,7 @@ int safe_symlinks=0;
 int copy_unsafe_links=0;
 int block_size=BLOCK_SIZE;
 int size_only=0;
+int delete_after=0;
 
 char *backup_suffix = BACKUP_SUFFIX;
 char *tmpdir = NULL;
@@ -126,6 +127,7 @@ void usage(int F)
   rprintf(F," -C, --cvs-exclude           auto ignore files in the same way CVS does\n");
   rprintf(F,"     --delete                delete files that don't exist on the sending side\n");
   rprintf(F,"     --delete-excluded       also delete excluded files on the receiving side\n");
+  rprintf(F,"     --delete-after          delete after transferring, not before\n");
   rprintf(F,"     --partial               keep partially transferred files\n");
   rprintf(F,"     --force                 force deletion of directories even if not empty\n");
   rprintf(F,"     --numeric-ids           don't map uid/gid values by user/group name\n");
@@ -162,7 +164,8 @@ enum {OPT_VERSION, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
       OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
       OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
       OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST,
-      OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS};
+      OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
+      OPT_DELETE_AFTER};
 
 static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP";
 
@@ -217,6 +220,7 @@ static struct option long_options[] = {
   {"stats",       0,     0,    OPT_STATS},
   {"progress",    0,     0,    OPT_PROGRESS},
   {"partial",     0,     0,    OPT_PARTIAL},
+  {"delete-after",0,     0,    OPT_DELETE_AFTER},
   {"config",      1,     0,    OPT_CONFIG},
   {"port",        1,     0,    OPT_PORT},
   {"log-format",  1,     0,    OPT_LOG_FORMAT},
@@ -316,6 +320,10 @@ int parse_arguments(int argc, char *argv[], int frommain)
                        delete_mode = 1;
                        break;
 
+               case OPT_DELETE_AFTER:
+                       delete_after = 1;
+                       break;
+
                case OPT_DELETE_EXCLUDED:
                        delete_excluded = 1;
                        delete_mode = 1;
@@ -632,6 +640,9 @@ void server_options(char **args,int *argc)
        if (force_delete)
                args[ac++] = "--force";
 
+       if (delete_after)
+               args[ac++] = "--delete-after";
+
        if (copy_unsafe_links)
                args[ac++] = "--copy-unsafe-links";
 
index 9621578..890fadd 100644 (file)
@@ -304,14 +304,17 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
        int recv_ok;
        extern struct stats stats;              
        extern int preserve_perms;
+       extern int delete_after;
        struct stats initial_stats;
 
        if (verbose > 2) {
                rprintf(FINFO,"recv_files(%d) starting\n",flist->count);
        }
 
-       if (recurse && delete_mode && !local_name && flist->count>0) {
-               delete_files(flist);
+       if (!delete_after) {
+               if (recurse && delete_mode && !local_name && flist->count>0) {
+                       delete_files(flist);
+               }
        }
 
        while (1) {      
@@ -478,6 +481,12 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                }
        }
 
+       if (delete_after) {
+               if (recurse && delete_mode && !local_name && flist->count>0) {
+                       delete_files(flist);
+               }
+       }
+
        if (preserve_hard_links)
                do_hard_links(flist);
 
index 2ebcd66..f0ac90d 100644 (file)
--- a/rsync.yo
+++ b/rsync.yo
@@ -453,6 +453,11 @@ dit(bf(--delete-excluded)) In addition to deleting the files on the
 receiving side that are not on the sending side, this tells rsync to also
 delete any files on the receiving side that are excluded (see --exclude).
 
+dit(bf(--delete-after)) By default rsync does file deletions before
+transferring files to try to ensure that there is sufficient space on
+the receiving filesystem. If you want to delete after transferring
+then use the --delete-after switch.
+
 dit(bf(--force)) This options tells rsync to delete directories even if
 they are not empty.  This applies to both the --delete option and to
 cases where rsync tries to copy a normal file but the destination