Fixed failing hunks.
[rsync/rsync-patches.git] / fuzzy.diff
index 784854b..9ce20dc 100644 (file)
@@ -4,9 +4,9 @@ Lightly tested.
 
 Be sure to run "make proto" before "make".
 
---- orig/generator.c   2005-01-17 23:11:45
-+++ generator.c        2005-01-18 19:25:55
-@@ -44,6 +44,7 @@ extern int size_only;
+--- orig/generator.c   2005-02-03 02:04:20
++++ generator.c        2005-02-03 02:11:10
+@@ -47,6 +47,7 @@ extern int size_only;
  extern OFF_T max_size;
  extern int io_timeout;
  extern int protocol_version;
@@ -14,22 +14,22 @@ Be sure to run "make proto" before "make".
  extern int always_checksum;
  extern char *partial_dir;
  extern char *basis_dir[];
-@@ -242,6 +243,89 @@ static void generate_and_send_sums(int f
+@@ -227,6 +228,88 @@ static void generate_and_send_sums(int f
+               unmap_file(mapbuf);
  }
  
 +/* Try to find a filename in the same dir as "fname" with a similar name.
 + *
 + * TODO:
-+ *
-+ * 1. We should be using a cache of names for the current dir, not
++ *  - We should be using a cache of names for the current dir, not
 + *    re-reading the destination directory for every file.
-+ * 2. We must not return an rsync tempfile from the current transfer.
-+ * 3. If the highest-rated name is not a normal file, we should fall-
++ *  - We must not return an rsync tempfile from the current transfer.
++ *  - If the highest-rated name is not a normal file, we should fall-
 + *    back to the next highest-rated file.
-+ * 4. We must not return a destination file that is being updated
++ *  - We must not return a destination file that is being updated
 + *    during the current transfer, even if we already processed it
 + *    (since the receiver may not be done with it yet).
++ *  - We must weed out any names that a daemon's config has excluded.
 + */
 +static int find_fuzzy(const char *fname, char *buf, STRUCT_STAT *st_ptr)
 +{
@@ -59,8 +59,7 @@ Be sure to run "make proto" before "make".
 +      if (slash)
 +              *slash = '/';
 +
-+      suf_len = basename_len;
-+      suf = find_filename_suffix(basename, &suf_len);
++      suf = find_filename_suffix(basename, basename_len, &suf_len);
 +
 +      bestname[0] = '\0';
 +      while ((di = readdir(d)) != NULL) {
@@ -72,8 +71,8 @@ Be sure to run "make proto" before "make".
 +                  || (dname[1] == '.' && dname[2] == '\0')))
 +                      continue;
 +
-+              dname_len = dname_suf_len = strlen(dname);
-+              dname_suf = find_filename_suffix(dname, &dname_suf_len);
++              dname_len = strlen(dname);
++              dname_suf = find_filename_suffix(dname, dname_len, &dname_suf_len);
 +
 +              dist = fuzzy_distance(dname, dname_len, basename, basename_len);
 +              /* Add some extra weight to how well the suffixes match. */
@@ -102,9 +101,9 @@ Be sure to run "make proto" before "make".
 +}
 +
  
