diff options
author | Junio C Hamano <gitster@pobox.com> | 2022-04-04 20:56:24 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-04-04 20:56:24 +0300 |
commit | 909d5b646e9bb49c9c242c82d68e29c451988541 (patch) | |
tree | 8e1a0cb2957d75a2bf09ffe5b454acdcb0ba0ff7 /read-cache.c | |
parent | 439c1e6d5d8ad4d1134fc6ff5e514d28ff9ecac4 (diff) | |
parent | b7f9130a06a9960144bb9c145e62dac792328c20 (diff) |
Merge branch 'vd/mv-refresh-stat'
"git mv" failed to refresh the cached stat information for the
entry it moved.
* vd/mv-refresh-stat:
mv: refresh stat info for moved entry
Diffstat (limited to 'read-cache.c')
-rw-r--r-- | read-cache.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/read-cache.c b/read-cache.c index 3e0e7d4183..4df97e185e 100644 --- a/read-cache.c +++ b/read-cache.c @@ -134,7 +134,7 @@ static void replace_index_entry(struct index_state *istate, int nr, struct cache void rename_index_entry_at(struct index_state *istate, int nr, const char *new_name) { - struct cache_entry *old_entry = istate->cache[nr], *new_entry; + struct cache_entry *old_entry = istate->cache[nr], *new_entry, *refreshed; int namelen = strlen(new_name); new_entry = make_empty_cache_entry(istate, namelen); @@ -147,7 +147,20 @@ void rename_index_entry_at(struct index_state *istate, int nr, const char *new_n cache_tree_invalidate_path(istate, old_entry->name); untracked_cache_remove_from_index(istate, old_entry->name); remove_index_entry_at(istate, nr); - add_index_entry(istate, new_entry, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); + + /* + * Refresh the new index entry. Using 'refresh_cache_entry' ensures + * we only update stat info if the entry is otherwise up-to-date (i.e., + * the contents/mode haven't changed). This ensures that we reflect the + * 'ctime' of the rename in the index without (incorrectly) updating + * the cached stat info to reflect unstaged changes on disk. + */ + refreshed = refresh_cache_entry(istate, new_entry, CE_MATCH_REFRESH); + if (refreshed && refreshed != new_entry) { + add_index_entry(istate, refreshed, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); + discard_cache_entry(new_entry); + } else + add_index_entry(istate, new_entry, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); } void fill_stat_data(struct stat_data *sd, struct stat *st) |