diff -Nuarp rsync-3.0.7.orig/generator.c rsync-3.0.7/generator.c --- rsync-3.0.7.orig/generator.c 2009-12-23 20:36:27.000000000 +0100 +++ rsync-3.0.7/generator.c 2014-01-13 17:28:29.008000000 +0100 @@ -1434,6 +1434,19 @@ static void recv_generator(char *fname, dry_missing_dir = file; file->flags |= FLAG_MISSING_DIR; } + + if (update_only > 0 && statret == 0 + && cmp_time(sx.st.st_mtime, file->modtime) > 0) { + if (verbose > 1) + rprintf(FINFO, "%s is newer\n", fname); +#ifdef SUPPORT_HARD_LINKS + if (F_IS_HLINKED(file)) + handle_skipped_hlink(file, itemizing, code, f_out); +#endif + file->flags |= FLAG_DONT_TOUCH; + goto cleanup; + } + real_ret = statret; real_sx = sx; if (file->flags & FLAG_DIR_CREATED) @@ -2049,6 +2062,14 @@ static void touch_up_dirs(struct file_li if (!S_ISDIR(file->mode) || (!implied_dirs && file->flags & FLAG_IMPLIED_DIR)) continue; + if (S_ISDIR(file->mode) && file->flags & FLAG_DONT_TOUCH) { + fname = f_name(file, NULL); + if (verbose > 3) { + rprintf(FINFO, "skipping touch_up_dirs: %s (%d)\n", + NS(fname), i); + continue; + } + } if (verbose > 3) { fname = f_name(file, NULL); rprintf(FINFO, "touch_up_dirs: %s (%d)\n", diff -Nuarp rsync-3.0.7.orig/rsync.h rsync-3.0.7/rsync.h --- rsync-3.0.7.orig/rsync.h 2009-12-23 20:36:27.000000000 +0100 +++ rsync-3.0.7/rsync.h 2014-01-13 17:23:42.056000000 +0100 @@ -80,6 +80,7 @@ #define FLAG_LENGTH64 (1<<9) /* sender/receiver/generator */ #define FLAG_SKIP_GROUP (1<<10) /* receiver/generator */ #define FLAG_TIME_FAILED (1<<11)/* generator */ +#define FLAG_DONT_TOUCH (1<<12)/* generator */ /* These flags are passed to functions but not stored. */