Fixed a problem with duplicate dirs being unduplicated in the list:
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index 688117c..6963b46 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -1791,16 +1791,11 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                dirlen = dir ? strlen(dir) : 0;
                if (dirlen != lastdir_len || memcmp(lastdir, dir, dirlen) != 0) {
                        if (!push_pathname(dir ? strdup(dir) : NULL, dirlen))
-                               goto push_error;
+                               continue;
                        lastdir = pathname;
                        lastdir_len = pathname_len;
-               } else if (!push_pathname(lastdir, lastdir_len)) {
-                 push_error:
-                       io_error |= IOERR_GENERAL;
-                       rsyserr(FERROR, errno, "push_dir %s failed in %s",
-                               full_fname(dir), curr_dir);
+               } else if (!push_pathname(lastdir, lastdir_len))
                        continue;
-               }
 
                if (fn != fbuf)
                        memmove(fbuf, fn, len + 1);
@@ -2303,14 +2298,11 @@ static void clean_flist(struct file_list *flist, int strip_root)
                        int keep, drop;
                        /* If one is a dir and the other is not, we want to
                         * keep the dir because it might have contents in the
-                        * list. */
-                       if (S_ISDIR(file->mode)) {
-                               struct file_struct *fp = flist->sorted[j];
-                               if (!S_ISDIR(fp->mode))
-                                       keep = i, drop = j;
-                               else
-                                       keep = j, drop = i;
-                       } else
+                        * list.  If both are dirs, keep the last one.
+                        * Otherwise keep the first one. */
+                       if (S_ISDIR(file->mode))
+                               keep = i, drop = j;
+                       else
                                keep = j, drop = i;
 
                        if (am_sender)