7d2e75bf44eb1a8787ad2b9f56c1b2a338a9d2f1
[rsync-patches.git] / inplace-protocol-bump.diff
1 This patch sends the new fnamecmp_type value from the generator to the
2 sender if --inplace was specified.  This allows the sender to know when
3 the transfer can fully utilize the basis file (i.e., when the basis file
4 is not the destination file).
5
6 --- orig/generator.c    2004-11-11 22:13:09
7 +++ generator.c 2004-11-03 20:37:57
8 @@ -568,6 +568,8 @@ prepare_to_open:
9  
10  notify_others:
11         write_int(f_out, i);
12 +       if (protocol_version >= 29 && inplace && !read_batch)
13 +               write_byte(f_out, fnamecmp_type);
14         if (f_out_name >= 0)
15                 write_byte(f_out_name, fnamecmp_type);
16  
17 --- orig/match.c        2004-09-07 21:45:30
18 +++ match.c     2004-11-12 05:48:57
19 @@ -23,8 +23,8 @@ extern int verbose;
20  extern int am_server;
21  extern int do_progress;
22  extern int checksum_seed;
23 -extern int inplace;
24 -extern int make_backups;
25 +
26 +int updating_basis_file;
27  
28  typedef unsigned short tag;
29  
30 @@ -203,9 +203,9 @@ static void hash_search(int f,struct sum
31                         if (l != s->sums[i].len)
32                                 continue;
33  
34 -                       /* inplace: ensure chunk's offset is either >= our
35 +                       /* in-place: ensure chunk's offset is either >= our
36                          * offset or that the data didn't move. */
37 -                       if (inplace && !make_backups && s->sums[i].offset < offset
38 +                       if (updating_basis_file && s->sums[i].offset < offset
39                             && !(s->sums[i].flags & SUMFLG_SAME_OFFSET))
40                                 continue;
41  
42 @@ -224,10 +224,10 @@ static void hash_search(int f,struct sum
43                                 continue;
44                         }
45  
46 -                       /* If inplace is enabled, the best possible match is
47 +                       /* When updating in-place, the best possible match is
48                          * one with an identical offset, so we prefer that over
49                          * the following want_i optimization. */
50 -                       if (inplace && !make_backups) {
51 +                       if (updating_basis_file) {
52                                 do {
53                                         size_t i2 = targets[j].i;
54                                         if (s->sums[i2].offset != offset)
55 @@ -250,7 +250,7 @@ static void hash_search(int f,struct sum
56                         /* we've found a match, but now check to see
57                          * if want_i can hint at a better match. */
58                         if (i != want_i && want_i < s->count
59 -                           && (!inplace || make_backups || s->sums[want_i].offset >= offset
60 +                           && (!updating_basis_file || s->sums[want_i].offset >= offset
61                              || s->sums[want_i].flags & SUMFLG_SAME_OFFSET)
62                             && sum == s->sums[want_i].sum1
63                             && memcmp(sum2, s->sums[want_i].sum2, s->s2length) == 0) {
64 --- orig/options.c      2004-11-11 22:13:09
65 +++ options.c   2004-11-03 20:47:21
66 @@ -917,10 +917,9 @@ int parse_arguments(int *argc, const cha
67                          am_server ? "server" : "client");
68                 return 0;
69  #endif
70 -               if (compare_dest) {
71 +               if (link_dest) {
72                         snprintf(err_buf, sizeof err_buf,
73 -                                "--inplace does not yet work with %s\n",
74 -                                link_dest ? "--link-dest" : "--compare-dest");
75 +                                "--inplace does not yet work with --link-dest\n");
76                         return 0;
77                 }
78         } else {
79 --- orig/rsync.h        2004-11-03 20:30:45
80 +++ rsync.h     2004-11-03 20:32:34
81 @@ -62,7 +62,7 @@
82  #define FLAG_MOUNT_POINT (1<<2)        /* sender only */
83  
84  /* update this if you make incompatible changes */
85 -#define PROTOCOL_VERSION 28
86 +#define PROTOCOL_VERSION 29
87  
88  /* We refuse to interoperate with versions that are not in this range.
89   * Note that we assume we'll work with later versions: the onus is on
90 --- orig/sender.c       2004-09-20 05:10:48
91 +++ sender.c    2004-11-12 05:51:25
92 @@ -27,7 +27,9 @@ extern int dry_run;
93  extern int am_server;
94  extern int am_daemon;
95  extern int protocol_version;
96 +extern int updating_basis_file;
97  extern int make_backups;
98 +extern int inplace;
99  extern struct stats stats;
100  
101  
102 @@ -166,6 +168,11 @@ void send_files(struct file_list *flist,
103                 } else
104                         offset = 0;
105                 fname2 = f_name_to(file, fname + offset);
106 +               if (inplace && protocol_version >= 29) {
107 +                       uchar fnamecmp_type = read_byte(f_in);
108 +                       updating_basis_file = fnamecmp_type == FNAMECMP_FNAME;
109 +               } else
110 +                       updating_basis_file = inplace && !make_backups;
111  
112                 if (verbose > 2)
113                         rprintf(FINFO, "send_files(%d, %s)\n", i, fname);