Use "use warnings" rather than -w on the #! line.
[rsync/rsync-patches.git] / detect-renamed.diff
index 4f927d9..b40b8fa 100644 (file)
@@ -32,8 +32,9 @@ TODO:
   a file that can't use it, while missing out on giving it to a file
   that could use it.
 
   a file that can't use it, while missing out on giving it to a file
   that could use it.
 
---- old/compat.c
-+++ new/compat.c
+diff --git a/compat.c b/compat.c
+--- a/compat.c
++++ b/compat.c
 @@ -41,6 +41,7 @@ extern int checksum_seed;
  extern int basis_dir_cnt;
  extern int prune_empty_dirs;
 @@ -41,6 +41,7 @@ extern int checksum_seed;
  extern int basis_dir_cnt;
  extern int prune_empty_dirs;
@@ -42,7 +43,7 @@ TODO:
  extern int protect_args;
  extern int preserve_uid;
  extern int preserve_gid;
  extern int protect_args;
  extern int preserve_uid;
  extern int preserve_gid;
-@@ -108,6 +109,7 @@ void set_allow_inc_recurse(void)
+@@ -120,6 +121,7 @@ void set_allow_inc_recurse(void)
                allow_inc_recurse = 0;
        else if (!am_sender
         && (delete_before || delete_after
                allow_inc_recurse = 0;
        else if (!am_sender
         && (delete_before || delete_after
@@ -50,17 +51,18 @@ TODO:
          || delay_updates || prune_empty_dirs))
                allow_inc_recurse = 0;
        else if (am_server && !local_server
          || delay_updates || prune_empty_dirs))
                allow_inc_recurse = 0;
        else if (am_server && !local_server
---- old/flist.c
-+++ new/flist.c
-@@ -61,6 +61,7 @@ extern int non_perishable_cnt;
+diff --git a/flist.c b/flist.c
+--- a/flist.c
++++ b/flist.c
+@@ -63,6 +63,7 @@ extern int non_perishable_cnt;
  extern int prune_empty_dirs;
  extern int copy_links;
  extern int copy_unsafe_links;
 +extern int detect_renamed;
  extern int protocol_version;
  extern int sanitize_paths;
  extern int prune_empty_dirs;
  extern int copy_links;
  extern int copy_unsafe_links;
 +extern int detect_renamed;
  extern int protocol_version;
  extern int sanitize_paths;
- extern struct stats stats;
-@@ -113,6 +114,8 @@ static int64 tmp_dev, tmp_ino;
+ extern int munge_symlinks;
+@@ -121,6 +122,8 @@ static int64 tmp_dev, tmp_ino;
  #endif
  static char tmp_sum[MAX_DIGEST_LEN];
  
  #endif
  static char tmp_sum[MAX_DIGEST_LEN];
  
@@ -69,7 +71,7 @@ TODO:
  static char empty_sum[MAX_DIGEST_LEN];
  static int flist_count_offset; /* for --delete --progress */
  static int dir_count = 0;
  static char empty_sum[MAX_DIGEST_LEN];
  static int flist_count_offset; /* for --delete --progress */
  static int dir_count = 0;
-@@ -252,6 +255,45 @@ static int is_excluded(char *fname, int 
+@@ -288,6 +291,45 @@ static int is_excluded(const char *fname, int is_dir, int filter_level)
        return 0;
  }
  
        return 0;
  }
  
@@ -115,9 +117,9 @@ TODO:
  static void send_directory(int f, struct file_list *flist,
                           char *fbuf, int len, int flags);
  
  static void send_directory(int f, struct file_list *flist,
                           char *fbuf, int len, int flags);
  
-@@ -2154,6 +2196,25 @@ struct file_list *recv_file_list(int f)
+@@ -2344,6 +2386,25 @@ struct file_list *recv_file_list(int f)
  
  
-       clean_flist(flist, relative_paths);
+       flist_sort_and_clean(flist, relative_paths);
  
 +      if (detect_renamed) {
 +              int j = flist->used;
  
 +      if (detect_renamed) {
 +              int j = flist->used;
@@ -141,9 +143,10 @@ TODO:
        if (protocol_version < 30) {
                /* Recv the io_error flag */
                if (ignore_errors)
        if (protocol_version < 30) {
                /* Recv the io_error flag */
                if (ignore_errors)
---- old/generator.c
-+++ new/generator.c
-@@ -79,6 +79,7 @@ extern char *basis_dir[];
+diff --git a/generator.c b/generator.c
+--- a/generator.c
++++ b/generator.c
+@@ -80,6 +80,7 @@ extern char *basis_dir[];
  extern int compare_dest;
  extern int copy_dest;
  extern int link_dest;
  extern int compare_dest;
  extern int copy_dest;
  extern int link_dest;
@@ -151,14 +154,14 @@ TODO:
  extern int whole_file;
  extern int list_only;
  extern int read_batch;
  extern int whole_file;
  extern int list_only;
  extern int read_batch;
-@@ -95,6 +96,7 @@ extern char *backup_suffix;
+@@ -98,6 +99,7 @@ extern char *backup_suffix;
  extern int backup_suffix_len;
  extern struct file_list *cur_flist, *first_flist, *dir_flist;
  extern int backup_suffix_len;
  extern struct file_list *cur_flist, *first_flist, *dir_flist;
- extern struct filter_list_struct server_filter_list;
+ extern struct filter_list_struct daemon_filter_list;
 +extern struct file_list the_fattr_list;
 +extern struct file_list the_fattr_list;
- #ifdef ICONV_OPTION
extern int ic_ndx;
- #endif
int ignore_perishable = 0;
+ int non_perishable_cnt = 0;
 @@ -105,6 +107,7 @@ int maybe_ATTRS_REPORT = 0;
  
  static dev_t dev_zero;
 @@ -105,6 +107,7 @@ int maybe_ATTRS_REPORT = 0;
  
  static dev_t dev_zero;
@@ -167,17 +170,24 @@ TODO:
  static int deldelay_size = 0, deldelay_cnt = 0;
  static char *deldelay_buf = NULL;
  static int deldelay_fd = -1;
  static int deldelay_size = 0, deldelay_cnt = 0;
  static char *deldelay_buf = NULL;
  static int deldelay_fd = -1;
-@@ -114,7 +117,8 @@ static int need_retouch_dir_times;
+@@ -115,7 +118,7 @@ static int need_retouch_dir_times;
  static int need_retouch_dir_perms;
  static const char *solo_file = NULL;
  
 -/* For calling delete_item() and delete_dir_contents(). */
 +/* For calling delete_item(), delete_dir_contents(), and delete_in_dir(). */
  static int need_retouch_dir_perms;
  static const char *solo_file = NULL;
  
 -/* For calling delete_item() and delete_dir_contents(). */
 +/* For calling delete_item(), delete_dir_contents(), and delete_in_dir(). */
-+#define DEL_NO_DELETIONS      (1<<0)
- #define DEL_RECURSE           (1<<1) /* recurse */
+ #define DEL_NO_UID_WRITE      (1<<0) /* file/dir has our uid w/o write perm */
+ #define DEL_RECURSE           (1<<1) /* if dir, delete all contents */
  #define DEL_DIR_IS_EMPTY      (1<<2) /* internal delete_FUNCTIONS use only */
  #define DEL_DIR_IS_EMPTY      (1<<2) /* internal delete_FUNCTIONS use only */
+@@ -124,6 +127,7 @@ static const char *solo_file = NULL;
+ #define DEL_FOR_SYMLINK       (1<<5) /* making room for a replacement symlink */
+ #define DEL_FOR_DEVICE                (1<<6) /* making room for a replacement device */
+ #define DEL_FOR_SPECIAL       (1<<7) /* making room for a replacement special */
++#define DEL_NO_DELETIONS      (1<<9) /* just check for renames w/o deleting */
  
  
-@@ -136,11 +140,121 @@ static int is_backup_file(char *fn)
+ #define DEL_MAKE_ROOM (DEL_FOR_FILE|DEL_FOR_DIR|DEL_FOR_SYMLINK|DEL_FOR_DEVICE|DEL_FOR_SPECIAL)
+@@ -148,11 +152,121 @@ static int is_backup_file(char *fn)
        return k > 0 && strcmp(fn+k, backup_suffix) == 0;
  }
  
        return k > 0 && strcmp(fn+k, backup_suffix) == 0;
  }
  
@@ -297,27 +307,27 @@ TODO:
 + *
 + * Also note: --detect-rename may use this routine with DEL_NO_DELETIONS set!
   */
 + *
 + * Also note: --detect-rename may use this routine with DEL_NO_DELETIONS set!
   */
- static enum delret delete_item(char *fbuf, int mode, char *replace, int flags)
+ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
  {
  {
-@@ -162,6 +276,8 @@ static enum delret delete_item(char *fbu
+@@ -186,6 +300,8 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
                        goto check_ret;
                /* OK: try to delete the directory. */
        }
 +      if (flags & DEL_NO_DELETIONS)
 +              return DR_SUCCESS;
  
                        goto check_ret;
                /* OK: try to delete the directory. */
        }
 +      if (flags & DEL_NO_DELETIONS)
 +              return DR_SUCCESS;
  
-       if (!replace && max_delete >= 0 && ++deletion_count > max_delete)
+       if (!(flags & DEL_MAKE_ROOM) && max_delete >= 0 && ++deletion_count > max_delete)
                return DR_AT_LIMIT;
                return DR_AT_LIMIT;
-@@ -208,6 +324,8 @@ static enum delret delete_item(char *fbu
+@@ -241,6 +357,8 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
   * its contents, otherwise just checks for content.  Returns DR_SUCCESS or
   * DR_NOT_EMPTY.  Note that fname must point to a MAXPATHLEN buffer!  (The
   * buffer is used for recursion, but returned unchanged.)
 + *
 + * Note: --detect-rename may use this routine with DEL_NO_DELETIONS set!
   */
   * its contents, otherwise just checks for content.  Returns DR_SUCCESS or
   * DR_NOT_EMPTY.  Note that fname must point to a MAXPATHLEN buffer!  (The
   * buffer is used for recursion, but returned unchanged.)
 + *
 + * Note: --detect-rename may use this routine with DEL_NO_DELETIONS set!
   */
- static enum delret delete_dir_contents(char *fname, int flags)
+ static enum delret delete_dir_contents(char *fname, uint16 flags)
  {
  {
-@@ -227,7 +345,9 @@ static enum delret delete_dir_contents(c
+@@ -260,7 +378,9 @@ static enum delret delete_dir_contents(char *fname, uint16 flags)
        save_filters = push_local_filters(fname, dlen);
  
        non_perishable_cnt = 0;
        save_filters = push_local_filters(fname, dlen);
  
        non_perishable_cnt = 0;
@@ -327,16 +337,17 @@ TODO:
        ret = non_perishable_cnt ? DR_NOT_EMPTY : DR_SUCCESS;
  
        if (!dirlist->used)
        ret = non_perishable_cnt ? DR_NOT_EMPTY : DR_SUCCESS;
  
        if (!dirlist->used)
-@@ -264,6 +384,8 @@ static enum delret delete_dir_contents(c
-               if (S_ISDIR(fp->mode)
-                && delete_dir_contents(fname, flags | DEL_RECURSE) != DR_SUCCESS)
-                       ret = DR_NOT_EMPTY;
-+              if (detect_renamed && S_ISREG(fp->mode))
+@@ -300,7 +420,8 @@ static enum delret delete_dir_contents(char *fname, uint16 flags)
+               if (S_ISDIR(fp->mode)) {
+                       if (delete_dir_contents(fname, flags | DEL_RECURSE) != DR_SUCCESS)
+                               ret = DR_NOT_EMPTY;
+-              }
++              } else if (detect_renamed && S_ISREG(fp->mode))
 +                      look_for_rename(fp, fname);
 +                      look_for_rename(fp, fname);
-               if (delete_item(fname, fp->mode, NULL, flags) != DR_SUCCESS)
+               if (delete_item(fname, fp->mode, flags) != DR_SUCCESS)
                        ret = DR_NOT_EMPTY;
        }
                        ret = DR_NOT_EMPTY;
        }
-@@ -416,13 +538,18 @@ static void do_delayed_deletions(char *d
+@@ -465,13 +586,18 @@ static void do_delayed_deletions(char *delbuf)
   * all the --delete-WHEN options.  Note that the fbuf pointer must point to a
   * MAXPATHLEN buffer with the name of the directory in it (the functions we
   * call will append names onto the end, but the old dir value will be restored
   * all the --delete-WHEN options.  Note that the fbuf pointer must point to a
   * MAXPATHLEN buffer with the name of the directory in it (the functions we
   * call will append names onto the end, but the old dir value will be restored
@@ -347,7 +358,7 @@ TODO:
 + * Note:  --detect-rename may use this routine with DEL_NO_DELETIONS set!
 + */
 +static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev,
 + * Note:  --detect-rename may use this routine with DEL_NO_DELETIONS set!
 + */
 +static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev,
-+                        int flags)
++                        int del_flags)
  {
        static int already_warned = 0;
        struct file_list *dirlist;
  {
        static int already_warned = 0;
        struct file_list *dirlist;
@@ -356,16 +367,10 @@ TODO:
 +      char *p, delbuf[MAXPATHLEN];
 +      unsigned remainder;
 +      int dlen, i, restore_dot = 0;
 +      char *p, delbuf[MAXPATHLEN];
 +      unsigned remainder;
 +      int dlen, i, restore_dot = 0;
+       int save_uid_ndx = uid_ndx;
  
        if (!fbuf) {
  
        if (!fbuf) {
-               change_local_filter_dir(NULL, 0, 0);
-@@ -432,21 +559,28 @@ static void delete_in_dir(char *fbuf, st
-       if (verbose > 2)
-               rprintf(FINFO, "delete_in_dir(%s)\n", fbuf);
-+      flags |= DEL_RECURSE;
-+
-       if (allowed_lull)
+@@ -486,17 +612,22 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
                maybe_send_keepalive();
  
        if (io_error && !ignore_errors) {
                maybe_send_keepalive();
  
        if (io_error && !ignore_errors) {
@@ -381,7 +386,7 @@ TODO:
 -                      "IO error encountered -- skipping file deletion\n");
 -              already_warned = 1;
 -              return;
 -                      "IO error encountered -- skipping file deletion\n");
 -              already_warned = 1;
 -              return;
-+              flags |= DEL_NO_DELETIONS;
++              del_flags |= DEL_NO_DELETIONS;
        }
  
        dlen = strlen(fbuf);
        }
  
        dlen = strlen(fbuf);
@@ -393,7 +398,7 @@ TODO:
        if (one_file_system) {
                if (file->flags & FLAG_TOP_DIR)
                        filesystem_dev = *fs_dev;
        if (one_file_system) {
                if (file->flags & FLAG_TOP_DIR)
                        filesystem_dev = *fs_dev;
-@@ -456,6 +590,14 @@ static void delete_in_dir(char *fbuf, st
+@@ -509,6 +640,14 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
  
        dirlist = get_dirlist(fbuf, dlen, 0);
  
  
        dirlist = get_dirlist(fbuf, dlen, 0);
  
@@ -408,7 +413,7 @@ TODO:
        /* If an item in dirlist is not found in flist, delete it
         * from the filesystem. */
        for (i = dirlist->used; i--; ) {
        /* If an item in dirlist is not found in flist, delete it
         * from the filesystem. */
        for (i = dirlist->used; i--; ) {
-@@ -468,16 +610,25 @@ static void delete_in_dir(char *fbuf, st
+@@ -521,6 +660,10 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
                                        f_name(fp, NULL));
                        continue;
                }
                                        f_name(fp, NULL));
                        continue;
                }
@@ -416,16 +421,22 @@ TODO:
 +                      strlcpy(p, fp->basename, remainder);
 +                      look_for_rename(fp, fbuf);
 +              }
 +                      strlcpy(p, fp->basename, remainder);
 +                      look_for_rename(fp, fbuf);
 +              }
-               if (flist_find(cur_flist, fp) < 0) {
+               /* Here we want to match regardless of file type.  Replacement
+                * of a file with one of another type is handled separately by
+                * a delete_item call with a DEL_MAKE_ROOM flag. */
+@@ -529,14 +672,19 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
+                       if (!(fp->mode & S_IWUSR) && !am_root && (uid_t)F_OWNER(fp) == our_uid)
+                               flags |= DEL_NO_UID_WRITE;
                        f_name(fp, delbuf);
 -                      if (delete_during == 2) {
                        f_name(fp, delbuf);
 -                      if (delete_during == 2) {
-+                      if (delete_during == 2 && !(flags & DEL_NO_DELETIONS)) {
-                               if (!remember_delete(fp, delbuf))
+-                              if (!remember_delete(fp, delbuf, flags))
++                      if (delete_during == 2 && !(del_flags & DEL_NO_DELETIONS)) {
++                              if (!remember_delete(fp, delbuf, del_flags | flags))
                                        break;
                        } else
                                        break;
                        } else
--                              delete_item(delbuf, fp->mode, NULL, DEL_RECURSE);
+-                              delete_item(delbuf, fp->mode, flags);
 -              }
 -              }
-+                              delete_item(delbuf, fp->mode, NULL, flags);
++                              delete_item(delbuf, fp->mode, del_flags | flags);
 +              } else if (detect_renamed && S_ISDIR(fp->mode))
 +                      unexplored_dirs++;
        }
 +              } else if (detect_renamed && S_ISDIR(fp->mode))
 +                      unexplored_dirs++;
        }
@@ -435,9 +446,9 @@ TODO:
 +      fbuf[dlen] = '\0';
 +
        flist_free(dirlist);
 +      fbuf[dlen] = '\0';
 +
        flist_free(dirlist);
- }
  
  
-@@ -507,9 +658,9 @@ static void do_delete_pass(void)
+       if (!save_uid_ndx) {
+@@ -574,9 +722,9 @@ static void do_delete_pass(void)
                 || !S_ISDIR(st.st_mode))
                        continue;
  
                 || !S_ISDIR(st.st_mode))
                        continue;
  
@@ -449,7 +460,7 @@ TODO:
  
        if (do_progress && !am_server)
                rprintf(FINFO, "                    \r");
  
        if (do_progress && !am_server)
                rprintf(FINFO, "                    \r");
-@@ -1106,6 +1257,7 @@ static void list_file_entry(struct file_
+@@ -1229,6 +1377,7 @@ static void list_file_entry(struct file_struct *f)
        }
  }
  
        }
  }
  
@@ -457,22 +468,23 @@ TODO:
  static int phase = 0;
  static int dflt_perms;
  
  static int phase = 0;
  static int dflt_perms;
  
-@@ -1350,8 +1502,12 @@ static void recv_generator(char *fname, 
-                       }
+@@ -1505,9 +1654,12 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+               }
+               else if (delete_during && f_out != -1 && !phase
+                   && !(file->flags & FLAG_MISSING_DIR)) {
+-                      if (file->flags & FLAG_CONTENT_DIR)
+-                              delete_in_dir(fname, file, &real_sx.st.st_dev);
+-                      else
++                      if (file->flags & FLAG_CONTENT_DIR) {
++                              if (detect_renamed && real_ret != 0)
++                                      unexplored_dirs++;
++                              delete_in_dir(fname, file, &real_sx.st.st_dev,
++                                            delete_during < 0 ? DEL_NO_DELETIONS : 0);
++                      } else
+                               change_local_filter_dir(fname, strlen(fname), F_DEPTH(file));
                }
                }
