X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/be73a66e413dd7599a4adb2f0652c954a5b1e2d2..7ac2aef2fd35ed0cffe2b558b69643f12662a03e:/links-depth.diff diff --git a/links-depth.diff b/links-depth.diff index 64f7b8e..30cac5a 100644 --- a/links-depth.diff +++ b/links-depth.diff @@ -6,20 +6,20 @@ with the latest codebase, but even in its original form it didn't handle relative symlinks properly, and that has not yet been fixed in this modified version. ---- orig/flist.c 2005-01-24 00:18:21 -+++ flist.c 2004-07-16 16:58:04 -@@ -50,6 +50,7 @@ extern int filesfrom_fd; - extern int one_file_system; +--- old/flist.c ++++ new/flist.c +@@ -45,6 +45,7 @@ extern int one_file_system; + extern int copy_dirlinks; extern int keep_dirlinks; extern int preserve_links; +extern int follow_links_depth; extern int preserve_hard_links; - extern int preserve_perms; extern int preserve_devices; -@@ -726,6 +727,30 @@ void receive_file_entry(struct file_stru + extern int preserve_specials; +@@ -715,6 +716,30 @@ static struct file_struct *receive_file_ + return file; } - +#if SUPPORT_LINKS +static int links_depth(char *linkname, STRUCT_STAT *st_ptr) +{ @@ -47,10 +47,10 @@ in this modified version. /** * Create a file_struct for a named file by reading its stat() * information and performing extensive checks against global -@@ -850,7 +875,13 @@ skip_excludes: +@@ -849,7 +874,13 @@ struct file_struct *make_file(char *fnam basename_len = strlen(basename) + 1; /* count the '\0' */ - #if SUPPORT_LINKS + #ifdef SUPPORT_LINKS - linkname_len = S_ISLNK(st.st_mode) ? strlen(linkname) + 1 : 0; + if (S_ISLNK(st.st_mode)) { + if (follow_links_depth && links_depth(linkname, &st)) @@ -62,29 +62,39 @@ in this modified version. #else linkname_len = 0; #endif ---- orig/options.c 2005-01-24 00:18:21 -+++ options.c 2004-07-16 16:12:29 -@@ -42,6 +42,7 @@ int archive_mode = 0; - int keep_dirlinks = 0; +--- old/options.c ++++ new/options.c +@@ -44,6 +44,7 @@ int keep_dirlinks = 0; + int copy_dirlinks = 0; int copy_links = 0; int preserve_links = 0; +int follow_links_depth = 0; int preserve_hard_links = 0; int preserve_perms = 0; - int preserve_devices = 0; -@@ -253,6 +254,7 @@ void usage(enum logcode F) - rprintf(F," --inplace update destination files in-place (SEE MAN PAGE)\n"); + int preserve_executability = 0; +@@ -287,6 +288,7 @@ void usage(enum logcode F) + rprintf(F," --append append data onto shorter files\n"); rprintf(F," -d, --dirs transfer directories without recursing\n"); rprintf(F," -l, --links copy symlinks as symlinks\n"); + rprintf(F," --links-depth=NUM follow symlinks up to NUM depth\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"); -@@ -360,6 +362,7 @@ static struct poptOption long_options[] - {"inplace", 0, POPT_ARG_NONE, &inplace, 0, 0, 0 }, - {"dirs", 'd', POPT_ARG_VAL, &xfer_dirs, 2, 0, 0 }, - {"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 }, + rprintf(F," -L, --copy-links transform symlink into referent file/dir\n"); + rprintf(F," --copy-unsafe-links only \"unsafe\" symlinks are transformed\n"); + rprintf(F," --safe-links ignore symlinks that point outside the source tree\n"); +@@ -432,6 +434,7 @@ static struct poptOption long_options[] + {"links", 'l', POPT_ARG_VAL, &preserve_links, 1, 0, 0 }, + {"no-links", 0, POPT_ARG_VAL, &preserve_links, 0, 0, 0 }, + {"no-l", 0, POPT_ARG_VAL, &preserve_links, 0, 0, 0 }, + {"links-depth", 0, POPT_ARG_INT, &follow_links_depth , 0, 0, 0 }, {"copy-links", 'L', POPT_ARG_NONE, ©_links, 0, 0, 0 }, - {"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 }, - {"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 }, + {"copy-unsafe-links",0, POPT_ARG_NONE, ©_unsafe_links, 0, 0, 0 }, + {"safe-links", 0, POPT_ARG_NONE, &safe_symlinks, 0, 0, 0 }, +--- old/rsync.yo ++++ new/rsync.yo +@@ -313,6 +313,7 @@ to the detailed description below for a + --append append data onto shorter files + -d, --dirs transfer directories without recursing + -l, --links copy symlinks as symlinks ++ --links-depth=NUM follow symlinks up to NUM depth + -L, --copy-links transform symlink into referent file/dir + --copy-unsafe-links only "unsafe" symlinks are transformed + --safe-links ignore symlinks that point outside the tree