On Tue, Sep 27, 2005 at 07:10:31PM +0200, Guillaume Etorre
wrote:> Is there any reason for --delete not to delete when used with --dirs?
It's a historical reason due to the original delete code only knowing
how to handle a from-the-top recursion pass. When I improved the delete
code in 2.6.4 (implementing --delete-during and making it more memory
efficient), the new algorithm is now capable of handling deletions in
individual directories, so all it would take to implement this is to
tweak the options processing to not disable --delete when --dirs is
enabled, and to properly mark directories whose content was sent as
opposed to solo directories. The attached patch does this, and I
don't think it has any unintended side-effects. Feel free to give it
a try.
..wayne..
-------------- next part --------------
--- flist.c 17 Sep 2005 21:49:24 -0000 1.304
+++ flist.c 28 Sep 2005 17:02:58 -0000
@@ -650,7 +650,7 @@ static struct file_struct *receive_file_
if (basename_len == 1+1 && *basename == '.') /* +1 for
'\0' */
file->dir.depth--;
if (flags & XMIT_TOP_DIR) {
- in_del_hier = 1;
+ in_del_hier = recurse;
del_hier_name_len = file->dir.depth == 0 ? 0 : l1 + l2;
if (relative_paths && del_hier_name_len > 2
&& basename_len == 1+1 && *basename == '.')
@@ -1228,10 +1228,11 @@ struct file_list *send_file_list(int f,
if (one_file_system)
filesystem_dev = st.st_dev;
- if ((file = send_file_name(f, flist, fname, XMIT_TOP_DIR))) {
- if (recurse || (xfer_dirs && is_dot_dir))
+ if (recurse || (xfer_dirs && is_dot_dir)) {
+ if ((file = send_file_name(f, flist, fname, XMIT_TOP_DIR)))
send_if_directory(f, flist, file);
- }
+ } else
+ send_file_name(f, flist, fname, 0);
if (olddir[0]) {
flist_dir = NULL;
--- options.c 21 Sep 2005 22:39:49 -0000 1.278
+++ options.c 28 Sep 2005 17:02:59 -0000
@@ -1022,7 +1022,7 @@ int parse_arguments(int *argc, const cha
"You may not combine multiple --delete-WHEN options.\n");
return 0;
}
- if (!recurse) {
+ if (!recurse && !xfer_dirs) {
delete_before = delete_during = delete_after = 0;
delete_mode = delete_excluded = 0;
} else if (delete_before || delete_during || delete_after)