Updated patches to work with the current trunk.
[rsync/rsync-patches.git] / date-only.diff
1 Jeremy Bornstein wrote:
2
3 I recently had the need to transfer files only with different mod
4 dates (and to *not* transfer them based on file size differences).
5 This is because I'm backing up files remotely on an untrusted machine,
6 so I'm encrypting them with gpg before transfer.  I discovered that
7 rsync didn't already have a --date-only flag, so I added one and am
8 enclosing the diffs in case you (as I hope) decide to include this
9 option in future releases.
10
11 To use this patch, run these commands for a successful build:
12
13     patch -p1 <patches/date-only.diff
14     ./configure                                 (optional if already run)
15     make
16
17 diff --git a/generator.c b/generator.c
18 index 12007a1..a2519e6 100644
19 --- a/generator.c
20 +++ b/generator.c
21 @@ -64,6 +64,7 @@ extern int append_mode;
22  extern int make_backups;
23  extern int csum_length;
24  extern int ignore_times;
25 +extern int date_only;
26  extern int size_only;
27  extern OFF_T max_size;
28  extern OFF_T min_size;
29 @@ -524,6 +525,9 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
30  /* Perform our quick-check heuristic for determining if a file is unchanged. */
31  int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
32  {
33 +       if (date_only)
34 +               return cmp_time(st->st_mtime, file->modtime) == 0;
35 +
36         if (st->st_size != F_LENGTH(file))
37                 return 0;
38  
39 diff --git a/options.c b/options.c
40 index e7c6c61..b317903 100644
41 --- a/options.c
42 +++ b/options.c
43 @@ -105,6 +105,7 @@ int safe_symlinks = 0;
44  int copy_unsafe_links = 0;
45  int munge_symlinks = 0;
46  int size_only = 0;
47 +int date_only = 0;
48  int daemon_bwlimit = 0;
49  int bwlimit = 0;
50  int fuzzy_basis = 0;
51 @@ -739,6 +740,7 @@ void usage(enum logcode F)
52    rprintf(F," -I, --ignore-times          don't skip files that match in size and mod-time\n");
53    rprintf(F," -M, --remote-option=OPTION  send OPTION to the remote side only\n");
54    rprintf(F,"     --size-only             skip files that match in size\n");
55 +  rprintf(F,"     --date-only             skip files that match in mod-time\n");
56    rprintf(F,"     --modify-window=NUM     compare mod-times with reduced accuracy\n");
57    rprintf(F," -T, --temp-dir=DIR          create temporary files in directory DIR\n");
58    rprintf(F," -y, --fuzzy                 find similar file for basis if no dest file\n");
59 @@ -887,6 +889,7 @@ static struct poptOption long_options[] = {
60    {"chmod",            0,  POPT_ARG_STRING, 0, OPT_CHMOD, 0, 0 },
61    {"ignore-times",    'I', POPT_ARG_NONE,   &ignore_times, 0, 0, 0 },
62    {"size-only",        0,  POPT_ARG_NONE,   &size_only, 0, 0, 0 },
63 +  {"date-only",        0,  POPT_ARG_NONE,   &date_only, 0, 0, 0 },
64    {"one-file-system", 'x', POPT_ARG_NONE,   0, 'x', 0, 0 },
65    {"no-one-file-system",'x',POPT_ARG_VAL,   &one_file_system, 0, 0, 0 },
66    {"no-x",            'x', POPT_ARG_VAL,    &one_file_system, 0, 0, 0 },
67 @@ -2493,6 +2496,9 @@ void server_options(char **args, int *argc_p)
68         else if (missing_args == 1 && !am_sender)
69                 args[ac++] = "--ignore-missing-args";
70  
71 +       if (date_only)
72 +               args[ac++] = "--date-only";
73 +
74         if (modify_window_set) {
75                 if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
76                         goto oom;
77 diff --git a/rsync.yo b/rsync.yo
78 index 941f7a5..710b32d 100644
79 --- a/rsync.yo
80 +++ b/rsync.yo
81 @@ -394,6 +394,7 @@ to the detailed description below for a complete description.  verb(
82       --contimeout=SECONDS    set daemon connection timeout in seconds
83   -I, --ignore-times          don't skip files that match size and time
84       --size-only             skip files that match in size
85 +     --date-only             skip files that match in mod-time
86       --modify-window=NUM     compare mod-times with reduced accuracy
87   -T, --temp-dir=DIR          create temporary files in directory DIR
88   -y, --fuzzy                 find similar file for basis if no dest file
89 @@ -554,6 +555,12 @@ time to just looking for files that have changed in size.  This is useful
90  when starting to use rsync after using another mirroring system which may
91  not preserve timestamps exactly.
92  
93 +dit(bf(--date-only)) Normally rsync will skip any files that are
94 +already the same size and have the same modification time-stamp. With the
95 +--date-only option, files will be skipped if they have the same
96 +timestamp, regardless of size. This may be useful when the remote
97 +files have passed through a size-changing filter, e.g. for encryption.
98 +
99  dit(bf(--modify-window)) When comparing two timestamps, rsync treats the
100  timestamps as being equal if they differ by no more than the modify-window
101  value.  This is normally 0 (for an exact match), but you may find it useful