New option allows a symlink to a dir on the receiver where a dir is
authorWayne Davison <wayned@samba.org>
Fri, 4 Jun 2004 05:09:46 +0000 (05:09 +0000)
committerWayne Davison <wayned@samba.org>
Fri, 4 Jun 2004 05:09:46 +0000 (05:09 +0000)
on the sender.

keep-dirlinks.diff [new file with mode: 0644]

diff --git a/keep-dirlinks.diff b/keep-dirlinks.diff
new file mode 100644 (file)
index 0000000..84a6bd6
--- /dev/null
@@ -0,0 +1,78 @@
+--- generator.c        18 May 2004 08:50:17 -0000      1.85
++++ generator.c        4 Jun 2004 05:05:23 -0000
+@@ -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;
+@@ -320,6 +321,11 @@ void recv_generator(char *fname, struct 
+                * recursively create it. */
+               if (dry_run) return; /* XXXX -- might cause inaccuracies?? -- mbp */
++              if (statret == 0 && keep_dirlinks && S_ISLNK(st.st_mode)) {
++                      STRUCT_STAT st2;
++                      if (do_stat(fname, &st2) == 0 && S_ISDIR(st2.st_mode))
++                          st = st2;
++              }
+               if (statret == 0 && !S_ISDIR(st.st_mode)) {
+                       if (robust_unlink(fname) != 0) {
+                               rsyserr(FERROR, errno,
+--- options.c  27 May 2004 21:51:53 -0000      1.153
++++ options.c  4 Jun 2004 05:05:23 -0000
+@@ -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;
+@@ -233,6 +234,7 @@ void usage(enum logcode F)
+   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," -l, --links                 copy symlinks as symlinks\n");
++  rprintf(F," -K, --keep-dirlinks         treat symlinked dir on receiver as dir\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");
+   rprintf(F,"     --safe-links            ignore \"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,   &copy_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 *arg
+               argstr[x++] = 'l';
+       if (copy_links)
+               argstr[x++] = 'L';
++      if (keep_dirlinks && am_sender)
++              argstr[x++] = 'K';
+       if (whole_file > 0)
+               argstr[x++] = 'W';
+--- rsync.yo   21 May 2004 09:44:32 -0000      1.170
++++ rsync.yo   4 Jun 2004 05:05:24 -0000
+@@ -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
+ 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.