Re: git status: small difference between stating whole repository and small subdirectory
From: Thomas Rast <hidden>
Date: 2016-06-15 22:53:06
Jeff King [off-list ref] writes:
quoted hunk
diff --git a/unpack-trees.c b/unpack-trees.c index 8be3f6c..e8aedea 100644 --- a/unpack-trees.c +++ b/unpack-trees.c@@ -1135,6 +1135,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options } } + o->result.cache_tree = o->src_index->cache_tree; o->src_index = NULL; ret = check_updates(o) ? (-2) : 0; if (o->dst_index)
Brilliant. I know I'm stealing Junio's punchline, but please make it so :-) Browsing around in history, it seems that this was silently broken by 34110cd (Make 'unpack_trees()' have a separate source and destination index, 2008-03-06), which introduced the distinction between source and destination index. Before that they were the same, so the cache tree would have been updated correctly.
It makes "git checkout" with no changes just work (since we preserve the cache tree, and it doesn't need updated). It makes something like "git checkout HEAD^" work, keeping most of the cache-tree intact, but invalidating trees containing paths that were modified.
Great. Here's a test you could use. It's a bit noisy because the shallow in test_shallow_cache_tree no longer made any sense, but I think it tests what we want to see.
diff --git i/t/t0090-cache-tree.sh w/t/t0090-cache-tree.sh
index 6c33e28..5706305 100755
--- i/t/t0090-cache-tree.sh
+++ w/t/t0090-cache-tree.sh@@ -16,14 +16,16 @@ cmp_cache_tree () { # We don't bother with actually checking the SHA1: # test-dump-cache-tree already verifies that all existing data is # correct. -test_shallow_cache_tree () { - printf "SHA (%d entries, 0 subtrees)\n" $(git ls-files|wc -l) >expect && +test_cache_tree () { + printf "SHA (%d entries, 1 subtrees)\n" $(git ls-files|wc -l) >expect && + printf "SHA sub/ (%d entries, 0 subtrees)\n" $(git ls-files sub|wc -l) >>expect && cmp_cache_tree expect } test_invalid_cache_tree () { - echo "invalid (0 subtrees)" >expect && - printf "SHA #(ref) (%d entries, 0 subtrees)\n" $(git ls-files|wc -l) >>expect && + echo "invalid (1 subtrees)" >expect && + printf "SHA #(ref) (%d entries, 1 subtrees)\n" $(git ls-files|wc -l) >>expect && + printf "SHA sub/ (%d entries, 0 subtrees)\n" $(git ls-files sub|wc -l) >>expect && cmp_cache_tree expect }
@@ -33,13 +35,16 @@ test_no_cache_tree () { } test_expect_failure 'initial commit has cache-tree' ' + mkdir sub && + echo bar > sub/bar && + git add sub/bar && test_commit foo && - test_shallow_cache_tree + test_cache_tree ' test_expect_success 'read-tree HEAD establishes cache-tree' ' git read-tree HEAD && - test_shallow_cache_tree + test_cache_tree ' test_expect_success 'git-add invalidates cache-tree' '
@@ -59,7 +64,7 @@ test_expect_success 'update-index invalidates cache-tree' ' test_expect_success 'write-tree establishes cache-tree' ' test-scrap-cache-tree && git write-tree && - test_shallow_cache_tree + test_cache_tree ' test_expect_success 'test-scrap-cache-tree works' '
@@ -70,24 +75,39 @@ test_expect_success 'test-scrap-cache-tree works' ' test_expect_success 'second commit has cache-tree' ' test_commit bar && - test_shallow_cache_tree + test_cache_tree ' test_expect_success 'reset --hard gives cache-tree' ' test-scrap-cache-tree && git reset --hard && - test_shallow_cache_tree + test_cache_tree ' test_expect_success 'reset --hard without index gives cache-tree' ' rm -f .git/index && git reset --hard && - test_shallow_cache_tree + test_cache_tree ' -test_expect_failure 'checkout gives cache-tree' ' +test_expect_success 'checkout HEAD leaves cache-tree intact' ' + git read-tree HEAD && + git checkout HEAD && + test_cache_tree +' + +# NEEDSWORK: only one of these two can succeed. The second is there +# because it would be the better result. +test_expect_success 'checkout HEAD^ correctly invalidates cache-tree' ' + git checkout HEAD^ && + test_invalid_cache_tree +' + +test_expect_failure 'checkout HEAD^ gives full cache-tree' ' + git checkout master && + git read-tree HEAD && git checkout HEAD^ && - test_shallow_cache_tree + test_cache_tree ' test_done
--
Thomas Rast
trast@{inf,student}.ethz.ch