cache_tree_fully_valid() is supposed to return 0 (not valid) when a tree object is missing from the object database. The condition currently returns 0 when odb_has_object() succeeds, which is the opposite of what is intended: the cache tree should be considered invalid when the object does not exist.
Add the missing negation so the function correctly invalidates cache tree nodes whose objects are absent.
Signed-off-by: David Lin <davidlin@stripe.com> --- cache-tree.c | 2 +- t/t0090-cache-tree.sh | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-)
Show changes to 2 files +9 −1
cache-tree.c, t/t0090-cache-tree.sh
diff --git a/cache-tree.c b/cache-tree.c index 60bcc07c3b..9fe057355c 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -238,7 +238,7 @@ int cache_tree_fully_valid(struct cache_tree *it) if (!it) return 0; if (it->entry_count < 0 || - odb_has_object(the_repository->objects, &it->oid, + !odb_has_object(the_repository->objects, &it->oid, HAS_OBJECT_RECHECK_PACKED | HAS_OBJECT_FETCH_PROMISOR)) return 0; for (i = 0; i < it->subtree_nr; i++) { diff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh index d901588294..2c6b7a0899 100755 --- a/t/t0090-cache-tree.sh +++ b/t/t0090-cache-tree.sh @@ -278,4 +278,12 @@ test_expect_success 'switching trees does not invalidate shared index' ' ) ' +test_expect_success 'cache-tree is used by write-tree when valid' ' + test_commit use-valid && + + # write-tree with a valid cache-tree should skip cache_tree_update + GIT_TRACE2_PERF="$(pwd)/trace.output" git write-tree && + ! grep region_enter.*cache_tree.*update trace.output +' + test_done base-commit: 2855562ca6a9c6b0e7bc780b050c1e83c9fcfbd0
-- 2.52.0.ge17bebe515.stripe