Fix failing hunks.
[rsync/rsync-patches.git] / g2r-basis-filename.diff
index 15b87d1..0ff296a 100644 (file)
@@ -1,3 +1,5 @@
+Depends-On-Patch: partial-dir.diff
+
 Added a pipe from the generator to the receiver that communicates
 what basis file we used to generate the file data (if it was not
 the default name).  This optimizes away the basis-file search in
@@ -5,108 +7,65 @@ the receiver and makes future options that do more basis-file
 searching more efficient (such as the --fuzzy option and the
 support for multiple --compare-dest options).
 
-Also fixes a potential synchronization problem between the generator
-and the receiver in read-batch mode.  Should consider making the
-sending of the index value the default for this pipe (it's currently
-only sent in batch mode due to the sender not listening to the
-generator to determine what files get updated).
-
 You must run "make proto" before compiling.
 
---- orig/generator.c   2004-07-17 16:30:20
-+++ generator.c        2004-07-17 15:50:09
-@@ -251,11 +251,11 @@ static void generate_and_send_sums(struc
+--- orig/generator.c   2004-07-28 09:58:28
++++ generator.c        2004-07-28 10:14:15
+@@ -259,9 +259,9 @@ static void generate_and_send_sums(int f
   * out.  It might be wrong.
   */
  static void recv_generator(char *fname, struct file_struct *file, int i,
 -                         int f_out)
-+                         int f_out, int f_nameout)
++                         int f_out, int f_out_name)
  {
 -      int fd;
 +      int fd = -1;
        STRUCT_STAT st;
--      struct map_struct *mapbuf;
-+      struct map_struct *mapbuf = NULL;
-       int statret;
+       int statret, stat_errno;
        char *fnamecmp;
-       char fnamecmpbuf[MAXPATHLEN];
-@@ -398,9 +398,6 @@ static void recv_generator(char *fname, 
-       }
- #endif
--      if (read_batch)
--              return;
--
-       if (preserve_hard_links && hard_link_check(file, HL_CHECK_MASTER))
-               return;
-@@ -418,8 +415,10 @@ static void recv_generator(char *fname, 
-               statret = link_stat(fnamecmpbuf, &st, 0);
-               if (!S_ISREG(st.st_mode))
-                       statret = -1;
--              if (statret == -1)
-+              if (statret == -1) {
-                       errno = saveerrno;
-+                      *fnamecmpbuf = '\0';
-+              }
- #if HAVE_LINK
-               else if (link_dest && !dry_run) {
-                       if (do_link(fnamecmpbuf, fname) != 0) {
-@@ -427,22 +426,22 @@ static void recv_generator(char *fname, 
-                                       rsyserr(FINFO, errno, "link %s => %s",
-                                               fnamecmpbuf, fname);
-                               }
--                      }
--                      fnamecmp = fnamecmpbuf;
-+                              fnamecmp = fnamecmpbuf;
-+                      } else
-+                              *fnamecmpbuf = '\0';
-               }
+@@ -437,13 +437,16 @@ static void recv_generator(char *fname, 
+                                                       safe_fname(fname));
+                                       }
+                                       fnamecmp = fnamecmpbuf;
+-                              }
++                              } else
++                                      *fnamecmpbuf = '\0';
+                       } else
  #endif
-               else
-                       fnamecmp = fnamecmpbuf;
+                               fnamecmp = fnamecmpbuf;
+                       statret = 0;
+-              }
 -      }
++              } else
++                      *fnamecmpbuf = '\0';
 +      } else
 +              *fnamecmpbuf = '\0';
  
