Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
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))
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;
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;
continue;
- }
if (fn != fbuf)
memmove(fbuf, fn, len + 1);
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
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)
keep = j, drop = i;
if (am_sender)