-- Matt McCutchen <hashproduct@gmail.com>
+based-on: 24079e988fc31af4eba56cd2701fdc5a4154980d
diff --git a/options.c b/options.c
--- a/options.c
+++ b/options.c
-@@ -33,6 +33,7 @@ extern struct filter_list_struct filter_list;
- extern struct filter_list_struct daemon_filter_list;
+@@ -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
-@@ -367,6 +368,7 @@ void usage(enum logcode F)
+@@ -713,6 +714,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," --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");
-@@ -607,6 +609,7 @@ static struct poptOption long_options[] = {
- {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
+@@ -967,6 +969,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 },
-@@ -1965,6 +1968,8 @@ void server_options(char **args, int *argc_p)
+@@ -2521,6 +2524,8 @@ void server_options(char **args, int *argc_p)
goto oom;
args[ac++] = arg;
}
+ args[ac++] = "--source-backup";
}
- if (modify_window_set) {
+ /* --delete-missing-args needs the cooperation of both sides, but
diff --git a/rsync.yo b/rsync.yo
--- a/rsync.yo
+++ b/rsync.yo
-@@ -361,6 +361,7 @@ to the detailed description below for a complete description. verb(
+@@ -368,6 +368,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)
-@@ -1111,6 +1112,14 @@ dit(bf(--remove-source-files)) This tells rsync to remove from the sending
+ --delete-before receiver deletes before xfer, not during
+@@ -1198,6 +1199,14 @@ dit(bf(--remove-source-files)) This tells rsync to remove from the sending
side the files (meaning non-directories) that are a part of the transfer
and have been successfully duplicated on the receiving side.
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)
+ extern int write_batch;
+@@ -125,6 +126,7 @@ void successful_send(int ndx)
char fname[MAXPATHLEN];
struct file_struct *file;
struct file_list *flist;
if (!remove_source_files)
return;
-@@ -133,7 +135,11 @@ void successful_send(int ndx)
+@@ -135,7 +137,11 @@ void successful_send(int ndx)
return;
f_name(file, fname);
- 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)
+ if (INFO_GTE(REMOVE, 1))
rprintf(FINFO, "sender removed %s\n", fname);
} else