+       if (statret == 0 && !S_ISREG(st.st_mode)) {
+               if (delete_file(fname) != 0)
+@@ -455,11 +458,9 @@ static void recv_generator(char *fname, 
        if (statret == -1) {
                if (preserve_hard_links && hard_link_check(file, HL_SKIP))
                        return;
--              if (errno == ENOENT) {
+-              if (stat_errno == ENOENT) {
 -                      write_int(f_out,i);
--                      if (!dry_run)
+-                      if (!dry_run && !read_batch)
 -                              write_sum_head(f_out, NULL);
 -              } else if (verbose > 1) {
-+              if (errno == ENOENT)
++              if (stat_errno == ENOENT)
 +                      goto notify_others;
 +              if (verbose > 1) {
-                       rsyserr(FERROR, errno,
-                               "recv_generator: failed to open %s",
+                       rsyserr(FERROR, stat_errno,
+                               "recv_generator: failed to stat %s",
                                full_fname(fname));
-@@ -451,26 +450,23 @@ static void recv_generator(char *fname, 
-       }
-       if (!S_ISREG(st.st_mode)) {
--              if (delete_file(fname) != 0) {
-+              if (delete_file(fname) != 0)
-                       return;
--              }
-               /* now pretend the file didn't exist */
-               if (preserve_hard_links && hard_link_check(file, HL_SKIP))
-                       return;
--              write_int(f_out,i);
--              if (!dry_run)
--                      write_sum_head(f_out, NULL);
--              return;
-+              statret = -1;
-+              goto notify_others;
+@@ -467,13 +468,13 @@ static void recv_generator(char *fname, 
+               return;
        }
  
 -      if (opt_ignore_existing && fnamecmp == fname) {
 +      if (opt_ignore_existing && !*fnamecmpbuf) {
                if (verbose > 1)
-                       rprintf(FINFO,"%s exists\n",fname);
+                       rprintf(FINFO, "%s exists\n", safe_fname(fname));
                return;
        }
  
@@ -114,8 +73,8 @@ You must run "make proto" before compiling.
 +      if (update_only && !*fnamecmpbuf
            && cmp_modtime(st.st_mtime, file->modtime) > 0) {
                if (verbose > 1)
-                       rprintf(FINFO,"%s is newer\n",fname);
-@@ -478,21 +474,17 @@ static void recv_generator(char *fname, 
+                       rprintf(FINFO, "%s is newer\n", safe_fname(fname));
+@@ -481,21 +482,17 @@ static void recv_generator(char *fname, 
        }
  
        if (skip_file(fname, file, &st)) {
@@ -125,7 +84,7 @@ You must run "make proto" before compiling.
                return;
        }
  
--      if (dry_run) {
+-      if (dry_run || read_batch) {
 -              write_int(f_out,i);
 -              return;
 -      }
@@ -141,9 +100,9 @@ You must run "make proto" before compiling.
 +      if (read_batch)
 +              goto notify_others;
  
-       /* open the file */
-       fd = do_open(fnamecmp, O_RDONLY, 0);
-@@ -503,15 +495,12 @@ static void recv_generator(char *fname, 
+       if (partial_dir) {
+               STRUCT_STAT st2;
+@@ -516,9 +513,8 @@ static void recv_generator(char *fname, 
                /* pretend the file didn't exist */
                if (preserve_hard_links && hard_link_check(file, HL_SKIP))
                        return;
@@ -154,25 +113,17 @@ You must run "make proto" before compiling.
 +              goto notify_others;
        }
  
-       if (st.st_size > 0)
-               mapbuf = map_file(fd,st.st_size);
--      else
--              mapbuf = NULL;
        if (verbose > 3) {
-               rprintf(FINFO,"gen mapped %s of size %.0f\n", fnamecmp,
-@@ -521,16 +510,43 @@ static void recv_generator(char *fname, 
+@@ -529,14 +525,41 @@ static void recv_generator(char *fname, 
        if (verbose > 2)
                rprintf(FINFO, "generating and sending sums for %d\n", i);
  
 -      write_int(f_out,i);
--      generate_and_send_sums(mapbuf, st.st_size, f_out);
+-      generate_and_send_sums(fd, st.st_size, f_out);
 +notify_others:
-+      if (f_nameout >= 0) {
++      if (f_out_name >= 0) {
 +              uchar lenbuf[3], *lb = lenbuf;
 +              int len = statret == -1 ? 0 : strlen(fnamecmpbuf);
-+              if (read_batch)
-+                      write_int(f_nameout, i);
 +              if (len > 0x7F) {
 +#if MAXPATHLEN > 0x7FFF
 +                      *lb++ = len / 0x10000 + 0x80;
@@ -182,71 +133,52 @@ You must run "make proto" before compiling.
 +#endif
 +              }
 +              *lb = len;
-+              write_buf(f_nameout, lenbuf, lb - lenbuf + 1);
++              write_buf(f_out_name, lenbuf, lb - lenbuf + 1);
 +              if (len)
-+                      write_buf(f_nameout, fnamecmpbuf, len);
++                      write_buf(f_out_name, fnamecmpbuf, len);
++              io_flush(NORMAL_FLUSH); /* XXX make this more efficient! */
 +      }
--      close(fd);
--      if (mapbuf)
--              unmap_file(mapbuf);
-+      if (read_batch)
-+              return;
 +
 +      write_int(f_out, i);
++
++      if (dry_run || read_batch)
++              return;
+-      close(fd);
 +      if (statret == 0) {
-+              generate_and_send_sums(mapbuf, st.st_size, f_out);
++              generate_and_send_sums(fd, st.st_size, f_out);
 +
 +              close(fd);
-+              if (mapbuf)
-+                      unmap_file(mapbuf);
-+      } else if (!dry_run)
++      } else
 +              write_sum_head(f_out, NULL);
  }
  
  
 -void generate_files(int f_out, struct file_list *flist, char *local_name)
 +void generate_files(int f_out, struct file_list *flist, char *local_name,
-+                  int f_nameout)
++                  int f_out_name)
  {
        int i;
        int phase = 0;
-@@ -571,7 +587,7 @@ void generate_files(int f_out, struct fi
+@@ -577,7 +600,7 @@ void generate_files(int f_out, struct fi
                }
  
                recv_generator(local_name ? local_name : f_name_to(file, fbuf),
 -                             file, i, f_out);
-+                             file, i, f_out, f_nameout);
++                             file, i, f_out, f_out_name);
        }
  
        phase++;
-@@ -582,13 +598,15 @@ void generate_files(int f_out, struct fi
-               rprintf(FINFO,"generate_files phase=%d\n",phase);
-       write_int(f_out, -1);
-+      if (read_batch)
-+              write_int(f_nameout, flist->count);
-       /* files can cycle through the system more than once
-        * to catch initial checksum errors */
+@@ -594,7 +617,7 @@ void generate_files(int f_out, struct fi
        while ((i = get_redo_num()) != -1) {
                struct file_struct *file = flist->files[i];
                recv_generator(local_name ? local_name : f_name_to(file, fbuf),
 -                             file, i, f_out);
-+                             file, i, f_out, f_nameout);
++                             file, i, f_out, f_out_name);
        }
  
        phase++;
-@@ -596,6 +614,8 @@ void generate_files(int f_out, struct fi
-               rprintf(FINFO,"generate_files phase=%d\n",phase);
-       write_int(f_out, -1);
-+      if (read_batch)
-+              write_int(f_nameout, flist->count);
-       if (preserve_hard_links)
-               do_hard_links();
-@@ -607,7 +627,7 @@ void generate_files(int f_out, struct fi
+@@ -613,7 +636,7 @@ void generate_files(int f_out, struct fi
                if (!file->basename || !S_ISDIR(file->mode))
                        continue;
                recv_generator(local_name ? local_name : f_name(file),
@@ -255,9 +187,9 @@ You must run "make proto" before compiling.
        }
  
        if (verbose > 2)
---- orig/main.c        2004-07-19 17:14:44
-+++ main.c     2004-07-17 15:58:11
-@@ -57,6 +57,7 @@ extern int filesfrom_fd;
+--- orig/main.c        2004-07-24 16:52:09
++++ main.c     2004-07-22 00:10:43
+@@ -58,6 +58,7 @@ extern int filesfrom_fd;
  extern pid_t cleanup_child_pid;
  extern char *files_from;
  extern char *remote_filesfrom_file;
@@ -265,23 +197,18 @@ You must run "make proto" before compiling.
  extern char *rsync_path;
  extern char *shell_cmd;
  extern char *batch_name;
-@@ -444,20 +445,21 @@ static int do_recv(int f_in,int f_out,st
+@@ -456,7 +457,8 @@ static int do_recv(int f_in,int f_out,st
  {
        int pid;
        int status = 0;
 -      int error_pipe[2];
 +      int error_pipe[2], name_pipe[2];
-+      int need_name_pipe = compare_dest || read_batch;
++      BOOL need_name_pipe = compare_dest && !dry_run;
  
        if (preserve_hard_links)
                init_hard_links(flist);
-       if (!delete_after) {
-               /* I moved this here from recv_files() to prevent a race condition */
--              if (recurse && delete_mode && !local_name && flist->count>0) {
-+              if (recurse && delete_mode && !local_name && flist->count > 0)
+@@ -467,8 +469,9 @@ static int do_recv(int f_in,int f_out,st
                        delete_files(flist);
--              }
        }
  
 -      if (fd_pair(error_pipe) < 0) {
@@ -292,7 +219,7 @@ You must run "make proto" before compiling.
                exit_cleanup(RERR_SOCKETIO);
        }
  
-@@ -465,6 +467,11 @@ static int do_recv(int f_in,int f_out,st
+@@ -476,6 +479,11 @@ static int do_recv(int f_in,int f_out,st
  
        if ((pid = do_fork()) == 0) {
                close(error_pipe[0]);
@@ -304,7 +231,7 @@ You must run "make proto" before compiling.
                if (f_in != f_out)
                        close(f_out);
  
-@@ -474,7 +481,7 @@ static int do_recv(int f_in,int f_out,st
+@@ -485,7 +493,7 @@ static int do_recv(int f_in,int f_out,st
                /* set place to send errors */
                set_msg_fd_out(error_pipe[1]);
  
@@ -313,7 +240,7 @@ You must run "make proto" before compiling.
                io_flush(FULL_FLUSH);
                report(f_in);
  
-@@ -492,6 +499,11 @@ static int do_recv(int f_in,int f_out,st
+@@ -503,6 +511,11 @@ static int do_recv(int f_in,int f_out,st
                stop_write_batch();
  
        close(error_pipe[1]);
@@ -325,7 +252,7 @@ You must run "make proto" before compiling.
        if (f_in != f_out)
                close(f_in);
  
-@@ -499,7 +511,7 @@ static int do_recv(int f_in,int f_out,st
+@@ -510,7 +523,7 @@ static int do_recv(int f_in,int f_out,st
  
        set_msg_fd_in(error_pipe[0]);
  
@@ -334,17 +261,9 @@ You must run "make proto" before compiling.
  
        get_redo_num(); /* Read final MSG_DONE and any prior messages. */
        report(-1);
---- orig/receiver.c    2004-07-19 17:06:10
-+++ receiver.c 2004-07-19 16:44:39
-@@ -28,6 +28,7 @@ extern int max_delete;
- extern int csum_length;
- extern struct stats stats;
- extern int dry_run;
-+extern int read_batch;
- extern int am_server;
- extern int relative_paths;
- extern int keep_dirlinks;
-@@ -303,6 +304,30 @@ static int receive_data(int f_in,struct 
+--- orig/receiver.c    2004-07-27 23:26:20
++++ receiver.c 2004-07-23 21:59:07
+@@ -325,6 +325,30 @@ static int receive_data(int f_in, char *
  }
  
  
@@ -374,68 +293,79 @@ You must run "make proto" before compiling.
 +
  static void discard_receive_data(int f_in, OFF_T length)
  {
-       receive_data(f_in, NULL, -1, NULL, length);
-@@ -313,8 +338,10 @@ static void discard_receive_data(int f_i
+       receive_data(f_in, NULL, -1, 0, NULL, -1, length);
+@@ -335,7 +359,8 @@ static void discard_receive_data(int f_i
   * main routine for receiver process.
   *
   * Receiver process runs on the same host as the generator process. */
 -int recv_files(int f_in, struct file_list *flist, char *local_name)
 +int recv_files(int f_in, struct file_list *flist, char *local_name,
-+             int f_name_in)
++             int f_in_name)
  {
-+      int next_gen_i = -1;
+       int next_gen_i = -1;
        int fd1,fd2;
-       STRUCT_STAT st;
-       char *fname, fbuf[MAXPATHLEN];
-@@ -341,6 +368,17 @@ int recv_files(int f_in, struct file_lis
+@@ -364,8 +389,15 @@ int recv_files(int f_in, struct file_lis
                i = read_int(f_in);
                if (i == -1) {
-+                      if (read_batch) {
-+                              if (next_gen_i < 0)
-+                                      next_gen_i = read_int(f_name_in);
+                       if (read_batch) {
+-                              if (next_gen_i != flist->count)
+-                                      while (read_int(batch_gen_fd) != -1) {}
 +                              while (next_gen_i < flist->count) {
-+                                      read_gen_name(f_name_in, fnamecmpbuf,
++                                      if (f_in_name >= 0 && next_gen_i >= 0) {
++                                              read_gen_name(f_in_name,
++                                                      fnamecmpbuf, NULL);
++                                      }
++                                      next_gen_i = read_int(batch_gen_fd);
++                                      if (next_gen_i < 0)
++                                              break;
++                              }
+                               next_gen_i = -1;
+                       }
+@@ -413,6 +445,10 @@ int recv_files(int f_in, struct file_lis
+               if (read_batch) {
+                       while (i > next_gen_i) {
++                              if (f_in_name >= 0 && next_gen_i >= 0) {
++                                      read_gen_name(f_in_name, fnamecmpbuf,
 +                                                    NULL);
-+                                      next_gen_i = read_int(f_name_in);
 +                              }
-+                              next_gen_i = -1;
-+                      }
-+
-                       if (phase)
-                               break;
-@@ -383,7 +421,26 @@ int recv_files(int f_in, struct file_lis
-               if (verbose > 2)
-                       rprintf(FINFO,"recv_files(%s)\n",fname);
--              fnamecmp = fname;
-+              if (read_batch) {
-+                      if (next_gen_i < 0)
-+                              next_gen_i = read_int(f_name_in);
-+                      while (i > next_gen_i) {
-+                              read_gen_name(f_name_in, fnamecmpbuf, NULL);
-+                              next_gen_i = read_int(f_name_in);
-+                      }
-+                      if (i < next_gen_i) {
-+                              rprintf(FINFO, "skipping update for \"%s\"\n",
-+                                      fname);
-+                              discard_receive_data(f_in, file->length);
-+                              continue;
-+                      }
+                               next_gen_i = read_int(batch_gen_fd);
+                               if (next_gen_i == -1)
+                                       next_gen_i = flist->count;
+@@ -423,8 +459,14 @@ int recv_files(int f_in, struct file_lis
+                               discard_receive_data(f_in, file->length);
+                               continue;
+                       }
 +                      next_gen_i = -1;
-+              }
-+
-+              if (f_name_in >= 0)
-+                      fnamecmp = read_gen_name(f_name_in, fnamecmpbuf, fname);
+               }
++              if (f_in_name >= 0)
++                      fnamecmp = read_gen_name(f_in_name, fnamecmpbuf, fname);
 +              else
 +                      fnamecmp = fname;
++
                if (server_exclude_list.head
                    && check_exclude(&server_exclude_list, fname,
-@@ -400,14 +457,6 @@ int recv_files(int f_in, struct file_lis
+                                    S_ISDIR(file->mode)) < 0) {
+@@ -437,13 +479,7 @@ int recv_files(int f_in, struct file_lis
+                       continue;
+               }
+-              if (partial_dir) {
+-                      if ((partialptr = partial_dir_fname(fname)) != NULL)
+-                              fnamecmp = partialptr;
+-                      else
+-                              fnamecmp = fname;
+-              } else
+-                      fnamecmp = partialptr = fname;
++              partialptr = partial_dir ? partial_dir_fname(fname) : fname;
                /* open the file */
                fd1 = do_open(fnamecmp, O_RDONLY, 0);
+@@ -453,14 +489,6 @@ int recv_files(int f_in, struct file_lis
+                       fd1 = do_open(fnamecmp, O_RDONLY, 0);
+               }
  
 -              if (fd1 == -1 && compare_dest != NULL) {
 -                      /* try the file at compare_dest instead */