Moved the delete-after support into generator.c.
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index 21fe9f4..e19b06a 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -63,7 +63,6 @@ extern int force_delete;
 extern int orig_umask;
 extern int make_backups;
 extern unsigned int curr_dir_len;
-extern char *log_format;
 extern char *backup_dir;
 extern char *backup_suffix;
 extern int backup_suffix_len;
@@ -963,7 +962,7 @@ skip_filters:
                        file->mode = save_mode;
        }
 
-       if (!S_ISDIR(st.st_mode))
+       if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode))
                stats.total_size += st.st_size;
 
        return file;
@@ -1767,6 +1766,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 +1789,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;
@@ -1798,7 +1800,7 @@ int delete_file(char *fname, int mode, int flags)
                else
                        ok = robust_unlink(fname) == 0;
                if (ok) {
-                       if ((verbose || log_format) && !(flags & DEL_TERSE))
+                       if (!(flags & DEL_TERSE))
                                log_delete(fname, mode);
                        deletion_count++;
                        return 0;
@@ -1812,10 +1814,16 @@ 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) {
-               if ((verbose || log_format) && !(flags & DEL_TERSE))
+       } 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 (!(flags & DEL_TERSE))
                        log_delete(fname, mode);
                deletion_count++;
                return 0;
@@ -1827,9 +1835,12 @@ int delete_file(char *fname, int mode, int flags)
                        full_fname(fname));
                return -1;
        }
+       flags |= DEL_FORCE_RECURSE;
+
+       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 (delete_file(buf, fp->mode, flags & ~DEL_TERSE) != 0) {
@@ -1839,15 +1850,13 @@ int delete_file(char *fname, int mode, int flags)
        }
        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) {
-               if ((verbose || log_format) && !(flags & DEL_TERSE))
+       if (do_rmdir(fname) == 0) {
+               if (!(flags & DEL_TERSE))
                        log_delete(fname, mode);
                deletion_count++;
        } else if (errno != ENOTEMPTY && errno != ENOENT) {
@@ -1880,8 +1889,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;
                }
        }
@@ -1943,6 +1951,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");