-- Matt McCutchen <hashproduct@gmail.com>
-based-on: 7cb0de6326c915a72253fd103dae93308031ec3f
+based-on: 9a06b2edb0ea1a226bcc642682c07bacd2ea47d3
diff --git a/options.c b/options.c
--- a/options.c
+++ b/options.c
-@@ -35,6 +35,7 @@ extern filter_rule_list daemon_filter_list;
- #define NOT_SPECIFIED (-42)
+@@ -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
-@@ -730,6 +731,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");
-@@ -994,6 +996,7 @@ static struct poptOption long_options[] = {
+@@ -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 },
{"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 },
-@@ -2638,6 +2641,8 @@ void server_options(char **args, int *argc_p)
- goto oom;
- args[ac++] = arg;
- }
+@@ -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";
}
- /* --delete-missing-args needs the cooperation of both sides, but
-diff --git a/rsync.yo b/rsync.yo
---- a/rsync.yo
-+++ b/rsync.yo
-@@ -387,6 +387,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 xfer, not during
-@@ -1332,6 +1333,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.
+ 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), rsync looks for each file's backup dir relative
-+to the source argument the file came from. Consequently, if the
-+bf(--backup-dir) path is relative, each source argument gets a separate backup
-+dir at that path relative to the argument.
++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
++ 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
-@@ -40,6 +40,7 @@ extern int protocol_version;
+@@ -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 inplace;
+ extern int inplace_partial;
extern int batch_fd;
- extern int write_batch;
-@@ -128,6 +129,7 @@ void successful_send(int ndx)
+@@ -131,6 +132,7 @@ void successful_send(int ndx)
struct file_struct *file;
struct file_list *flist;
STRUCT_STAT st;
if (!remove_source_files)
return;
-@@ -152,7 +154,11 @@ void successful_send(int ndx)
+@@ -162,7 +164,11 @@ void successful_send(int ndx)
return;
}