Commit 40e38376 authored by Wayne Davison's avatar Wayne Davison

- Don't allow -x to drop implied directories.

- Improved the code that tries to avoid scanning the same dir
  twice in a row to not drop any relnamecache entries.
parent 54410882
...@@ -1041,26 +1041,26 @@ struct file_struct *make_file(const char *fname, struct file_list *flist, ...@@ -1041,26 +1041,26 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
rprintf(FINFO, "skipping directory %s\n", thisname); rprintf(FINFO, "skipping directory %s\n", thisname);
return NULL; return NULL;
} }
} else /* -x only affects dirs because we need to avoid recursing
flags &= ~FLAG_XFER_DIR; * into a mount-point directory, not to avoid copying a
* symlinked file if -L (or similar) was specified. */
/* -x only affects directories because we need to avoid recursing if (one_file_system && flags & FLAG_XFER_DIR) {
* into a mount-point directory, not to avoid copying a symlinked if (flags & FLAG_TOP_DIR)
* file if -L (or similar) was specified. */ filesystem_dev = st.st_dev;
if (one_file_system && S_ISDIR(st.st_mode)) { else if (st.st_dev != filesystem_dev) {
if (flags & FLAG_TOP_DIR) if (one_file_system > 1) {
filesystem_dev = st.st_dev; if (verbose > 2) {
else if (st.st_dev != filesystem_dev) { rprintf(FINFO,
if (one_file_system > 1) { "skipping mount-point dir %s\n",
if (verbose > 2) { thisname);
rprintf(FINFO, "skipping mount-point dir %s\n", }
thisname); return NULL;
} }
return NULL; flags |= FLAG_MOUNT_DIR;
} }
flags |= FLAG_MOUNT_DIR;
} }
} } else
flags &= ~FLAG_XFER_DIR;
if (is_excluded(thisname, S_ISDIR(st.st_mode) != 0, filter_level)) { if (is_excluded(thisname, S_ISDIR(st.st_mode) != 0, filter_level)) {
if (ignore_perishable) if (ignore_perishable)
...@@ -1631,6 +1631,7 @@ void send_extra_file_list(int f, int at_least) ...@@ -1631,6 +1631,7 @@ void send_extra_file_list(int f, int at_least)
{ {
struct file_list *flist; struct file_list *flist;
int64 start_write; int64 start_write;
uint16 prev_flags;
int future_cnt, save_io_error = io_error; int future_cnt, save_io_error = io_error;
if (flist_eof) if (flist_eof)
...@@ -1662,6 +1663,7 @@ void send_extra_file_list(int f, int at_least) ...@@ -1662,6 +1663,7 @@ void send_extra_file_list(int f, int at_least)
flist->parent_ndx = dir_ndx; flist->parent_ndx = dir_ndx;
send1extra(f, file, flist); send1extra(f, file, flist);
prev_flags = file->flags;
dp = F_DIR_NODE_P(file); dp = F_DIR_NODE_P(file);
/* If there are any duplicate directory names that follow, we /* If there are any duplicate directory names that follow, we
...@@ -1671,8 +1673,11 @@ void send_extra_file_list(int f, int at_least) ...@@ -1671,8 +1673,11 @@ void send_extra_file_list(int f, int at_least)
&& dir_flist->sorted[dir_ndx]->flags & FLAG_DUPLICATE) { && dir_flist->sorted[dir_ndx]->flags & FLAG_DUPLICATE) {
send_dir_ndx = dir_ndx; send_dir_ndx = dir_ndx;
file = dir_flist->sorted[dir_ndx]; file = dir_flist->sorted[dir_ndx];
if (F_PATHNAME(file) != pathname) /* Try to avoid some duplicate scanning of identical dirs. */
send1extra(f, file, flist); if (F_PATHNAME(file) == pathname && prev_flags & FLAG_XFER_DIR)
file->flags &= ~FLAG_XFER_DIR;
send1extra(f, file, flist);
prev_flags = file->flags;
dp = F_DIR_NODE_P(file); dp = F_DIR_NODE_P(file);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment