Make sure the %f expansion handles the new dir.root properly.
[rsync/rsync.git] / rsync.c
diff --git a/rsync.c b/rsync.c
index e23f1ab..acb260c 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -25,6 +25,7 @@
 extern int verbose;
 extern int dry_run;
 extern int preserve_times;
+extern int omit_dir_times;
 extern int am_root;
 extern int am_sender;
 extern int am_generator;
@@ -58,6 +59,7 @@ int delete_file(char *fname, int flags)
        struct dirent *di;
        char buf[MAXPATHLEN];
        STRUCT_STAT st;
+       int zap_dir;
 
        if (!(flags & DEL_DIR)) {
                if (robust_unlink(fname) == 0) {
@@ -74,7 +76,11 @@ int delete_file(char *fname, int flags)
                return -1;
        }
 
-       if (do_rmdir(fname) == 0) {
+       zap_dir = (flags & DEL_FORCE_RECURSE || (force_delete && recurse))
+               && !(flags & DEL_NO_RECURSE);
+       if (dry_run && zap_dir)
+               errno = ENOTEMPTY;
+       else if (do_rmdir(fname) == 0) {
                if (verbose && !(flags & DEL_TERSE)) {
                        rprintf(FINFO, "deleting %s/\n",
                                safe_fname(fname));
@@ -83,8 +89,7 @@ int delete_file(char *fname, int flags)
        }
        if (errno == ENOENT)
                return 0;
-       if ((flags & DEL_NO_RECURSE) || !force_delete || !recurse
-           || (errno != ENOTEMPTY && errno != EEXIST)) {
+       if (!zap_dir || (errno != ENOTEMPTY && errno != EEXIST)) {
                rsyserr(FERROR, errno, "delete_file: rmdir %s failed",
                        full_fname(fname));
                return -1;
@@ -162,14 +167,12 @@ int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
        }
 
        if (!preserve_times || S_ISLNK(st->st_mode)
-           || (make_backups && !backup_dir && S_ISDIR(st->st_mode)))
+        || (S_ISDIR(st->st_mode)
+         && (omit_dir_times || (make_backups && !backup_dir))))
                flags |= PERMS_SKIP_MTIME;
        if (!(flags & PERMS_SKIP_MTIME)
            && cmp_modtime(st->st_mtime, file->modtime) != 0) {
-               /* don't complain about not setting times on directories
-                * because some filesystems can't do it */
-               if (set_modtime(fname,file->modtime) != 0 &&
-                   !S_ISDIR(st->st_mode)) {
+               if (set_modtime(fname,file->modtime) != 0) {
                        rsyserr(FERROR, errno, "failed to set times on %s",
                                full_fname(fname));
                        return 0;
@@ -218,7 +221,7 @@ int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
                updated = 1;
        }
 
-#ifdef HAVE_CHMOD
+#if HAVE_CHMOD
        if (!S_ISLNK(st->st_mode)) {
                if ((st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS)) {
                        updated = 1;