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 @@ -467,7 +467,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 @@ -1988,6 +1990,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 && quick_check_ok(FT_REG, 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 @@ -740,7 +740,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 @@ -2796,8 +2798,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 @@ -445,6 +445,8 @@ has its own detailed description later in this manpage.
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 @@ -2516,6 +2518,20 @@ option name from the pathname using a space if you want the shell to expand it.
104 otential alternate-basis files will be removed as the transfer progresses.
105 This option conflicts with [`--inplace`](#opt) and [`--append`](#opt).
107 +0. `--detect-renamed-lax`
109 + This version of [`--detect-renamed`](#opt) makes rsync hard-link `dest/D`
110 + to `dest/S` without verifying that `src/S` and `dest/S` have the same data.
111 + This poses a significant risk of corrupting the destination by representing
112 + a new source file by an unrelated destination file that coincidentally
113 + passes the quick check with the source file. Use this option only if you
114 + accept the risk and disk I/O is a bottleneck.
118 + A less risky variant of [`--detect-renamed-lax`](#opt) that only uses a
119 + destination file that has the same basename as the new source file.
121 0. `--compare-dest=DIR`
123 This option instructs rsync to use _DIR_ on the destination machine as an