From 716e73d483d33a1457be8f4b0e72bb39c11ca171 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sat, 5 Jun 2004 16:16:30 +0000 Subject: [PATCH] New --keep-dirlinks option. --- generator.c | 17 ++++++++++++++--- options.c | 5 +++++ rsync.yo | 5 +++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/generator.c b/generator.c index 80533484..9cbfe75d 100644 --- a/generator.c +++ b/generator.c @@ -26,6 +26,7 @@ extern int verbose; extern int dry_run; extern int relative_paths; +extern int keep_dirlinks; extern int preserve_links; extern int am_root; extern int preserve_devices; @@ -302,6 +303,15 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out) return; } +#if SUPPORT_LINKS + if (statret == 0 && keep_dirlinks + && S_ISLNK(st.st_mode) && S_ISDIR(file->mode)) { + STRUCT_STAT st2; + if (do_stat(fname, &st2) == 0 && S_ISDIR(st2.st_mode)) + st = st2; + } +#endif + if (statret == 0 && !preserve_perms && (S_ISDIR(st.st_mode) == S_ISDIR(file->mode))) { @@ -338,9 +348,10 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out) full_fname(fname)); } } - /* f_out is set to -1 when doing final directory - permission and modification time repair */ - if (set_perms(fname,file,NULL,0) && verbose && (f_out != -1)) + /* f_out is set to -1 when doing final directory-permission + * and modification-time repair. */ + if (set_perms(fname, file, statret ? NULL : &st, 0) + && verbose && f_out != -1) rprintf(FINFO,"%s/\n",fname); return; } diff --git a/options.c b/options.c index 69eac5c7..2f73baee 100644 --- a/options.c +++ b/options.c @@ -38,6 +38,7 @@ int make_backups = 0; int whole_file = -1; int archive_mode = 0; +int keep_dirlinks = 0; int copy_links = 0; int preserve_links = 0; int preserve_hard_links = 0; @@ -232,6 +233,7 @@ void usage(enum logcode F) rprintf(F," --backup-dir make backups into this directory\n"); rprintf(F," --suffix=SUFFIX backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX); rprintf(F," -u, --update update only (don't overwrite newer files)\n"); + rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n"); rprintf(F," -l, --links copy symlinks as symlinks\n"); rprintf(F," -L, --copy-links copy the referent of all symlinks\n"); rprintf(F," --copy-unsafe-links copy the referent of \"unsafe\" symlinks\n"); @@ -338,6 +340,7 @@ static struct poptOption long_options[] = { {"sparse", 'S', POPT_ARG_NONE, &sparse_files, 0, 0, 0 }, {"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude, 0, 0, 0 }, {"update", 'u', POPT_ARG_NONE, &update_only, 0, 0, 0 }, + {"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 }, {"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 }, {"copy-links", 'L', POPT_ARG_NONE, ©_links, 0, 0, 0 }, {"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 }, @@ -818,6 +821,8 @@ void server_options(char **args,int *argc) argstr[x++] = 'l'; if (copy_links) argstr[x++] = 'L'; + if (keep_dirlinks && am_sender) + argstr[x++] = 'K'; if (whole_file > 0) argstr[x++] = 'W'; diff --git a/rsync.yo b/rsync.yo index 0ad37f0c..4805c010 100644 --- a/rsync.yo +++ b/rsync.yo @@ -289,6 +289,7 @@ verb( --backup-dir make backups into this directory --suffix=SUFFIX backup suffix (default ~ w/o --backup-dir) -u, --update update only (don't overwrite newer files) + -K, --keep-dirlinks treat symlinked dir on receiver as dir -l, --links copy symlinks as symlinks -L, --copy-links copy the referent of all symlinks --copy-unsafe-links copy the referent of "unsafe" symlinks @@ -479,6 +480,10 @@ symlink where the destination has a file, the transfer would occur regardless of the timestamps. This might change in the future (feel free to comment on this on the mailing list if you have an opinion). +dit(bf(-K, --keep-dirlinks)) On the receiving side, if a symlink is +pointing to a directory, it will be treated as matching a directory +from the sender. + dit(bf(-l, --links)) When symlinks are encountered, recreate the symlink on the destination. -- 2.34.1