The patches for 3.3.0pre1.
[rsync-patches.git] / source-backup.diff
index 32850dac5976a3b3b5538b88ba1d7c92001569c3..c557f954c54c72176d76c2a4566dcaa964a1c8de 100644 (file)
@@ -9,96 +9,93 @@ 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: 9a06b2edb0ea1a226bcc642682c07bacd2ea47d3
+diff --git a/options.c b/options.c
+--- a/options.c
++++ b/options.c
+@@ -34,6 +34,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
-@@ -351,6 +352,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");
-+  rprintf(F,"     --source-backup         ... and backs up those files\n");
-   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");
-@@ -570,6 +572,7 @@ static struct poptOption long_options[] 
-   {"bwlimit",          0,  POPT_ARG_INT,    &bwlimit, 0, 0, 0 },
+@@ -777,6 +778,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 },
-@@ -1836,7 +1839,8 @@ void server_options(char **args,int *arg
-                       args[ac++] = "--super";
-               if (size_only)
-                       args[ac++] = "--size-only";
--      }
-+      } else if (make_source_backups)
-+              args[ac++] = "--source-backup";
+@@ -2838,6 +2840,8 @@ void server_options(char **args, int *argc_p)
+       } else {
+               if (skip_compress)
+                       args[ac++] = safe_arg("--skip-compress", skip_compress);
++              if (make_source_backups)
++                      args[ac++] = "--source-backup";
+       }
  
-       if (modify_window_set) {
-               if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
---- old/rsync.yo
-+++ new/rsync.yo
-@@ -350,6 +350,7 @@ to the detailed description below for a 
     --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)
-@@ -1004,6 +1005,15 @@ 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.
+       if (max_alloc_arg && max_alloc != DEFAULT_MAX_ALLOC)
+diff --git a/rsync.1.md b/rsync.1.md
+--- a/rsync.1.md
++++ b/rsync.1.md
+@@ -477,6 +477,7 @@ has its own detailed description later in this manpage.
--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 xfer, not during
+@@ -1893,6 +1894,17 @@ expand it.
    not remove a file the receiver just verified, such as when the user
    accidentally makes the source and destination directory the same path.
  
-+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
-+bf(--backup) but uses the same bf(--backup-dir) and bf(--suffix) settings,
-+if any.  With bf(--backup-dir), each backup file is placed inside the backup
-+dir according to the source file's full path from the working directory
-+(backup-dir + source argument path + file-list path); if you want files placed according
-+to the file-list path, you could either make appropriate symlinks or have the
-+sender "cd" into the source directory so that the source argument is just ".".
++0.  `--source-backup`
 +
- 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
-@@ -39,6 +39,7 @@ extern int protocol_version;
++    Makes the sender back up the source files it removes due to
++    [`--remove-source-files`](#opt).  This option is independent of
++    [`--backup`](#opt) but uses the same [`--backup-dir`](#opt) and
++    [`--suffix`](#opt) settings, if any.  With [`--backup-dir`](#opt), rsync
++    looks for each file's backup dir relative to the source argument the file
++    came from.  Consequently, if the [`--backup-dir`](#opt) path is relative,
++    each source argument gets a separate backup dir at that path relative to
++    the argument.
++
+ 0.  `--delete`
+     This tells rsync to delete extraneous files from the receiving side (ones
+diff --git a/sender.c b/sender.c
+--- a/sender.c
++++ b/sender.c
+@@ -44,6 +44,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 inplace_partial;
  extern int batch_fd;
-@@ -123,6 +124,7 @@ void successful_send(int ndx)
-       char fname[MAXPATHLEN];
+@@ -131,6 +132,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)
+@@ -162,7 +164,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)