Skip to content

Commit 5697ca9

Browse files
pcloudsgitster
authored andcommitted
unpack-trees: add missing cache invalidation
Any changes to the output index should be (confusingly) marked in the source index with invalidate_ce_path(). This is used to make sure we still have valid untracked cache and cache-tree extensions in the end. We do a pretty good job of invalidating except in two places. verify_clean_subdirectory() is part of verify_absent() and verify_absent_sparse(). The former is usually called by merged_entry() or directly in threeway_merge(). The latter is obviously used by sparse checkout. In these three call sites, only merged_entry() follows up with invalidate_ce_path(). The other two don't, but they should not trigger this ce removal because this is about D/F conflicts [1]. But let's be safe and invalidate_ce_path() here as well. The second place is keep_entry() which is also used by threeway_merge() to keep higher stage entries. In order to reuse cache-tree we need to invalidate these paths as well. It's not a problem in the past because whenever a higher stage entry is present, cache-tree will not be created [2]. Now we salvage cache-tree even when higher stage entries are present, we need more invalidation. [1] c819353 (Fix switching to a branch with D/F when current branch has file D. - 2007-03-15) [2] This is probably too strict. We should be able to create and save cache-tree for the directories that do not have conflict entries in cache_tree_update(). And this becomes more important when cache-tree plays bigger role in terms of performance. Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 836ef2b commit 5697ca9

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

unpack-trees.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,7 @@ static int verify_clean_subdirectory(const struct cache_entry *ce,
17741774
if (verify_uptodate(ce2, o))
17751775
return -1;
17761776
add_entry(o, ce2, CE_REMOVE, 0);
1777+
invalidate_ce_path(ce, o);
17771778
mark_ce_used(ce2, o);
17781779
}
17791780
cnt++;
@@ -2033,6 +2034,8 @@ static int keep_entry(const struct cache_entry *ce,
20332034
struct unpack_trees_options *o)
20342035
{
20352036
add_entry(o, ce, 0, 0);
2037+
if (ce_stage(ce))
2038+
invalidate_ce_path(ce, o);
20362039
return 1;
20372040
}
20382041

0 commit comments

Comments
 (0)