[PATCH v4 0/4] update-index: refresh should rewrite index in case of racy timestamps
- From
Marc Strapetz via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Jan 7, 2022, 11:17 UTC
- Message-ID
- <pull.1105.v4.git.1641554252.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.1105.v3.git.1641508499.gitgitgadget@gmail.com>
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@syntevo.com/
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