- /*
-  * Acts on file number @p i from @p flist, whose name is @p fname.
-@@ -496,6 +580,15 @@ static void recv_generator(char *fname, 
+ /* Acts on flist->file's ndx'th item, whose name is fname.  If a directory,
+  * make sure it exists, and has the right permissions/timestamp info.  For
+@@ -477,6 +560,15 @@ static void recv_generator(char *fname, 
        } else
                partialptr = NULL;
  
@@ -120,7 +119,7 @@ Be sure to run "make proto" before "make".
        if (statret == -1) {
                if (preserve_hard_links && hard_link_check(file, HL_SKIP))
                        return;
-@@ -524,6 +617,8 @@ static void recv_generator(char *fname, 
+@@ -505,6 +597,8 @@ static void recv_generator(char *fname, 
  
        if (!compare_dest && fnamecmp_type <= FNAMECMP_BASIS_DIR_HIGH)
                ;
@@ -129,8 +128,8 @@ Be sure to run "make proto" before "make".
        else if (unchanged_file(fnamecmp, file, &st)) {
                if (fnamecmp_type == FNAMECMP_FNAME)
                        set_perms(fname, file, &st, PERMS_REPORT);
-@@ -598,8 +693,24 @@ notify_others:
-       write_int(f_out, i);
+@@ -579,8 +673,24 @@ notify_others:
+       write_int(f_out, ndx);
        if (protocol_version >= 29 && inplace && !read_batch)
                write_byte(f_out, fnamecmp_type);
 -      if (f_out_name >= 0)
@@ -155,7 +154,7 @@ Be sure to run "make proto" before "make".
  
        if (dry_run || read_batch)
                return;
---- orig/main.c        2005-01-17 23:11:45
+--- orig/main.c        2005-01-30 10:07:21
 +++ main.c     2005-01-14 18:33:15
 @@ -48,6 +48,7 @@ extern int keep_dirlinks;
  extern int preserve_hard_links;
@@ -165,7 +164,7 @@ Be sure to run "make proto" before "make".
  extern int relative_paths;
  extern int rsync_port;
  extern int whole_file;
-@@ -464,7 +465,8 @@ static int do_recv(int f_in,int f_out,st
+@@ -491,7 +492,8 @@ static int do_recv(int f_in,int f_out,st
        int pid;
        int status = 0;
        int error_pipe[2], name_pipe[2];
@@ -175,25 +174,25 @@ Be sure to run "make proto" before "make".
  
        /* The receiving side mustn't obey this, or an existing symlink that
         * points to an identical file won't be replaced by the referent. */
---- orig/options.c     2005-01-17 23:11:45
-+++ options.c  2005-01-15 21:08:13
-@@ -86,6 +86,7 @@ int copy_unsafe_links = 0;
+--- orig/options.c     2005-02-01 10:39:22
++++ options.c  2005-01-28 19:31:20
+@@ -90,6 +90,7 @@ int copy_unsafe_links = 0;
  int size_only = 0;
  int daemon_bwlimit = 0;
  int bwlimit = 0;
 +int fuzzy_basis = 0;
  size_t bwlimit_writemax = 0;
- int delete_after = 0;
  int only_existing = 0;
-@@ -288,6 +289,7 @@ void usage(enum logcode F)
+ int opt_ignore_existing = 0;
+@@ -303,6 +304,7 @@ void usage(enum logcode F)
    rprintf(F,"     --compare-dest=DIR      also compare destination files relative to DIR\n");
    rprintf(F,"     --copy-dest=DIR         ... and include copies of unchanged files\n");
    rprintf(F,"     --link-dest=DIR         hardlink to files in DIR when unchanged\n");
 +  rprintf(F,"     --fuzzy                 find similar file for basis when no dest file\n");
-   rprintf(F," -P                          equivalent to --partial --progress\n");
    rprintf(F," -z, --compress              compress file data\n");
