X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/34e18ecd6158165b9fc706f281c25bc607c3c72e..7f2a1f651e6db7483bcb3d2678dcb60cc4e54582:/flist.c diff --git a/flist.c b/flist.c index a97eb79c..05b53f6e 100644 --- a/flist.c +++ b/flist.c @@ -1767,6 +1767,8 @@ struct file_list *get_dirlist(const char *dirname, int ignore_filter_rules) send_directory(ignore_filter_rules ? -2 : -1, dirlist, dirbuf, dlen); recurse = save_recurse; + clean_flist(dirlist, 0, 0); + return dirlist; } @@ -1788,6 +1790,7 @@ int delete_file(char *fname, int mode, int flags) struct file_list *dirlist; char buf[MAXPATHLEN]; int j, zap_dir, ok; + void *save_filters; if (max_delete && deletion_count >= max_delete) return -1; @@ -1812,9 +1815,15 @@ int delete_file(char *fname, int mode, int flags) zap_dir = (flags & DEL_FORCE_RECURSE || (force_delete && recurse)) && !(flags & DEL_NO_RECURSE); - if (dry_run && zap_dir) + if (dry_run && zap_dir) { + ok = 0; errno = ENOTEMPTY; - else if (do_rmdir(fname) == 0) { + } else if (make_backups && !backup_dir && !is_backup_file(fname) + && !(flags & DEL_FORCE_RECURSE)) + ok = make_backup(fname); + else + ok = do_rmdir(fname) == 0; + if (ok) { if ((verbose || log_format) && !(flags & DEL_TERSE)) log_delete(fname, mode); deletion_count++; @@ -1827,40 +1836,36 @@ int delete_file(char *fname, int mode, int flags) full_fname(fname)); return -1; } + flags |= DEL_FORCE_RECURSE; - if (!(flags & DEL_TERSE)) { - if (verbose || log_format) - log_delete(fname, mode); - flags |= DEL_TERSE; - } + save_filters = push_local_filters(fname, strlen(fname)); dirlist = get_dirlist(fname, 0); - for (j = 0; j < dirlist->count; j++) { + for (j = dirlist->count; j--; ) { struct file_struct *fp = dirlist->files[j]; f_name_to(fp, buf); - if (verbose || log_format) - log_delete(buf, fp->mode); - if (delete_file(buf, fp->mode, flags) != 0) { + if (delete_file(buf, fp->mode, flags & ~DEL_TERSE) != 0) { flist_free(dirlist); return -1; } } flist_free(dirlist); + pop_local_filters(save_filters); + if (max_delete && deletion_count >= max_delete) return -1; - if (make_backups && !backup_dir && !is_backup_file(fname)) - ok = make_backup(fname); - else - ok = do_rmdir(fname) == 0; - if (!ok && errno != ENOENT) { + if (do_rmdir(fname) == 0) { + if ((verbose || log_format) && !(flags & DEL_TERSE)) + log_delete(fname, mode); + deletion_count++; + } else if (errno != ENOTEMPTY && errno != ENOENT) { rsyserr(FERROR, errno, "delete_file: rmdir %s failed", full_fname(fname)); return -1; } - deletion_count++; return 0; } @@ -1885,8 +1890,7 @@ static void delete_missing(struct file_list *full_list, if (flist_find(full_list, dir_list->files[i]) < 0) { char *fn = f_name_to(dir_list->files[i], fbuf); int mode = dir_list->files[i]->mode; - int dflag = S_ISDIR(mode) ? DEL_FORCE_RECURSE : 0; - if (delete_file(fn, mode, dflag) < 0) + if (delete_file(fn, mode, DEL_FORCE_RECURSE) < 0) break; } } @@ -1948,6 +1952,8 @@ void delete_in_dir(struct file_list *flist, char *fbuf, recurse = -1; fbuf[dlen] = '\0'; + clean_flist(dir_list, 0, 0); + if (verbose > 3) output_flist(dir_list, "delete");