The patches for 3.1.1pre1.
[rsync-patches.git] / source-backup.diff
index 008083959551199fb448a030a64c4e8754aa7f78..f6e9f7a612e23e57082c212c8dd3b1c674a9bdb5 100644 (file)
@@ -9,17 +9,19 @@ To use this patch, run these commands for a successful build:
 
 -- Matt McCutchen <hashproduct@gmail.com>
 
---- old/options.c
-+++ new/options.c
-@@ -29,6 +29,7 @@ extern struct filter_list_struct filter_
- extern struct filter_list_struct server_filter_list;
+based-on: 8946cfc6f8018e30740ee1db4cc2e2008e4f7e7e
+diff --git a/options.c b/options.c
+--- a/options.c
++++ b/options.c
+@@ -33,6 +33,7 @@ extern filter_rule_list filter_list;
+ extern filter_rule_list daemon_filter_list;
  
  int make_backups = 0;
 +int make_source_backups = 0;
  
  /**
   * If 1, send the whole file as literal data rather than trying to
-@@ -352,6 +353,7 @@ void usage(enum logcode F)
+@@ -728,6 +729,7 @@ void usage(enum logcode F)
    rprintf(F,"     --existing              skip creating new files on receiver\n");
    rprintf(F,"     --ignore-existing       skip updating files that already exist on receiver\n");
    rprintf(F,"     --remove-source-files   sender removes synchronized files (non-dirs)\n");
@@ -27,15 +29,15 @@ To use this patch, run these commands for a successful build:
    rprintf(F,"     --del                   an alias for --delete-during\n");
    rprintf(F,"     --delete                delete extraneous files from destination dirs\n");
    rprintf(F,"     --delete-before         receiver deletes before transfer, not during\n");
-@@ -573,6 +575,7 @@ static struct poptOption long_options[] 
-   {"bwlimit",          0,  POPT_ARG_INT,    &bwlimit, 0, 0, 0 },
+@@ -990,6 +992,7 @@ static struct poptOption long_options[] = {
+   {"bwlimit",          0,  POPT_ARG_STRING, &bwlimit_arg, OPT_BWLIMIT, 0, 0 },
    {"no-bwlimit",       0,  POPT_ARG_VAL,    &bwlimit, 0, 0, 0 },
    {"backup",          'b', POPT_ARG_VAL,    &make_backups, 1, 0, 0 },
 +  {"source-backup",    0,  POPT_ARG_NONE,   &make_source_backups, 0, 0, 0},
    {"no-backup",        0,  POPT_ARG_VAL,    &make_backups, 0, 0, 0 },
    {"backup-dir",       0,  POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
    {"suffix",           0,  POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
-@@ -1848,6 +1851,8 @@ void server_options(char **args,int *arg
+@@ -2617,6 +2620,8 @@ void server_options(char **args, int *argc_p)
                                goto oom;
                        args[ac++] = arg;
                }
@@ -43,20 +45,21 @@ To use this patch, run these commands for a successful build:
 +                      args[ac++] = "--source-backup";
        }
  
-       if (modify_window_set) {
---- old/rsync.yo
-+++ new/rsync.yo
-@@ -350,6 +350,7 @@ to the detailed description below for a 
+       /* --delete-missing-args needs the cooperation of both sides, but
+diff --git a/rsync.yo b/rsync.yo
+--- a/rsync.yo
++++ b/rsync.yo
+@@ -384,6 +384,7 @@ to the detailed description below for a complete description.  verb(
       --existing              skip creating new files on receiver
       --ignore-existing       skip updating files that exist on receiver
       --remove-source-files   sender removes synchronized files (non-dir)
 +     --source-backup         ... and backs up those files
       --del                   an alias for --delete-during
       --delete                delete extraneous files from dest dirs
-      --delete-before         receiver deletes before transfer (default)
-@@ -1012,6 +1013,14 @@ dit(bf(--remove-source-files)) This tell
- side the files (meaning non-directories) that are a part of the transfer
and have been successfully duplicated on the receiving side.
+      --delete-before         receiver deletes before xfer, not during
+@@ -1310,6 +1311,14 @@ bf(--exclude='*.new') for the rsync transfer).
+ Starting with 3.1.0, rsync will skip the sender-side removal (and output an
error) if the file's size or modify time has not stayed unchanged.
  
 +dit(bf(--source-backup)) Makes the sender back up the source files it removes
 +due to bf(--remove-source-files).  This option is independent of
@@ -69,34 +72,35 @@ To use this patch, run these commands for a successful build:
  dit(bf(--delete)) This tells rsync to delete extraneous files from the
  receiving side (ones that aren't on the sending side), but only for the
  directories that are being synchronized.  You must have asked rsync to
---- old/sender.c
-+++ new/sender.c
+diff --git a/sender.c b/sender.c
+--- a/sender.c
++++ b/sender.c
 @@ -39,6 +39,7 @@ extern int protocol_version;
  extern int remove_source_files;
  extern int updating_basis_file;
  extern int make_backups;
 +extern int make_source_backups;
- extern int do_progress;
  extern int inplace;
  extern int batch_fd;
-@@ -123,6 +124,7 @@ void successful_send(int ndx)
-       char fname[MAXPATHLEN];
+ extern int write_batch;
+@@ -127,6 +128,7 @@ void successful_send(int ndx)
        struct file_struct *file;
        struct file_list *flist;
+       STRUCT_STAT st;
 +      int result;
  
        if (!remove_source_files)
                return;
-@@ -139,7 +141,11 @@ void successful_send(int ndx)
+@@ -151,7 +153,11 @@ void successful_send(int ndx)
                return;
-       f_name(file, fname);
+       }
  
--      if (do_unlink(fname) == 0) {
+-      if (do_unlink(fname) < 0) {
 +      if (make_source_backups)
-+              result = !make_backup(fname);
++              result = !make_backup(fname, True);
 +      else
 +              result = do_unlink(fname);
-+      if (result == 0) {
-               if (verbose > 1)
-                       rprintf(FINFO, "sender removed %s\n", fname);
-       } else
++      if (result < 0) {
+               failed_op = "remove";
+         failed:
+               if (errno == ENOENT)