-               else if (delete_during && f_out != -1 && !phase && dry_run < 2
--                  && (file->flags & FLAG_CONTENT_DIR))
--                      delete_in_dir(fname, file, &real_sx.st.st_dev);
-+                  && (file->flags & FLAG_CONTENT_DIR)) {
-+                      if (detect_renamed && real_ret != 0)
-+                              unexplored_dirs++;
-+                      delete_in_dir(fname, file, &real_sx.st.st_dev,
-+                                    delete_during < 0 ? DEL_NO_DELETIONS : 0);
-+              }
                goto cleanup;
                goto cleanup;
-       }
-@@ -1629,8 +1785,14 @@ static void recv_generator(char *fname, 
+@@ -1785,8 +1937,14 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                        goto cleanup;
                }
  #endif
                        goto cleanup;
                }
  #endif
@@ -485,10 +497,10 @@ TODO:
 +                      }
                        goto notify_others;
 +              }
 +                      }
                        goto notify_others;
 +              }
-               rsyserr(FERROR, stat_errno, "recv_generator: failed to stat %s",
+               rsyserr(FERROR_XFER, stat_errno, "recv_generator: failed to stat %s",
                        full_fname(fname));
                goto cleanup;
                        full_fname(fname));
                goto cleanup;
-@@ -1966,6 +2128,12 @@ void generate_files(int f_out, const cha
+@@ -2187,6 +2345,12 @@ void generate_files(int f_out, const char *local_name)
        if (verbose > 2)
                rprintf(FINFO, "generator starting pid=%ld\n", (long)getpid());
  
        if (verbose > 2)
                rprintf(FINFO, "generator starting pid=%ld\n", (long)getpid());
  
@@ -501,7 +513,7 @@ TODO:
        if (delete_before && !solo_file && cur_flist->used > 0)
                do_delete_pass();
        if (delete_during == 2) {
        if (delete_before && !solo_file && cur_flist->used > 0)
                do_delete_pass();
        if (delete_during == 2) {
-@@ -1976,7 +2144,7 @@ void generate_files(int f_out, const cha
+@@ -2197,7 +2361,7 @@ void generate_files(int f_out, const char *local_name)
        }
        do_progress = 0;
  
        }
        do_progress = 0;
  
@@ -510,17 +522,17 @@ TODO:
                whole_file = 0;
        if (verbose >= 2) {
                rprintf(FINFO, "delta-transmission %s\n",
                whole_file = 0;
        if (verbose >= 2) {
                rprintf(FINFO, "delta-transmission %s\n",
-@@ -2014,7 +2182,7 @@ void generate_files(int f_out, const cha
+@@ -2239,7 +2403,7 @@ void generate_files(int f_out, const char *local_name)
                                                dirdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
                                        } else
                                                dirdev = MAKEDEV(0, 0);
                                                dirdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
                                        } else
                                                dirdev = MAKEDEV(0, 0);
--                                      delete_in_dir(f_name(fp, fbuf), fp, &dirdev);
-+                                      delete_in_dir(f_name(fp, fbuf), fp, &dirdev, 0);
-                               }
+-                                      delete_in_dir(fbuf, fp, &dirdev);
++                                      delete_in_dir(fbuf, fp, &dirdev, 0);
+                               } else
+                                       change_local_filter_dir(fbuf, strlen(fbuf), F_DEPTH(fp));
                        }
                        }
-               }
-@@ -2059,7 +2227,21 @@ void generate_files(int f_out, const cha
-       } while ((cur_flist = cur_flist->next) != NULL);
+@@ -2289,7 +2453,21 @@ void generate_files(int f_out, const char *local_name)
+               write_ndx(f_out, NDX_DONE);
  
        if (delete_during)
 -              delete_in_dir(NULL, NULL, &dev_zero);
  
        if (delete_during)
 -              delete_in_dir(NULL, NULL, &dev_zero);
