]> git.ipfire.org Git - thirdparty/git.git/commit - read-cache.c
mv: refresh stat info for moved entry
authorVictoria Dye <vdye@github.com>
Tue, 29 Mar 2022 01:07:07 +0000 (01:07 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 29 Mar 2022 16:45:02 +0000 (09:45 -0700)
commitb7f9130a06a9960144bb9c145e62dac792328c20
tree4761ecc408442632b16886f0d20c8e7bcf89dd3e
parent4c53a8c20f8984adb226293a3ffd7b88c3f4ac1a
mv: refresh stat info for moved entry

Update the stat info of the moved index entry in 'rename_index_entry_at()'
if the entry is up-to-date with the index. Internally, 'git mv' uses
'rename_index_entry_at()' to move the source index entry to the destination.
However, it directly copies the stat info of the original cache entry, which
will not reflect the 'ctime' of the file renaming operation that happened as
part of the move. If a file is otherwise up-to-date with the index, that
difference in 'ctime' will make the entry appear out-of-date until the next
index-refreshing operation (e.g., 'git status').

Some commands, such as 'git reset', use the cached stat information to
determine whether a file is up-to-date; if this information is incorrect,
the command will fail when it should pass. In order to ensure a moved entry
is evaluated as 'up-to-date' when appropriate, refresh the destination index
entry's stat info in 'git mv' if and only if the file is up-to-date.

Note that the test added in 't7001-mv.sh' requires a "sleep 1" to ensure the
'ctime' of the file creation will be definitively older than the 'ctime' of
the renamed file in 'git mv'.

Reported-by: Maximilian Reichel <reichemn@icloud.com>
Signed-off-by: Victoria Dye <vdye@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
read-cache.c
t/t7001-mv.sh