On 5/4/07, ScottZ <[EMAIL PROTECTED]> wrote:
--remove-source-files works fine for this.
An issue has come up in that I need to be able to backup the removed local
source files as well.
I think the simplest way to accomplish this is to make a modified
version of rsync that supports backing up removed source files. In
fact, I did. The attached patch to rsync 2.6.9 adds a --source-backup
option that backs up removed source files. You can compile and use
your own copy of rsync that includes this patch.
In case you're not familiar with compiling patched software, here are the steps:
1. Save the attached rsync-2.6.9-source-backup.diff somewhere.
2. Download and extract the rsync source package
http://rsync.samba.org/ftp/rsync/rsync-2.6.9.tar.gz somewhere.
3. At the command line, cd into the extracted directory "rsync-2.6.9".
4. To apply the patch, run (substituting the actual place you saved the patch):
patch -p1 <path/to/rsync-2.6.9-source-backup.diff
5. To compile rsync, run:
./configure
make
That makes an rsync executable in the current directory. You can run
it from there or copy it to a directory on your $PATH.
Matt
This patch to rsync 2.6.9 adds a --source-backup option that backs up source
files removed due to --remove-source-files. In my limited testing, it seems
to work.
-- Matt McCutchen <[EMAIL PROTECTED]>
--- old/options.c
+++ new/options.c
@@ -30,6 +30,7 @@ extern struct filter_list_struct filter_
extern struct filter_list_struct server_filter_list;
int make_backups = 0;
+int make_source_backups = 0;
/**
* If 1, send the whole file as literal data rather than trying to
@@ -324,6 +325,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 (default)\n");
@@ -517,6 +519,7 @@ static struct poptOption long_options[]
{"itemize-changes", 'i', POPT_ARG_NONE, 0, 'i', 0, 0 },
{"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
{"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
+ {"source-backup", 0, POPT_ARG_NONE, &make_source_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 },
{"list-only", 0, POPT_ARG_VAL, &list_only, 2, 0, 0 },
@@ -1655,6 +1658,9 @@ void server_options(char **args,int *arg
args[ac++] = arg;
}
+ if (make_source_backups && !am_sender)
+ args[ac++] = "--source-backup";
+
if (am_sender) {
if (delete_excluded)
args[ac++] = "--delete-excluded";
--- old/rsync.yo
+++ new/rsync.yo
@@ -341,6 +341,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 thosee files
--del an alias for --delete-during
--delete delete extraneous files from dest dirs
--delete-before receiver deletes before transfer (default)
@@ -929,6 +930,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.
+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
+(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 ".".
+
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
@@ -37,6 +37,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];
struct file_struct *file;
unsigned int offset;
+ int result;
if (ndx < 0 || ndx >= the_file_list->count)
return;
@@ -135,7 +137,11 @@ void successful_send(int ndx)
offset = 0;
f_name(file, fname + offset);
if (remove_source_files) {
- if (do_unlink(fname) == 0) {
+ if (make_source_backups)
+ result = !make_backup(fname);
+ else
+ result = do_unlink(fname);
+ if (result == 0) {
if (verbose > 1)
rprintf(FINFO, "sender removed %s\n", fname + offset);
} else
--
To unsubscribe or change options: https://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html