@@ -542,9 +554,10 @@ TODO:
        phase++;
        if (verbose > 2)
                rprintf(FINFO, "generate_files phase=%d\n", phase);
        phase++;
        if (verbose > 2)
                rprintf(FINFO, "generate_files phase=%d\n", phase);
---- old/options.c
-+++ new/options.c
-@@ -80,6 +80,7 @@ int am_generator = 0;
+diff --git a/options.c b/options.c
+--- a/options.c
++++ b/options.c
+@@ -82,6 +82,7 @@ int am_generator = 0;
  int am_starting_up = 1;
  int relative_paths = -1;
  int implied_dirs = 1;
  int am_starting_up = 1;
  int relative_paths = -1;
  int implied_dirs = 1;
@@ -552,7 +565,7 @@ TODO:
  int numeric_ids = 0;
  int allow_8bit_chars = 0;
  int force_delete = 0;
  int numeric_ids = 0;
  int allow_8bit_chars = 0;
  int force_delete = 0;
-@@ -383,6 +384,7 @@ void usage(enum logcode F)
+@@ -392,6 +393,7 @@ void usage(enum logcode F)
    rprintf(F,"     --modify-window=NUM     compare mod-times with reduced accuracy\n");
    rprintf(F," -T, --temp-dir=DIR          create temporary files in directory DIR\n");
    rprintf(F," -y, --fuzzy                 find similar file for basis if no dest file\n");
    rprintf(F,"     --modify-window=NUM     compare mod-times with reduced accuracy\n");
    rprintf(F," -T, --temp-dir=DIR          create temporary files in directory DIR\n");
    rprintf(F," -y, --fuzzy                 find similar file for basis if no dest file\n");
