cache-tree tests: explicitly test HEAD and index differences
authorÆvar Arnfjörð Bjarmason <redacted>
Sat, 23 Jan 2021 13:00:40 +0000 (14:00 +0100)
committerJunio C Hamano <redacted>
Sat, 23 Jan 2021 21:25:12 +0000 (13:25 -0800)
commitef839700591743685159a0794d76a444a9070bc2
treecc9e51a7d1ade94754d845f2964680b68ca908db
parentfa6edee7765028daa8c69051b404c8374d0c2a04
cache-tree tests: explicitly test HEAD and index differences

The test code added in 9c4d6c0297 (cache-tree: Write updated
cache-tree after commit, 2014-07-13) used "ls-files" in lieu of
"ls-tree" because it wanted to test the data in the index, since this
test is testing the cache-tree extension.

Change the test to instead use "ls-tree" for traversal, and then
explicitly check how HEAD differs from the index. This is more easily
understood, and less fragile as numerous past bug fixes[1][2][3] to
the old code we're replacing demonstrate.

As an aside this would be a bit easier if empty pathspecs hadn't been
made an error in d426430e6e (pathspec: warn on empty strings as
pathspec, 2016-06-22) and 9e4e8a64c2 (pathspec: die on empty strings
as pathspec, 2017-06-06).

If that was still allowed this code could be simplified slightly:

diff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh
index 9bf66c9e68..0b02881f55 100755
--- a/t/t0090-cache-tree.sh
+++ b/t/t0090-cache-tree.sh
@@ -18,19 +18,18 @@ cmp_cache_tree () {
 # test-tool dump-cache-tree already verifies that all existing data is
 # correct.
 generate_expected_cache_tree () {
-       pathspec="$1" &&
-       dir="$2${2:+/}" &&
+       pathspec="$1${1:+/}" &&
        git ls-tree --name-only HEAD -- "$pathspec" >files &&
        git ls-tree --name-only -d HEAD -- "$pathspec" >subtrees &&
-       printf "SHA %s (%d entries, %d subtrees)\n" "$dir" $(wc -l <files) $(wc -l <subtrees) &&
+       printf "SHA %s (%d entries, %d subtrees)\n" "$pathspec" $(wc -l <files) $(wc -l <subtrees) &&
        while read subtree
        do
-               generate_expected_cache_tree "$pathspec/$subtree/" "$subtree" || return 1
+               generate_expected_cache_tree "$subtree" || return 1
        done <subtrees
 }

 test_cache_tree () {
-       generate_expected_cache_tree "." >expect &&
+       generate_expected_cache_tree >expect &&
        cmp_cache_tree expect &&
        rm expect actual files subtrees &&
        git status --porcelain -- ':!status' ':!expected.status' >status &&

1. c8db708d5d (t0090: avoid passing empty string to printf %d,
   2014-09-30)
2. d69360c6b1 (t0090: tweak awk statement for Solaris
   /usr/xpg4/bin/awk, 2014-12-22)
3. 9b5a9fa60a (t0090: stop losing return codes of git commands,
   2019-11-27)

Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
Signed-off-by: Junio C Hamano <redacted>
t/t0090-cache-tree.sh
git clone https://git.99rst.org/PROJECT