From 57df171bc00cd813b5d661960b567a041107af13 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 8 Nov 1999 13:03:05 +0000 Subject: [PATCH] added --delete-after option (suggested by Jason) --- options.c | 13 ++++++++++++- receiver.c | 13 +++++++++++-- rsync.yo | 5 +++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/options.c b/options.c index cd56b2a1..623385ae 100644 --- a/options.c +++ b/options.c @@ -62,6 +62,7 @@ int safe_symlinks=0; int copy_unsafe_links=0; int block_size=BLOCK_SIZE; int size_only=0; +int delete_after=0; char *backup_suffix = BACKUP_SUFFIX; char *tmpdir = NULL; @@ -126,6 +127,7 @@ void usage(int F) rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n"); rprintf(F," --delete delete files that don't exist on the sending side\n"); rprintf(F," --delete-excluded also delete excluded files on the receiving side\n"); + rprintf(F," --delete-after delete after transferring, not before\n"); rprintf(F," --partial keep partially transferred files\n"); rprintf(F," --force force deletion of directories even if not empty\n"); rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n"); @@ -162,7 +164,8 @@ enum {OPT_VERSION, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE, OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT, OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS, OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, - OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS}; + OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS, + OPT_DELETE_AFTER}; static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP"; @@ -217,6 +220,7 @@ static struct option long_options[] = { {"stats", 0, 0, OPT_STATS}, {"progress", 0, 0, OPT_PROGRESS}, {"partial", 0, 0, OPT_PARTIAL}, + {"delete-after",0, 0, OPT_DELETE_AFTER}, {"config", 1, 0, OPT_CONFIG}, {"port", 1, 0, OPT_PORT}, {"log-format", 1, 0, OPT_LOG_FORMAT}, @@ -316,6 +320,10 @@ int parse_arguments(int argc, char *argv[], int frommain) delete_mode = 1; break; + case OPT_DELETE_AFTER: + delete_after = 1; + break; + case OPT_DELETE_EXCLUDED: delete_excluded = 1; delete_mode = 1; @@ -632,6 +640,9 @@ void server_options(char **args,int *argc) if (force_delete) args[ac++] = "--force"; + if (delete_after) + args[ac++] = "--delete-after"; + if (copy_unsafe_links) args[ac++] = "--copy-unsafe-links"; diff --git a/receiver.c b/receiver.c index 96215789..890fadd1 100644 --- a/receiver.c +++ b/receiver.c @@ -304,14 +304,17 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) int recv_ok; extern struct stats stats; extern int preserve_perms; + extern int delete_after; struct stats initial_stats; if (verbose > 2) { rprintf(FINFO,"recv_files(%d) starting\n",flist->count); } - if (recurse && delete_mode && !local_name && flist->count>0) { - delete_files(flist); + if (!delete_after) { + if (recurse && delete_mode && !local_name && flist->count>0) { + delete_files(flist); + } } while (1) { @@ -478,6 +481,12 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) } } + if (delete_after) { + if (recurse && delete_mode && !local_name && flist->count>0) { + delete_files(flist); + } + } + if (preserve_hard_links) do_hard_links(flist); diff --git a/rsync.yo b/rsync.yo index 2ebcd666..f0ac90d8 100644 --- a/rsync.yo +++ b/rsync.yo @@ -453,6 +453,11 @@ dit(bf(--delete-excluded)) In addition to deleting the files on the receiving side that are not on the sending side, this tells rsync to also delete any files on the receiving side that are excluded (see --exclude). +dit(bf(--delete-after)) By default rsync does file deletions before +transferring files to try to ensure that there is sufficient space on +the receiving filesystem. If you want to delete after transferring +then use the --delete-after switch. + dit(bf(--force)) This options tells rsync to delete directories even if they are not empty. This applies to both the --delete option and to cases where rsync tries to copy a normal file but the destination -- 2.34.1