@@ -560,15 +573,15 @@ TODO:
    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,"     --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");
-@@ -561,6 +563,7 @@ static struct poptOption long_options[] 
+@@ -579,6 +581,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 },
 +  {"detect-renamed",   0,  POPT_ARG_NONE,   &detect_renamed, 0, 0, 0 },
    {"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 },
 +  {"detect-renamed",   0,  POPT_ARG_NONE,   &detect_renamed, 0, 0, 0 },
-   {"fuzzy",           'y', POPT_ARG_NONE,   &fuzzy_basis, 0, 0, 0 },
-   {"compress",        'z', POPT_ARG_NONE,   0, 'z', 0, 0 },
-   {"no-compress",      0,  POPT_ARG_VAL,    &do_compression, 0, 0, 0 },
-@@ -1532,7 +1535,7 @@ int parse_arguments(int *argc_p, const c
+   {"fuzzy",           'y', POPT_ARG_VAL,    &fuzzy_basis, 1, 0, 0 },
+   {"no-fuzzy",         0,  POPT_ARG_VAL,    &fuzzy_basis, 0, 0, 0 },
+   {"no-y",             0,  POPT_ARG_VAL,    &fuzzy_basis, 0, 0, 0 },
+@@ -1591,7 +1594,7 @@ int parse_arguments(int *argc_p, const char ***argv_p)
                inplace = 1;
        }
  
                inplace = 1;
        }
  
