1 This patch adds the options --detect-renamed-lax and --detect-moved.
2 These modify the --detect-renamed algorithm to adopt a matching file
3 without verifying that the content is as expected. The former blindly
4 accepts a file that matches in size and modified time. The latter
5 requires that the filename also match (ignoring any renamed files).
7 This patch is EXPERIMENTAL, though it did work correctly in my light
10 To use this patch, run these commands for a successful build:
12 patch -p1 <patches/detect-renamed.diff
13 patch -p1 <patches/detect-renamed-lax.diff
14 ./configure (optional if already run)
17 FIXME: If a run with --detect-renamed-lax stages a different-basename
18 destination file and then gets interrupted, a subsequent run that
19 switches to --detect-moved blindly accepts the staged file.
21 -- Matt McCutchen <hashproduct+rsync@gmail.com>
23 based-on: patch/master/detect-renamed
24 diff --git a/generator.c b/generator.c
27 @@ -468,7 +468,9 @@ static int fattr_find(struct file_struct *f, char *fname)
32 + /* --detect-moved doesn't allow non-basename matches */
33 + if (detect_renamed != 3)
35 diff = u_strcmp(fmid->basename, f->basename);
38 @@ -1953,6 +1955,21 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
39 fnamecmp = partialptr;
40 fnamecmp_type = FNAMECMP_PARTIAL_DIR;
42 + if (detect_renamed > 1 && unchanged_file(fnamecmp, file, &sx.st)) {
43 + /* Adopt the partial file. */
44 + finish_transfer(fname, fnamecmp, NULL, NULL, file, 1, 1);
45 + handle_partial_dir(partialptr, PDIR_DELETE);
47 + itemize(fnamecmp, file, ndx, -1, &sx,
48 + ITEM_LOCAL_CHANGE, fnamecmp_type, NULL);
49 +#ifdef SUPPORT_HARD_LINKS
50 + if (preserve_hard_links && F_IS_HLINKED(file))
51 + finish_hard_link(file, fname, ndx, &sx.st, itemizing, code, -1);
53 + if (remove_source_files == 1)
54 + goto return_with_success;
60 diff --git a/options.c b/options.c
63 @@ -891,7 +891,9 @@ static struct poptOption long_options[] = {
64 {"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
65 {"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
66 {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
67 - {"detect-renamed", 0, POPT_ARG_NONE, &detect_renamed, 0, 0, 0 },
68 + {"detect-renamed", 0, POPT_ARG_VAL, &detect_renamed, 1, 0, 0 },
69 + {"detect-renamed-lax",0, POPT_ARG_VAL, &detect_renamed, 2, 0, 0 },
70 + {"detect-moved", 0, POPT_ARG_VAL, &detect_renamed, 3, 0, 0 },
71 {"fuzzy", 'y', POPT_ARG_NONE, 0, 'y', 0, 0 },
72 {"no-fuzzy", 0, POPT_ARG_VAL, &fuzzy_basis, 0, 0, 0 },
73 {"no-y", 0, POPT_ARG_VAL, &fuzzy_basis, 0, 0, 0 },
74 @@ -2709,8 +2711,14 @@ void server_options(char **args, int *argc_p)
75 args[ac++] = "--super";
77 args[ac++] = "--size-only";
79 - args[ac++] = "--detect-renamed";
80 + if (detect_renamed) {
81 + if (detect_renamed == 1)
82 + args[ac++] = "--detect-renamed";
83 + else if (detect_renamed == 2)
84 + args[ac++] = "--detect-renamed-lax";
86 + args[ac++] = "--detect-moved";
89 args[ac++] = "--stats";
91 diff --git a/rsync.1.md b/rsync.1.md
94 @@ -419,6 +419,8 @@ detailed description below for a complete description.
95 --temp-dir=DIR, -T create temporary files in directory DIR
96 --fuzzy, -y find similar file for basis if no dest file
97 --detect-renamed try to find renamed files to speed the xfer
98 +--detect-renamed-lax ...& assume identical to src files (risky!)
99 +--detect-moved ... only if basenames match (less risky)
100 --compare-dest=DIR also compare destination files relative to DIR
101 --copy-dest=DIR ... and include copies of unchanged files
102 --link-dest=DIR hardlink to files in DIR when unchanged
103 @@ -2177,6 +2179,17 @@ your home directory (remove the '=' for that).
104 otential alternate-basis files will be removed as the transfer progresses.
105 This option conflicts with `--inplace` and `--append`.
107 +0. ``--detect-renamed-lax`) This version of `--detect-renamed` makes rsync
108 + hard-link em(dest/D) to em(dest/S) without verifying that em(src/S) and
109 + em(dest/S) have the same data. This poses a significant risk of corrupting
110 + the destination by representing a new source file by an unrelated
111 + destination file that coincidentally passes the quick check with the source
112 + file. Use this option only if you accept the risk and disk I/O is a
115 +0. ``--detect-moved`` A less risky variant of `--detect-renamed-lax` that only
116 + uses a destination file that has the same basename as the new source file.
118 0. `--compare-dest=DIR`
120 This option instructs rsync to use _DIR_ on the destination machine as an