mirror of
https://github.com/git/git.git
synced 2024-12-12 11:24:02 +08:00
2ede073fd2
'git update-index --refresh' and '--really-refresh' should force writing of the index file if racy timestamps have been encountered, as 'git status' already does [1]. Note that calling 'git update-index --refresh' still does not guarantee that there will be no more racy timestamps afterwards (the same holds true for 'git status'): - calling 'git update-index --refresh' immediately after touching and adding a file may still leave racy timestamps if all three operations occur within the racy-tolerance (usually 1 second unless USE_NSEC has been defined) - calling 'git update-index --refresh' for timestamps which are set into the future will leave them racy To guarantee that such racy timestamps will be resolved would require to wait until the system clock has passed beyond these timestamps and only then write the index file. Especially for future timestamps, this does not seem feasible because of possibly long delays/hangs. [1] https://lore.kernel.org/git/d3dd805c-7c1d-30a9-6574-a7bfcb7fc013@syntevo.com/ Signed-off-by: Marc Strapetz <marc.strapetz@syntevo.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
65 lines
1.6 KiB
Bash
Executable File
65 lines
1.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='update-index refresh tests related to racy timestamps'
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
|
|
reset_files () {
|
|
echo content >file &&
|
|
echo content >other &&
|
|
test_set_magic_mtime file &&
|
|
test_set_magic_mtime other
|
|
}
|
|
|
|
update_assert_changed () {
|
|
test_set_magic_mtime .git/index &&
|
|
test_might_fail git update-index "$1" &&
|
|
! test_is_magic_mtime .git/index
|
|
}
|
|
|
|
test_expect_success 'setup' '
|
|
reset_files &&
|
|
# we are calling reset_files() a couple of times during tests;
|
|
# test-tool chmtime does not change the ctime; to not weaken
|
|
# or even break our tests, disable ctime-checks entirely
|
|
git config core.trustctime false &&
|
|
git add file other &&
|
|
git commit -m "initial import"
|
|
'
|
|
|
|
test_expect_success '--refresh has no racy timestamps to fix' '
|
|
reset_files &&
|
|
# set the index time far enough to the future;
|
|
# it must be at least 3 seconds for VFAT
|
|
test_set_magic_mtime .git/index +60 &&
|
|
git update-index --refresh &&
|
|
test_is_magic_mtime .git/index +60
|
|
'
|
|
|
|
test_expect_success '--refresh should fix racy timestamp' '
|
|
reset_files &&
|
|
update_assert_changed --refresh
|
|
'
|
|
|
|
test_expect_success '--really-refresh should fix racy timestamp' '
|
|
reset_files &&
|
|
update_assert_changed --really-refresh
|
|
'
|
|
|
|
test_expect_success '--refresh should fix racy timestamp if other file needs update' '
|
|
reset_files &&
|
|
echo content2 >other &&
|
|
test_set_magic_mtime other &&
|
|
update_assert_changed --refresh
|
|
'
|
|
|
|
test_expect_success '--refresh should fix racy timestamp if racy file needs update' '
|
|
reset_files &&
|
|
echo content2 >file &&
|
|
test_set_magic_mtime file &&
|
|
update_assert_changed --refresh
|
|
'
|
|
|
|
test_done
|