@@ -577,7 +590,7 @@ TODO:
                partial_dir = tmp_partialdir;
  
        if (inplace) {
                partial_dir = tmp_partialdir;
  
        if (inplace) {
-@@ -1541,6 +1544,7 @@ int parse_arguments(int *argc_p, const c
+@@ -1600,6 +1603,7 @@ int parse_arguments(int *argc_p, const char ***argv_p)
                        snprintf(err_buf, sizeof err_buf,
                                 "--%s cannot be used with --%s\n",
                                 append_mode ? "append" : "inplace",
                        snprintf(err_buf, sizeof err_buf,
                                 "--%s cannot be used with --%s\n",
                                 append_mode ? "append" : "inplace",
@@ -585,7 +598,7 @@ TODO:
                                 delay_updates ? "delay-updates" : "partial-dir");
                        return 0;
                }
                                 delay_updates ? "delay-updates" : "partial-dir");
                        return 0;
                }
-@@ -1885,6 +1889,8 @@ void server_options(char **args, int *ar
+@@ -1961,6 +1965,8 @@ void server_options(char **args, int *argc_p)
                        args[ac++] = "--super";
                if (size_only)
                        args[ac++] = "--size-only";
                        args[ac++] = "--super";
                if (size_only)
                        args[ac++] = "--size-only";
@@ -594,9 +607,10 @@ TODO:
        } else {
                if (skip_compress) {
                        if (asprintf(&arg, "--skip-compress=%s", skip_compress) < 0)
        } else {
                if (skip_compress) {
                        if (asprintf(&arg, "--skip-compress=%s", skip_compress) < 0)
---- old/rsync.yo
-+++ new/rsync.yo
-@@ -384,6 +384,7 @@ to the detailed description below for a 
+diff --git a/rsync.yo b/rsync.yo
+--- a/rsync.yo
++++ b/rsync.yo
+@@ -389,6 +389,7 @@ to the detailed description below for a complete description.  verb(
       --modify-window=NUM     compare mod-times with reduced accuracy
   -T, --temp-dir=DIR          create temporary files in directory DIR
   -y, --fuzzy                 find similar file for basis if no dest file
       --modify-window=NUM     compare mod-times with reduced accuracy
   -T, --temp-dir=DIR          create temporary files in directory DIR
   -y, --fuzzy                 find similar file for basis if no dest file
@@ -604,7 +618,7 @@ TODO:
       --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
       --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
-@@ -1430,6 +1431,21 @@ Note that the use of the bf(--delete) op
+@@ -1491,6 +1492,21 @@ Note that the use of the bf(--delete) option might get rid of any potential
  fuzzy-match files, so either use bf(--delete-after) or specify some
  filename exclusions if you need to prevent this.
  
  fuzzy-match files, so either use bf(--delete-after) or specify some
  filename exclusions if you need to prevent this.
  
@@ -626,9 +640,10 @@ TODO:
  dit(bf(--compare-dest=DIR)) This option instructs rsync to use em(DIR) on
  the destination machine as an additional hierarchy to compare destination
  files against doing transfers (if the files are missing in the destination
  dit(bf(--compare-dest=DIR)) This option instructs rsync to use em(DIR) on
  the destination machine as an additional hierarchy to compare destination
  files against doing transfers (if the files are missing in the destination
---- old/util.c
-+++ new/util.c
-@@ -1030,6 +1030,32 @@ int handle_partial_dir(const char *fname
+diff --git a/util.c b/util.c
+--- a/util.c
++++ b/util.c
+@@ -1168,6 +1168,32 @@ int handle_partial_dir(const char *fname, int create)
        return 1;
  }
  
        return 1;
  }