The "ndx" variable now holds the unique, over-the-wire value, not
[rsync/rsync.git] / receiver.c
index 26ed324..4afdfc5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1996-2000 Andrew Tridgell
  * Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2003, 2004, 2005, 2006 Wayne Davison
+ * Copyright (C) 2003, 2004, 2005, 2006, 2007 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@ extern int verbose;
 extern int do_xfers;
 extern int am_server;
 extern int do_progress;
-extern int incremental;
+extern int inc_recurse;
 extern int log_before_transfer;
 extern int stdout_format_has_i;
 extern int logfile_format_has_i;
@@ -49,7 +49,6 @@ extern int checksum_seed;
 extern int inplace;
 extern int delay_updates;
 extern struct stats stats;
-extern char *stdout_format;
 extern char *tmpdir;
 extern char *partial_dir;
 extern char *basis_dir[];
@@ -57,7 +56,7 @@ extern struct file_list *cur_flist, *first_flist;
 extern struct filter_list_struct server_filter_list;
 
 static struct bitbag *delayed_bits = NULL;
-static int phase = 0;
+static int phase = 0, redoing = 0;
 /* We're either updating the basis file or an identical copy: */
 static int updating_basis;
 
@@ -314,12 +313,12 @@ static int get_next_gen_ndx(int fd, int next_gen_ndx, int desired_ndx)
                if (next_gen_ndx >= 0) {
                        rprintf(FINFO,
                                "(No batched update for%s \"%s\")\n",
-                               phase ? " resend of" : "",
+                               redoing ? " resend of" : "",
                                f_name(cur_flist->files[next_gen_ndx], NULL));
                }
                next_gen_ndx = read_int(fd);
                if (next_gen_ndx == -1) {
-                       if (incremental)
+                       if (inc_recurse)
                                next_gen_ndx = first_flist->prev->count + first_flist->prev->ndx_start;
                        else
                                next_gen_ndx = cur_flist->count;
@@ -366,13 +365,13 @@ int recv_files(int f_in, char *local_name)
                ndx = read_ndx_and_attrs(f_in, -1, &iflags,
                                         &fnamecmp_type, xname, &xlen);
                if (ndx == NDX_DONE) {
-                       if (incremental && first_flist) {
+                       if (inc_recurse && first_flist) {
                                flist_free(first_flist);
                                if (first_flist)
                                        continue;
                        }
                        if (read_batch && cur_flist) {
-                               int high = incremental
+                               int high = inc_recurse
                                    ? first_flist->prev->count + first_flist->prev->ndx_start
                                    : cur_flist->count;
                                get_next_gen_ndx(batch_gen_fd, next_gen_ndx, high);
@@ -412,6 +411,7 @@ int recv_files(int f_in, char *local_name)
                                append_mode = -append_mode;
                                sparse_files = -sparse_files;
                                csum_length = SUM_LENGTH;
+                               redoing = 1;
                        }
                } else {
                        if (csum_length != SHORT_SUM_LENGTH) {
@@ -420,6 +420,7 @@ int recv_files(int f_in, char *local_name)
                                append_mode = -append_mode;
                                sparse_files = -sparse_files;
                                csum_length = SHORT_SUM_LENGTH;
+                               redoing = 0;
                        }
                }
 
@@ -663,11 +664,11 @@ int recv_files(int f_in, char *local_name)
                cleanup_disable();
 
                if (recv_ok > 0) {
-                       if (remove_source_files || incremental
+                       if (remove_source_files || inc_recurse
                         || (preserve_hard_links && F_IS_HLINKED(file)))
                                send_msg_int(MSG_SUCCESS, ndx);
                } else if (!recv_ok) {
-                       enum logcode msgtype = phase || read_batch ? FERROR : FINFO;
+                       enum logcode msgtype = redoing || read_batch ? FERROR : FINFO;
                        if (msgtype == FERROR || verbose) {
                                char *errstr, *redostr, *keptstr;
                                if (!(keep_partial && partialptr) && !inplace)
@@ -687,10 +688,11 @@ int recv_files(int f_in, char *local_name)
                                        "%s: %s failed verification -- update %s%s.\n",
                                        errstr, fname, keptstr, redostr);
                        }
-                       if (!phase || incremental) {
+                       if (!redoing) {
                                send_msg_int(MSG_REDO, ndx);
                                file->flags |= FLAG_FILE_SENT;
-                       }
+                       } else if (inc_recurse)
+                               send_msg_int(MSG_NO_SEND, ndx);
                }
        }
        if (make_backups < 0)