From: Wayne Davison Date: Tue, 21 Sep 2004 15:48:45 +0000 (+0000) Subject: This patch shouldn't be needed anymore. X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/commitdiff_plain/325e856261427dc2d5c6ca407eca3dfce3befd69 This patch shouldn't be needed anymore. --- diff --git a/unique-dirs.diff b/unique-dirs.diff deleted file mode 100644 index 8c6f743..0000000 --- a/unique-dirs.diff +++ /dev/null @@ -1,75 +0,0 @@ -This tries to keep symlink loops from happening when using -the --copy-links option (on the sender) and when using the ---keep-dirlinks option with --delete (on the receiver). It -would be nice to improve this so that duplicates get turned -back into symlinks, but the code needs to know which one is -the real dir (if it is present in the list) because that one -entry can't be turned into a symlink. - ---- orig/flist.c 2004-09-21 09:40:27 -+++ flist.c 2004-08-31 20:44:33 -@@ -726,6 +726,43 @@ void receive_file_entry(struct file_stru - } - - -+static BOOL saw_dir(dev_t dev, ino_t ino) -+{ -+ static struct dirinfo { dev_t dev; ino_t ino; } *dirarray; -+ static int dirarray_cnt, dirarray_size; -+ int low, high; -+ -+ if (dirarray_cnt == dirarray_size) { -+ dirarray = realloc_array(dirarray, struct dirinfo, -+ dirarray_size += 4096); -+ } -+ -+ for (low = 0, high = dirarray_cnt - 1; low <= high; ) { -+ int mid = (low + high) / 2; -+ if (ino == dirarray[mid].ino) { -+ if (dev == dirarray[mid].dev) -+ return True; -+ if (dev > dirarray[mid].dev) -+ low = mid + 1; -+ else -+ high = mid - 1; -+ } else if (ino > dirarray[mid].ino) -+ low = mid + 1; -+ else -+ high = mid - 1; -+ } -+ -+ if (low < dirarray_cnt) { -+ memmove(dirarray + low + 1, dirarray + low, -+ (dirarray_cnt - low) * sizeof dirarray[0]); -+ } -+ dirarray[low].dev = dev; -+ dirarray[low].ino = ino; -+ dirarray_cnt++; -+ -+ return False; -+} -+ - /** - * Create a file_struct for a named file by reading its stat() - * information and performing extensive checks against global -@@ -804,9 +841,17 @@ struct file_struct *make_file(char *fnam - if (exclude_level == NO_EXCLUDES) - goto skip_excludes; - -- if (S_ISDIR(st.st_mode) && !recurse && !files_from) { -- rprintf(FINFO, "skipping directory %s\n", thisname); -- return NULL; -+ if (S_ISDIR(st.st_mode)) { -+ if (!recurse && !files_from) { -+ rprintf(FINFO, "skipping directory %s\n", thisname); -+ return NULL; -+ } -+ if ((keep_dirlinks || copy_links) -+ && saw_dir(st.st_dev, st.st_ino)) { -+ rprintf(FINFO, "skipping duplicate directory %s\n", -+ thisname); -+ return NULL; -+ } - } - - /* We only care about directories because we need to avoid recursing