This patch makes update-index --refresh write the index if it contains racy timestamps, as discussed at [1]. Changes since v3: * test-lib: improve API for verifying file mtime * fix quoting around "$1" * use "rm -f" for cleanup of auxiliary files * improve API description comments * Note that gitgitgadget's "freebsd_12" check is failing since a couple of days (unrelated to this pull request); hence, this check hasn't been applied to this patch series Changes since v2: * new patch: test-lib: introduce API for verifying file mtime * new patch: t7508: fix bogus mtime verification for test "--no-optional-locks prevents index update" * change new tests in t2108 and t7508 to use new test-lib mtime API * fix "--refresh has no racy timestamps to fix" to use +60s mtime to be save on VFAT Changes since v1: * main commit message now uses 'git update-index' and the paragraph was dropped * t/t7508-status.sh: two tests added which capture status racy handling * builtin/update-index.c: comment improved * t/t2108-update-index-refresh-racy.sh: major overhaul * one test case added * mtime-manipulations simplified and aligned to t7508 * code style fixes, as discussed [1] https://lore.kernel.org/git/d3dd805c-7c1d-30a9-6574-a7bfcb7fc013@xxxxxxxxxxx/ Marc Strapetz (4): test-lib: introduce API for verifying file mtime t7508: fix bogus mtime verification t7508: add tests capturing racy timestamp handling update-index: refresh should rewrite index in case of racy timestamps builtin/update-index.c | 11 +++++ cache.h | 1 + read-cache.c | 2 +- t/t2108-update-index-refresh-racy.sh | 64 ++++++++++++++++++++++++++++ t/t7508-status.sh | 30 ++++++++++--- t/test-lib-functions.sh | 33 ++++++++++++++ 6 files changed, 135 insertions(+), 6 deletions(-) create mode 100755 t/t2108-update-index-refresh-racy.sh base-commit: dcc0cd074f0c639a0df20461a301af6d45bd582e Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1105%2Fmstrap%2Ffeature%2Fupdate-index-refresh-v4 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1105/mstrap/feature/update-index-refresh-v4 Pull-Request: https://github.com/gitgitgadget/git/pull/1105 Range-diff vs v3: 1: e6301e9d770 ! 1: 37c11bfafc4 test-lib: introduce API for verifying file mtime @@ t/test-lib-functions.sh: test_region () { perl -le 'print readlink($_) for @ARGV' "$@" } + -+# Set a fixed "magic" mtime to the given file, -+# with an optional increment specified as second argument. -+# Use in combination with test_is_magic_mtime. ++# Set mtime to a fixed "magic" timestamp in mid February 2009, before we ++# run an operation that may or may not touch the file. If the file was ++# touched, its timestamp will not accidentally have such an old timestamp, ++# as long as your filesystem clock is reasonably correct. To verify the ++# timestamp, follow up with test_is_magic_mtime. ++# ++# An optional increment to the magic timestamp may be specified as second ++# argument. +test_set_magic_mtime () { -+ # We are using 1234567890 because it's a common timestamp used in -+ # various tests. It represents date 2009-02-13 which should be safe -+ # to use as long as the filetime clock is reasonably accurate. + local inc=${2:-0} && + local mtime=$((1234567890 + $inc)) && -+ test-tool chmtime =$mtime $1 && -+ test_is_magic_mtime $1 $inc ++ test-tool chmtime =$mtime "$1" && ++ test_is_magic_mtime "$1" $inc +} + -+# Test whether the given file has the "magic" mtime set, -+# with an optional increment specified as second argument. -+# Use in combination with test_set_magic_mtime. ++# Test whether the given file has the "magic" mtime set. This is meant to ++# be used in combination with test_set_magic_mtime. ++# ++# An optional increment to the magic timestamp may be specified as second ++# argument. Usually, this should be the same increment which was used for ++# the associated test_set_magic_mtime. +test_is_magic_mtime () { + local inc=${2:-0} && + local mtime=$((1234567890 + $inc)) && + echo $mtime >.git/test-mtime-expect && -+ test-tool chmtime --get $1 >.git/test-mtime-actual && ++ test-tool chmtime --get "$1" >.git/test-mtime-actual && + test_cmp .git/test-mtime-expect .git/test-mtime-actual + local ret=$? -+ rm .git/test-mtime-expect -+ rm .git/test-mtime-actual ++ rm -f .git/test-mtime-expect ++ rm -f .git/test-mtime-actual + return $ret +} 2: d15a23cc804 = 2: c97a41af389 t7508: fix bogus mtime verification 3: 3567ef91e7a = 3: 82d0b6ab8d2 t7508: add tests capturing racy timestamp handling 4: 4a6b18fb304 = 4: e31edb74e24 update-index: refresh should rewrite index in case of racy timestamps -- gitgitgadget