From 0e34285da6ad1111b270d3463d5216493ffcde6f Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 31 Jul 2018 13:21:06 +0200 Subject: [PATCH 1/1] afh: Implement --preserve. This is easy because we already have the inode information of the old file from the existing call to stat(2). --- afh.c | 18 ++++++++++++++++++ m4/lls/afh.suite.m4 | 6 ++++++ 2 files changed, 24 insertions(+) diff --git a/afh.c b/afh.c index aa6570e1..ffb4315b 100644 --- a/afh.c +++ b/afh.c @@ -113,6 +113,24 @@ static int rewrite_tags(const char *name, int input_fd, void *map, goto out; } ret = xrename(tmp_name, name); + if (ret < 0) + goto out; + if (OPT_GIVEN(PRESERVE)) { + struct timespec times[2]; /* [0]: atime, [1]: mtime */ + times[0].tv_nsec = UTIME_OMIT; + times[1] = sb.st_mtim; + /* + * We might well have written a file of identical size. If we + * keep the mtime as well, we might fool backup applications + * like rsync which skip files whose size and mtime haven't + * changed. So we change the mtime slightly. + */ + times[1].tv_sec++; + if (futimens(output_fd, times) < 0) { + ret = -ERRNO_TO_PARA_ERROR(errno); + goto out; + } + } out: if (ret < 0 && output_fd >= 0) unlink(tmp_name); /* ignore errors */ diff --git a/m4/lls/afh.suite.m4 b/m4/lls/afh.suite.m4 index cf83b972..7ebf208c 100644 --- a/m4/lls/afh.suite.m4 +++ b/m4/lls/afh.suite.m4 @@ -62,6 +62,12 @@ version-string = GIT_VERSION() The backup suffix is '~'. That is, a single tilde character is appended to the given file name. [/help] + [option preserve] + summary = preserve modification time + [help] + If this option is given, the mtime of the modified file is set to + the value prior to the modification. + [/help] [option year] short_opt = y summary = set the year tag -- 2.39.2