]> git.ipfire.org Git - thirdparty/rsync.git/commitdiff
Add hashtable to delete_in_dir() to fix -x deletions
authorWayne Davison <wayne@opencoder.net>
Fri, 12 Jun 2020 23:52:54 +0000 (16:52 -0700)
committerWayne Davison <wayne@opencoder.net>
Sat, 13 Jun 2020 00:42:56 +0000 (17:42 -0700)
generator.c

index dba97d85451d9f9324102edbee5f015eb61e5517..210e5f31cb63007b805e394421aa2d1db9233987 100644 (file)
@@ -277,6 +277,7 @@ static void do_delayed_deletions(char *delbuf)
 static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
 {
        static int already_warned = 0;
+       static struct hashtable *dev_tbl;
        struct file_list *dirlist;
        char delbuf[MAXPATHLEN];
        int dlen, i;
@@ -305,10 +306,16 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
        change_local_filter_dir(fbuf, dlen, F_DEPTH(file));
 
        if (one_file_system) {
-               if (file->flags & FLAG_TOP_DIR)
+               if (!dev_tbl)
+                       dev_tbl = hashtable_create(16, HT_KEY64);
+               if (file->flags & FLAG_TOP_DIR) {
+                       hashtable_find(dev_tbl, *fs_dev+1, "");
                        filesystem_dev = *fs_dev;
-               else if (filesystem_dev != *fs_dev)
-                       return;
+               } else if (filesystem_dev != *fs_dev) {
+                       if (!hashtable_find(dev_tbl, *fs_dev+1, NULL))
+                               return;
+                       filesystem_dev = *fs_dev; /* it's a prior top-dir dev */
+               }
        }
 
        dirlist = get_dirlist(fbuf, dlen, 0);