[SCM] The rsync repository. - branch master updated
Rsync CVS commit messages
rsync-cvs at lists.samba.org
Sun Jan 24 19:17:05 UTC 2016
The branch, master has been updated
via 839dbff Add support for comparing nanoseconds on the receiver.
via f6f5ea4 Prepare the repository for more development.
from 9a37d9c Fix a tweak that should have been untweaked.
https://git.samba.org/?p=rsync.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 839dbff2aaf0277471e1986a3cd0f869e0bdda24
Author: Wayne Davison <wayned at samba.org>
Date: Sun Jan 24 11:12:38 2016 -0800
Add support for comparing nanoseconds on the receiver.
This patch adds the ability to specify --modify-window=-1 (aka - at -1) to
ask rsync to compare files with the full nanosecond timestamps. The
default is still - at 0 for the moment, which ignores nanoseconds in time
comparisons. Changing the default to -1 would cause a copy from ext4 to
ext3 to constantly compare as different, or a copy there and back again
to do a full copy as it zeroed all the nanosecond times. Such a change
might be too much of a functional difference for things like backup
solutions to handle without a warning period. The current plan is to
support nanosecond comparisons for those that want them, and possibly
change the default window value from 0 to -1 at some point in the
future.
commit f6f5ea41737b7802b47fe3e7964c76b5e87668a0
Author: Wayne Davison <wayned at samba.org>
Date: Sun Jan 24 11:12:24 2016 -0800
Prepare the repository for more development.
-----------------------------------------------------------------------
Summary of changes:
NEWS | 45 +++++----------------------------------------
OLDNEWS | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
configure.ac | 2 +-
generator.c | 24 +++++++++++++-----------
options.c | 9 +++++----
rsync.yo | 24 +++++++++++++++++-------
util.c | 17 +++++++++++------
7 files changed, 100 insertions(+), 69 deletions(-)
Changeset truncated at 500 lines:
diff --git a/NEWS b/NEWS
index 2de8d12..bffdeb7 100644
--- a/NEWS
+++ b/NEWS
@@ -1,47 +1,12 @@
-NEWS for rsync 3.1.2 (21 Dec 2015)
+NEWS for rsync 3.1.3 (UNRELEASED)
Protocol: 31 (unchanged)
-Changes since 3.1.1:
-
- SECURITY FIXES:
-
- - Make sure that all transferred files use only path names from inside the
- transfer. This makes it impossible for a malicious sender to try to make
- the receiver use an unsafe destination path for a transferred file, such
- as a just-sent symlink.
+Changes since 3.1.2:
BUG FIXES:
- - Change the checksum seed order in the per-block checksums. This prevents
- someone from trying to create checksum blocks that match in sum but not
- content.
- - Fixed a with the per-dir filter files (using -FF) that could trigger an
- assert failure.
- - Only skip set_modtime() on a transferred file if the time is exactly
- right.
- - Don't create an empty backup dir for a transferred file that doesn't
- exist yet.
- - Fixed a bug where --link-dest and --xattrs could cause rsync to exit if
- a filename had a matching dir of the same name in the alt-dest area.
- - Allow more than 32 group IDs per user in the daemon's gid=LIST config.
- - Fix the logging of %b & %c via --log-file (daemon logging was already
- correct, as was --out-format='%b/%c').
- - Fix erroneous acceptance of --info=5 & --debug=5 (an empty flag name is
- not valid).
+ - ...
ENHANCEMENTS:
- - Added "(DRY RUN)" info to the --debug=exit output line.
- - Use usleep() for our msleep() function if it is available.
- - Added a few extra long-option names to rrsync script, which will make
- BackupPC happier.
- - Made configure choose to use linux xattrs on netbsd (rather than not
- supporting xattrs).
- - Added -wo (write-only) option to rrsync support script.
- - Misc. manpage tweaks.
-
- DEVELOPER RELATED:
-
- - Fixed a bug with the Makefile's use of INSTALL_STRIP.
- - Improve a test in the suite that could get an erroneous timestamp error.
- - Tweaks for newer versions of git in the packaging tools.
- - Improved the m4 generation rules and some autoconf idioms.
+ - Add the ability for rsync to compare nanosecond times in its file-check
+ comparisons. Also added a short-option (-@) for --modify-window.
diff --git a/OLDNEWS b/OLDNEWS
index a555950..484bda0 100644
--- a/OLDNEWS
+++ b/OLDNEWS
@@ -1,3 +1,51 @@
+NEWS for rsync 3.1.2 (21 Dec 2015)
+Protocol: 31 (unchanged)
+Changes since 3.1.1:
+
+ SECURITY FIXES:
+
+ - Make sure that all transferred files use only path names from inside the
+ transfer. This makes it impossible for a malicious sender to try to make
+ the receiver use an unsafe destination path for a transferred file, such
+ as a just-sent symlink.
+
+ BUG FIXES:
+
+ - Change the checksum seed order in the per-block checksums. This prevents
+ someone from trying to create checksum blocks that match in sum but not
+ content.
+ - Fixed a with the per-dir filter files (using -FF) that could trigger an
+ assert failure.
+ - Only skip set_modtime() on a transferred file if the time is exactly
+ right.
+ - Don't create an empty backup dir for a transferred file that doesn't
+ exist yet.
+ - Fixed a bug where --link-dest and --xattrs could cause rsync to exit if
+ a filename had a matching dir of the same name in the alt-dest area.
+ - Allow more than 32 group IDs per user in the daemon's gid=LIST config.
+ - Fix the logging of %b & %c via --log-file (daemon logging was already
+ correct, as was --out-format='%b/%c').
+ - Fix erroneous acceptance of --info=5 & --debug=5 (an empty flag name is
+ not valid).
+
+ ENHANCEMENTS:
+
+ - Added "(DRY RUN)" info to the --debug=exit output line.
+ - Use usleep() for our msleep() function if it is available.
+ - Added a few extra long-option names to rrsync script, which will make
+ BackupPC happier.
+ - Made configure choose to use linux xattrs on netbsd (rather than not
+ supporting xattrs).
+ - Added -wo (write-only) option to rrsync support script.
+ - Misc. manpage tweaks.
+
+ DEVELOPER RELATED:
+
+ - Fixed a bug with the Makefile's use of INSTALL_STRIP.
+ - Improve a test in the suite that could get an erroneous timestamp error.
+ - Tweaks for newer versions of git in the packaging tools.
+ - Improved the m4 generation rules and some autoconf idioms.
+
NEWS for rsync 3.1.1 (22 Jun 2014)
Protocol: 31 (unchanged)
Changes since 3.1.0:
diff --git a/configure.ac b/configure.ac
index 1b32dfb..b5e4049 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT([rsync],[3.1.2],[http://rsync.samba.org/bugzilla.html])
+AC_INIT([rsync],[3.1.3dev],[http://rsync.samba.org/bugzilla.html])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR([byteorder.h])
diff --git a/generator.c b/generator.c
index ddf44a0..fd7c8f8 100644
--- a/generator.c
+++ b/generator.c
@@ -382,9 +382,13 @@ static void do_delete_pass(void)
rprintf(FINFO, " \r");
}
-static inline int time_differs(struct file_struct *file, stat_x *sxp)
+static inline int time_diff(STRUCT_STAT *stp, struct file_struct *file)
{
- return cmp_time(sxp->st.st_mtime, file->modtime);
+#ifdef ST_MTIME_NSEC
+ return cmp_time(stp->st_mtime, stp->ST_MTIME_NSEC, file->modtime, F_MOD_NSEC(file));
+#else
+ return cmp_time(stp->st_mtime, 0L, file->modtime, 0L);
+#endif
}
static inline int perms_differ(struct file_struct *file, stat_x *sxp)
@@ -441,7 +445,7 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
{
if (S_ISLNK(file->mode)) {
#ifdef CAN_SET_SYMLINK_TIMES
- if (preserve_times & PRESERVE_LINK_TIMES && time_differs(file, sxp))
+ if (preserve_times & PRESERVE_LINK_TIMES && time_diff(&sxp->st, file))
return 0;
#endif
#ifdef CAN_CHMOD_SYMLINK
@@ -461,7 +465,7 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
return 0;
#endif
} else {
- if (preserve_times && time_differs(file, sxp))
+ if (preserve_times && time_diff(&sxp->st, file))
return 0;
if (perms_differ(file, sxp))
return 0;
@@ -496,7 +500,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
if (iflags & ITEM_LOCAL_CHANGE)
iflags |= symlink_timeset_failed_flags;
} else if (keep_time
- ? cmp_time(file->modtime, sxp->st.st_mtime) != 0
+ ? time_diff(&sxp->st, file)
: iflags & (ITEM_TRANSFER|ITEM_LOCAL_CHANGE) && !(iflags & ITEM_MATCHED)
&& (!(iflags & ITEM_XNAME_FOLLOWS) || *xname))
iflags |= ITEM_REPORT_TIME;
@@ -588,7 +592,7 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
if (ignore_times)
return 0;
- return cmp_time(st->st_mtime, file->modtime) == 0;
+ return time_diff(st, file) == 0;
}
@@ -765,7 +769,7 @@ static struct file_struct *find_fuzzy(struct file_struct *file, struct file_list
if (!S_ISREG(fp->mode) || !F_LENGTH(fp) || fp->flags & FLAG_FILE_SENT)
continue;
- if (F_LENGTH(fp) == F_LENGTH(file) && cmp_time(fp->modtime, file->modtime) == 0) {
+ if (F_LENGTH(fp) == F_LENGTH(file) && cmp_time(fp->modtime, 0L, file->modtime, 0L) == 0) {
if (DEBUG_GTE(FUZZY, 2))
rprintf(FINFO, "fuzzy size/modtime match for %s\n", f_name(fp, NULL));
*fnamecmp_type_ptr = FNAMECMP_FUZZY + i;
@@ -1674,8 +1678,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
goto cleanup;
}
- if (update_only > 0 && statret == 0
- && cmp_time(sx.st.st_mtime, file->modtime) > 0) {
+ if (update_only > 0 && statret == 0 && time_diff(&sx.st, file) > 0) {
if (INFO_GTE(SKIP, 1))
rprintf(FINFO, "%s is newer\n", fname);
#ifdef SUPPORT_HARD_LINKS
@@ -2062,8 +2065,7 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
do_chmod(fname, file->mode);
if (need_retouch_dir_times) {
STRUCT_STAT st;
- if (link_stat(fname, &st, 0) == 0
- && cmp_time(st.st_mtime, file->modtime) != 0)
+ if (link_stat(fname, &st, 0) == 0 && time_diff(&st, file))
set_modtime(fname, file->modtime, F_MOD_NSEC(file), file->mode);
}
if (counter >= loopchk_limit) {
diff --git a/options.c b/options.c
index 74239bf..4a5cdc8 100644
--- a/options.c
+++ b/options.c
@@ -755,7 +755,7 @@ void usage(enum logcode F)
rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n");
rprintf(F," -M, --remote-option=OPTION send OPTION to the remote side only\n");
rprintf(F," --size-only skip files that match in size\n");
- rprintf(F," --modify-window=NUM compare mod-times with reduced accuracy\n");
+ rprintf(F," -@, --modify-window=NUM set the accuracy for mod-time comparisons\n");
rprintf(F," -T, --temp-dir=DIR create temporary files in directory DIR\n");
rprintf(F," -y, --fuzzy find similar file for basis if no dest file\n");
rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
@@ -871,7 +871,7 @@ static struct poptOption long_options[] = {
{"omit-link-times", 'J', POPT_ARG_VAL, &omit_link_times, 1, 0, 0 },
{"no-omit-link-times",0, POPT_ARG_VAL, &omit_link_times, 0, 0, 0 },
{"no-J", 0, POPT_ARG_VAL, &omit_link_times, 0, 0, 0 },
- {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
+ {"modify-window", '@', POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
{"super", 0, POPT_ARG_VAL, &am_root, 2, 0, 0 },
{"no-super", 0, POPT_ARG_VAL, &am_root, 0, 0, 0 },
{"fake-super", 0, POPT_ARG_VAL, &am_root, -1, 0, 0 },
@@ -2649,8 +2649,9 @@ void server_options(char **args, int *argc_p)
else if (missing_args == 1 && !am_sender)
args[ac++] = "--ignore-missing-args";
- if (modify_window_set) {
- if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
+ if (modify_window_set && am_sender) {
+ char *fmt = modify_window < 0 ? "-@%d" : "--modify-window=%d";
+ if (asprintf(&arg, fmt, modify_window) < 0)
goto oom;
args[ac++] = arg;
}
diff --git a/rsync.yo b/rsync.yo
index 09ee92f..8971828 100644
--- a/rsync.yo
+++ b/rsync.yo
@@ -413,7 +413,7 @@ to the detailed description below for a complete description. verb(
--contimeout=SECONDS set daemon connection timeout in seconds
-I, --ignore-times don't skip files that match size and time
--size-only skip files that match in size
- --modify-window=NUM compare mod-times with reduced accuracy
+ -@, --modify-window=NUM set the accuracy for mod-time comparisons
-T, --temp-dir=DIR create temporary files in directory DIR
-y, --fuzzy find similar file for basis if no dest file
--compare-dest=DIR also compare received files relative to DIR
@@ -605,13 +605,23 @@ time to just looking for files that have changed in size. This is useful
when starting to use rsync after using another mirroring system which may
not preserve timestamps exactly.
-dit(bf(--modify-window)) When comparing two timestamps, rsync treats the
+dit(bf(-@, --modify-window)) When comparing two timestamps, rsync treats the
timestamps as being equal if they differ by no more than the modify-window
-value. This is normally 0 (for an exact match), but you may find it useful
-to set this to a larger value in some situations. In particular, when
-transferring to or from an MS Windows FAT filesystem (which represents
-times with a 2-second resolution), bf(--modify-window=1) is useful
-(allowing times to differ by up to 1 second).
+value. The default is 0, which matches just integer seconds. If you specify a
+negative value (and the receiver is at least version 3.1.3) then nanoseconds
+will also be taken into account. Specifying 1 is useful for copies to/from MS
+Windows FAT filesystems, because FAT represents times with a 2-second
+resolution (allowing times to differ from the original by up to 1 second).
+
+If you want all your transfers to default to comparing nanoseconds, you can
+create a ~/.popt file and put these lines in it:
+
+quote(tt( rsync alias -a -a at -1))
+quote(tt( rsync alias -t -t at -1))
+
+With that as the default, you'd need to specify bf(--modify-window=0) (aka
+bf(- at 0)) to override it and ignore nanoseconds, e.g. if you're copying between
+ext3 and ext4, or if the receiving rsync is older than 3.1.3.
dit(bf(-c, --checksum)) This changes the way rsync checks if the files have
been changed and are in need of a transfer. Without this option, rsync
diff --git a/util.c b/util.c
index baee467..2a3e5ba 100644
--- a/util.c
+++ b/util.c
@@ -1324,15 +1324,20 @@ char *timestring(time_t t)
*
* @retval -1 if the 2nd is later
**/
-int cmp_time(time_t file1, time_t file2)
+int cmp_time(time_t f1_sec, unsigned long f1_nsec, time_t f2_sec, unsigned long f2_nsec)
{
- if (file2 > file1) {
+ if (f2_sec > f1_sec) {
/* The final comparison makes sure that modify_window doesn't overflow a
- * time_t, which would mean that file2 must be in the equality window. */
- if (!modify_window || (file2 > file1 + modify_window && file1 + modify_window > file1))
+ * time_t, which would mean that f2_sec must be in the equality window. */
+ if (modify_window <= 0 || (f2_sec > f1_sec + modify_window && f1_sec + modify_window > f1_sec))
return -1;
- } else if (file1 > file2) {
- if (!modify_window || (file1 > file2 + modify_window && file2 + modify_window > file2))
+ } else if (f1_sec > f2_sec) {
+ if (modify_window <= 0 || (f1_sec > f2_sec + modify_window && f2_sec + modify_window > f2_sec))
+ return 1;
+ } else if (modify_window < 0) {
+ if (f2_nsec > f1_nsec)
+ return -1;
+ else if (f1_nsec > f2_nsec)
return 1;
}
return 0;
--
The rsync repository.
More information about the rsync-cvs
mailing list