Updated to apply cleanly.
[rsync/rsync-patches.git] / only-write-batch.diff
1 --- orig/batch.c        2005-03-27 05:13:14
2 +++ batch.c     2005-03-27 05:14:42
3 @@ -139,7 +139,7 @@ static void write_filter_rules(int fd)
4   * (hopefully) work. */
5  void write_batch_shell_file(int argc, char *argv[], int file_arg_cnt)
6  {
7 -       int fd, i;
8 +       int fd, i, len;
9         char *p, filename[MAXPATHLEN];
10  
11         stringjoin(filename, sizeof filename,
12 @@ -175,11 +175,12 @@ void write_batch_shell_file(int argc, ch
13                         continue;
14                 }
15                 write(fd, " ", 1);
16 -               if (strncmp(p, "--write-batch", 13) == 0) {
17 +               if (strncmp(p, "--write-batch", len = 13) == 0
18 +                || strncmp(p, "--only-write-batch", len = 18) == 0) {
19                         write(fd, "--read-batch", 12);
20 -                       if (p[13] == '=') {
21 +                       if (p[len] == '=') {
22                                 write(fd, "=", 1);
23 -                               write_arg(fd, p + 14);
24 +                               write_arg(fd, p + len + 1);
25                         }
26                 } else
27                         write_arg(fd, p);
28 --- orig/generator.c    2005-03-29 01:05:12
29 +++ generator.c 2005-03-24 07:07:12
30 @@ -25,6 +25,7 @@
31  
32  extern int verbose;
33  extern int dry_run;
34 +extern int do_xfers;
35  extern int log_format_has_i;
36  extern int log_format_has_o_or_i;
37  extern int daemon_log_format_has_i;
38 @@ -1001,7 +1002,7 @@ prepare_to_open:
39                 statret = 0;
40         }
41  
42 -       if (dry_run || read_batch || whole_file)
43 +       if (!do_xfers || read_batch || whole_file)
44                 goto notify_others;
45  
46         if (fuzzy_basis) {
47 @@ -1073,7 +1074,7 @@ notify_others:
48                         fuzzy_file ? fuzzy_file->basename : NULL);
49         }
50  
51 -       if (dry_run) {
52 +       if (!do_xfers) {
53                 if (preserve_hard_links && file->link_u.links)
54                         hard_link_cluster(file, ndx, itemizing, code);
55                 return;
56 @@ -1121,9 +1122,9 @@ void generate_files(int f_out, struct fi
57                 maybe_PERMS_REPORT = log_format_has_i ? 0 : PERMS_REPORT;
58                 code = daemon_log_format_has_i ? 0 : FLOG;
59         } else if (am_daemon) {
60 -               itemizing = daemon_log_format_has_i && !dry_run;
61 +               itemizing = daemon_log_format_has_i && do_xfers;
62                 maybe_PERMS_REPORT = PERMS_REPORT;
63 -               code = itemizing || dry_run ? FCLIENT : FINFO;
64 +               code = itemizing || !do_xfers ? FCLIENT : FINFO;
65         } else if (!am_server) {
66                 itemizing = log_format_has_i;
67                 maybe_PERMS_REPORT = log_format_has_i ? 0 : PERMS_REPORT;
68 --- orig/main.c 2005-03-16 02:19:30
69 +++ main.c      2005-03-24 07:07:12
70 @@ -168,7 +168,7 @@ static void report(int f)
71                         stats.flist_buildtime = read_longint(f);
72                         stats.flist_xfertime = read_longint(f);
73                 }
74 -       } else if (write_batch) {
75 +       } else if (write_batch && !am_server) {
76                 /* The --read-batch process is going to be a client
77                  * receiver, so we need to give it the stats. */
78                 write_longint(batch_fd, total_read);
79 @@ -583,7 +583,7 @@ static int do_recv(int f_in,int f_out,st
80  
81         am_generator = 1;
82         close_multiplexing_in();
83 -       if (write_batch)
84 +       if (write_batch && !am_server)
85                 stop_write_batch();
86  
87         close(error_pipe[1]);
88 @@ -756,7 +756,7 @@ int client_run(int f_in, int f_out, pid_
89                 if (filesfrom_host)
90                         filesfrom_fd = f_in;
91  
92 -               if (write_batch)
93 +               if (write_batch && !am_server)
94                         start_write_batch(f_out);
95                 flist = send_file_list(f_out, argc, argv);
96                 set_msg_fd_in(-1);
97 @@ -793,7 +793,7 @@ int client_run(int f_in, int f_out, pid_
98                 filesfrom_fd = -1;
99         }
100  
101 -       if (write_batch)
102 +       if (write_batch && !am_server)
103                 start_write_batch(f_in);
104         flist = recv_file_list(f_in);
105         if (!flist || flist->count == 0) {
106 @@ -1111,7 +1111,7 @@ int main(int argc,char *argv[])
107  
108         init_flist();
109  
110 -       if (write_batch || read_batch) {
111 +       if ((write_batch || read_batch) && !am_server) {
112                 if (write_batch)
113                         write_batch_shell_file(orig_argc, orig_argv, argc);
114  
115 @@ -1130,6 +1130,8 @@ int main(int argc,char *argv[])
116                 if (read_batch)
117                         read_stream_flags(batch_fd);
118         }
119 +       if (write_batch < 0)
120 +               dry_run = 1;
121  
122         if (am_daemon && !am_server)
123                 return daemon_main();
124 --- orig/options.c      2005-03-28 20:56:55
125 +++ options.c   2005-03-24 07:07:13
126 @@ -53,6 +53,7 @@ int omit_dir_times = 0;
127  int update_only = 0;
128  int cvs_exclude = 0;
129  int dry_run = 0;
130 +int do_xfers = 1;
131  int ignore_times = 0;
132  int delete_mode = 0;
133  int delete_during = 0;
134 @@ -344,6 +345,7 @@ void usage(enum logcode F)
135    rprintf(F,"     --list-only             list the files instead of copying them\n");
136    rprintf(F,"     --bwlimit=KBPS          limit I/O bandwidth; KBytes per second\n");
137    rprintf(F,"     --write-batch=FILE      write a batched update to FILE\n");
138 +  rprintf(F,"     --only-write-batch=FILE like --write-batch but w/o updating destination\n");
139    rprintf(F,"     --read-batch=FILE       read a batched update from FILE\n");
140    rprintf(F,"     --protocol=NUM          force an older protocol version to be used\n");
141  #ifdef INET6
142 @@ -360,7 +362,8 @@ void usage(enum logcode F)
143  enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
144        OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST,
145        OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
146 -      OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_MAX_SIZE,
147 +      OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_ONLY_WRITE_BATCH,
148 +      OPT_TIMEOUT, OPT_MAX_SIZE,
149        OPT_REFUSED_BASE = 9000};
150  
151  static struct poptOption long_options[] = {
152 @@ -450,6 +453,7 @@ static struct poptOption long_options[] 
153    {"hard-links",      'H', POPT_ARG_NONE,   &preserve_hard_links, 0, 0, 0 },
154    {"read-batch",       0,  POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 },
155    {"write-batch",      0,  POPT_ARG_STRING, &batch_name, OPT_WRITE_BATCH, 0, 0 },
156 +  {"only-write-batch", 0,  POPT_ARG_STRING, &batch_name, OPT_ONLY_WRITE_BATCH, 0, 0 },
157    {"files-from",       0,  POPT_ARG_STRING, &files_from, 0, 0, 0 },
158    {"from0",           '0', POPT_ARG_NONE,   &eol_nulls, 0, 0, 0},
159    {"no-implied-dirs",  0,  POPT_ARG_VAL,    &implied_dirs, 0, 0, 0 },
160 @@ -791,6 +795,11 @@ int parse_arguments(int *argc, const cha
161                         write_batch = 1;
162                         break;
163  
164 +               case OPT_ONLY_WRITE_BATCH:
165 +                       /* batch_name is already set */
166 +                       write_batch = -1;
167 +                       break;
168 +
169                 case OPT_READ_BATCH:
170                         /* batch_name is already set */
171                         read_batch = 1;
172 @@ -901,7 +910,7 @@ int parse_arguments(int *argc, const cha
173                         "--write-batch and --read-batch can not be used together\n");
174                 return 0;
175         }
176 -       if (write_batch || read_batch) {
177 +       if (write_batch > 0 || read_batch) {
178                 if (am_server) {
179                         rprintf(FINFO,
180                                 "ignoring --%s-batch option sent to server\n",
181 @@ -1093,6 +1102,9 @@ int parse_arguments(int *argc, const cha
182             && !am_server)
183                 verbose = 1;
184  
185 +       if (dry_run)
186 +               do_xfers = 0;
187 +
188         if (verbose && !log_format) {
189                 log_format = "%n%L";
190                 log_before_transfer = !am_server;
191 @@ -1246,7 +1258,7 @@ void server_options(char **args,int *arg
192                 argstr[x++] = 'b';
193         if (update_only)
194                 argstr[x++] = 'u';
195 -       if (dry_run)
196 +       if (!do_xfers)
197                 argstr[x++] = 'n';
198         if (preserve_links)
199                 argstr[x++] = 'l';
200 @@ -1374,6 +1386,8 @@ void server_options(char **args,int *arg
201                         args[ac++] = "--delete-after";
202                 if (force_delete)
203                         args[ac++] = "--force";
204 +               if (write_batch < 0)
205 +                       args[ac++] = "--only-write-batch=X";
206         }
207  
208         if (size_only)
209 --- orig/pipe.c 2005-02-07 20:36:43
210 +++ pipe.c      2005-03-24 07:07:13
211 @@ -25,7 +25,6 @@ extern int am_sender;
212  extern int am_server;
213  extern int blocking_io;
214  extern int orig_umask;
215 -extern int write_batch;
216  extern int filesfrom_fd;
217  
218  /**
219 @@ -128,10 +127,6 @@ pid_t local_child(int argc, char **argv,
220                 am_sender = !am_sender;
221                 am_server = 1;
222  
223 -               /* The server side never writes the batch, even if it
224 -                * is local (it makes the logic easier elsewhere). */
225 -               write_batch = 0;
226 -
227                 if (!am_sender)
228                         filesfrom_fd = -1;
229  
230 --- orig/receiver.c     2005-03-24 16:41:46
231 +++ receiver.c  2005-03-24 07:07:13
232 @@ -21,7 +21,7 @@
233  #include "rsync.h"
234  
235  extern int verbose;
236 -extern int dry_run;
237 +extern int do_xfers;
238  extern int am_daemon;
239  extern int am_server;
240  extern int do_progress;
241 @@ -30,6 +30,7 @@ extern int log_format_has_i;
242  extern int daemon_log_format_has_i;
243  extern int csum_length;
244  extern int read_batch;
245 +extern int write_batch;
246  extern int batch_gen_fd;
247  extern int protocol_version;
248  extern int relative_paths;
249 @@ -435,13 +436,18 @@ int recv_files(int f_in, struct file_lis
250                         exit_cleanup(RERR_PROTOCOL);
251                 }
252  
253 -               if (dry_run) { /* log the transfer */
254 +               if (!do_xfers) { /* log the transfer */
255                         if (!am_server && log_format)
256                                 log_item(file, &stats, iflags, NULL);
257                         if (read_batch)
258                                 discard_receive_data(f_in, file->length);
259                         continue;
260                 }
261 +               if (write_batch < 0) {
262 +                       log_item(file, &stats, iflags, NULL);
263 +                       discard_receive_data(f_in, file->length);
264 +                       continue;
265 +               }
266  
267                 if (read_batch) {
268                         while (i > next_gen_i) {
269 --- orig/rsync.yo       2005-03-28 20:56:55
270 +++ rsync.yo    2005-03-27 05:13:01
271 @@ -379,6 +379,7 @@ to the detailed description below for a 
272       --list-only             list the files instead of copying them
273       --bwlimit=KBPS          limit I/O bandwidth; KBytes per second
274       --write-batch=FILE      write a batched update to FILE
275 +     --only-write-batch=FILE like --write-batch but w/o updating dest
276       --read-batch=FILE       read a batched update from FILE
277       --protocol=NUM          force an older protocol version to be used
278       --checksum-seed=NUM     set block/file checksum seed (advanced)
279 @@ -1271,6 +1272,16 @@ dit(bf(--write-batch=FILE)) Record a fil
280  another identical destination with bf(--read-batch). See the "BATCH MODE"
281  section for details.
282  
283 +dit(bf(--only-write-batch=FILE)) Works like bf(--write-batch), except that
284 +no updates are made on the destination system when creating the batch.
285 +This lets you transport the changes to the destination system via some
286 +other means and then apply the changes via bf(--read-batch).  Note that
287 +you can feel free to write the batch directly to some portable media: if
288 +this media fills to capacity before the end of the transfer, you can just
289 +apply that partial transfer to the destination and repeat the whole process
290 +to get the rest of the changes (as long as you don't mind a partially
291 +updated destination system while the multi-update cycle is happening).
292 +
293  dit(bf(--read-batch=FILE)) Apply all of the changes stored in FILE, a
294  file previously generated by bf(--write-batch).
295  If em(FILE) is "-" the batch data will be read from standard input.
296 --- orig/sender.c       2005-03-28 20:56:55
297 +++ sender.c    2005-03-24 07:07:13
298 @@ -20,7 +20,7 @@
299  #include "rsync.h"
300  
301  extern int verbose;
302 -extern int dry_run;
303 +extern int do_xfers;
304  extern int am_server;
305  extern int am_daemon;
306  extern int log_before_transfer;
307 @@ -34,6 +34,8 @@ extern int updating_basis_file;
308  extern int make_backups;
309  extern int do_progress;
310  extern int inplace;
311 +extern int batch_fd;
312 +extern int write_batch;
313  extern struct stats stats;
314  extern struct file_list *the_file_list;
315  extern char *log_format;
316 @@ -208,6 +210,7 @@ void send_files(struct file_list *flist,
317         int save_make_backups = make_backups;
318         int itemizing = am_daemon ? daemon_log_format_has_i
319                       : !am_server && log_format_has_i;
320 +       int f_xfer = write_batch < 0 ? batch_fd : f_out;
321         int i, j;
322  
323         if (verbose > 2)
324 @@ -230,7 +233,7 @@ void send_files(struct file_list *flist,
325                         continue;
326                 }
327  
328 -               iflags = read_item_attrs(f_in, f_out, i, &fnamecmp_type,
329 +               iflags = read_item_attrs(f_in, f_xfer, i, &fnamecmp_type,
330                                          xname, &xlen);
331                 if (iflags == ITEM_IS_NEW) /* no-op packet */
332                         continue;
333 @@ -266,10 +269,10 @@ void send_files(struct file_list *flist,
334                 stats.num_transferred_files++;
335                 stats.total_transferred_size += file->length;
336  
337 -               if (dry_run) { /* log the transfer */
338 +               if (!do_xfers) { /* log the transfer */
339                         if (!am_server && log_format)
340                                 log_item(file, &stats, iflags, NULL);
341 -                       write_ndx_and_attrs(f_out, i, iflags, fnamecmp_type,
342 +                       write_ndx_and_attrs(f_xfer, i, iflags, fnamecmp_type,
343                                             xname, xlen);
344                         continue;
345                 }
346 @@ -321,9 +324,9 @@ void send_files(struct file_list *flist,
347                                 safe_fname(fname), (double)st.st_size);
348                 }
349  
350 -               write_ndx_and_attrs(f_out, i, iflags, fnamecmp_type,
351 +               write_ndx_and_attrs(f_xfer, i, iflags, fnamecmp_type,
352                                     xname, xlen);
353 -               write_sum_head(f_out, s);
354 +               write_sum_head(f_xfer, s);
355  
356                 if (verbose > 2) {
357                         rprintf(FINFO, "calling match_sums %s\n",
358 @@ -337,7 +340,7 @@ void send_files(struct file_list *flist,
359  
360                 set_compression(fname);
361  
362 -               match_sums(f_out, s, mbuf, st.st_size);
363 +               match_sums(f_xfer, s, mbuf, st.st_size);
364                 if (do_progress)
365                         end_progress(st.st_size);
366