-   rprintf(F," -C, --cvs-exclude           auto ignore files in the same way CVS does\n");
-@@ -384,6 +386,7 @@ static struct poptOption long_options[] 
+   rprintf(F," -C, --cvs-exclude           auto-ignore files the same way CVS does\n");
+   rprintf(F," -f, --filter=RULE           add a file-filtering RULE\n");
+@@ -408,6 +410,7 @@ static struct poptOption long_options[] 
    {"compare-dest",     0,  POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
    {"copy-dest",        0,  POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
    {"link-dest",        0,  POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
@@ -201,9 +200,9 @@ Be sure to run "make proto" before "make".
    /* TODO: Should this take an optional int giving the compression level? */
    {"compress",        'z', POPT_ARG_NONE,   &do_compression, 0, 0, 0 },
    {"stats",            0,  POPT_ARG_NONE,   &do_stats, 0, 0, 0 },
-@@ -1234,6 +1237,9 @@ void server_options(char **args,int *arg
-                       args[ac++] = "--no-relative";
-       }
+@@ -1321,6 +1324,9 @@ void server_options(char **args,int *arg
+       if (!implied_dirs && !am_sender)
+               args[ac++] = "--no-implied-dirs";
  
 +      if (fuzzy_basis && am_sender)
 +              args[ac++] = "--fuzzy";
@@ -211,9 +210,9 @@ Be sure to run "make proto" before "make".
        *argc = ac;
        return;
  
---- orig/receiver.c    2005-01-17 23:11:45
+--- orig/receiver.c    2005-02-03 02:04:20
 +++ receiver.c 2005-01-15 21:21:02
-@@ -324,6 +324,27 @@ static int receive_data(int f_in, char *
+@@ -256,6 +256,27 @@ static int receive_data(int f_in, char *
  }
  
  
@@ -241,7 +240,7 @@ Be sure to run "make proto" before "make".
  static void discard_receive_data(int f_in, OFF_T length)
  {
        receive_data(f_in, NULL, -1, 0, NULL, -1, length);
-@@ -454,6 +475,10 @@ int recv_files(int f_in, struct file_lis
+@@ -395,6 +416,10 @@ int recv_files(int f_in, struct file_lis
                        case FNAMECMP_BACKUP:
                                fnamecmp = get_backup_name(fname);
                                break;
@@ -252,28 +251,28 @@ Be sure to run "make proto" before "make".
                        default:
                                if (j >= basis_dir_cnt) {
                                        rprintf(FERROR,
---- orig/rsync.h       2005-01-17 23:11:45
-+++ rsync.h    2005-01-15 21:24:09
-@@ -128,6 +128,7 @@
+--- orig/rsync.h       2005-02-03 02:04:20
++++ rsync.h    2005-01-19 18:36:47
+@@ -131,6 +131,7 @@
  #define FNAMECMP_FNAME                0x80
  #define FNAMECMP_PARTIAL_DIR  0x81
  #define FNAMECMP_BACKUP       0x82
 +#define FNAMECMP_FUZZY                0x83
  
- /* Log-message categories.  FLOG is only used on the daemon side to
---- orig/rsync.yo      2005-01-17 23:11:46
-+++ rsync.yo   2005-01-15 21:48:52
-@@ -358,6 +358,7 @@ verb(
+ /* For calling delete_file() */
+ #define DEL_DIR               (1<<0)
+--- orig/rsync.yo      2005-02-01 10:39:23
++++ rsync.yo   2005-01-28 19:31:36
+@@ -354,6 +354,7 @@ to the detailed description below for a 
       --compare-dest=DIR      also compare received files relative to DIR
       --copy-dest=DIR         ... and include copies of unchanged files
       --link-dest=DIR         hardlink to files in DIR when unchanged
 +     --fuzzy                 find similar file for basis when no dest
-  -P                          equivalent to --partial --progress
   -z, --compress              compress file data
-  -C, --cvs-exclude           auto ignore files in the same way CVS does
-@@ -878,6 +879,14 @@ Note that rsync versions prior to 2.6.1 
- (or implied by -a).  You can work-around this bug by avoiding the -o option
+  -C, --cvs-exclude           auto-ignore files in the same way CVS does
+  -f, --filter=RULE           add a file-filtering RULE
+@@ -937,6 +938,14 @@ bf(--link-dest) from working properly fo
+ (or implied by bf(-a)).  You can work-around this bug by avoiding the bf(-o) option
  when sending to an old rsync.
  
 +dit(bf(--fuzzy)) This option tells rsync that it should look around for a
@@ -287,9 +286,9 @@ Be sure to run "make proto" before "make".
  dit(bf(-z, --compress)) With this option, rsync compresses any data from
  the files that it sends to the destination machine.  This
  option is useful on slow connections.  The compression method used is the
---- orig/util.c        2004-09-07 21:45:30
-+++ util.c     2005-01-18 19:25:47
-@@ -1217,3 +1217,108 @@ void *_realloc_array(void *ptr, unsigned
+--- orig/util.c        2005-01-28 19:08:20
++++ util.c     2005-01-19 17:30:51
+@@ -1213,3 +1213,108 @@ void *_realloc_array(void *ptr, unsigned
                return malloc(size * num);
        return realloc(ptr, size * num);
  }
@@ -297,11 +296,11 @@ Be sure to run "make proto" before "make".
 +/* Take a filename and filename length and return the most significant
 + * filename suffix we can find.  This ignores suffixes such as "~",
 + * ".bak", ".orig", ".~1~", etc. */
-+const char *find_filename_suffix(const char *fn, int *len_ptr)
++const char *find_filename_suffix(const char *fn, int fn_len, int *len_ptr)
 +{
 +      const char *suf, *s;
-+      int s_len, fn_len = *len_ptr;
 +      BOOL had_tilde;
++      int s_len;
 +
 +      /* One or more dots at the start aren't a suffix. */
 +      while (fn_len && *fn == '.') fn++, fn_len--;