@@ -8,22 +8,46 @@ cache-tree extension.
88 . ./test-lib.sh
99
1010cmp_cache_tree () {
11- test-dump-cache-tree > actual &&
11+ test-dump-cache-tree | sed -e ' /#(ref)/d ' > actual &&
1212 sed " s/$_x40 /SHA/" < actual > filtered &&
1313 test_cmp " $1 " filtered
1414}
1515
1616# We don't bother with actually checking the SHA1:
1717# test-dump-cache-tree already verifies that all existing data is
1818# correct.
19- test_shallow_cache_tree () {
20- printf " SHA (%d entries, 0 subtrees)\n" $( git ls-files| wc -l) > expect &&
19+ generate_expected_cache_tree_rec () {
20+ dir=" $1 ${1: +/ } " &&
21+ parent=" $2 " &&
22+ # ls-files might have foo/bar, foo/bar/baz, and foo/bar/quux
23+ # We want to count only foo because it's the only direct child
24+ subtrees=$( git ls-files| grep /| cut -d / -f 1| uniq) &&
25+ subtree_count=$( echo " $subtrees " | awk ' $1 {++c} END {print c}' ) &&
26+ entries=$( git ls-files| wc -l) &&
27+ printf " SHA $dir (%d entries, %d subtrees)\n" " $entries " " $subtree_count " &&
28+ for subtree in $subtrees
29+ do
30+ cd " $subtree "
31+ generate_expected_cache_tree_rec " $dir$subtree " " $dir " || return 1
32+ cd ..
33+ done &&
34+ dir=$parent
35+ }
36+
37+ generate_expected_cache_tree () {
38+ (
39+ generate_expected_cache_tree_rec
40+ )
41+ }
42+
43+ test_cache_tree () {
44+ generate_expected_cache_tree > expect &&
2145 cmp_cache_tree expect
2246}
2347
2448test_invalid_cache_tree () {
2549 printf " invalid %s ()\n" " " " $@ " > expect &&
26- test-dump-cache-tree | \
50+ test-dump-cache-tree |
2751 sed -n -e " s/[0-9]* subtrees//" -e ' /#(ref)/d' -e ' /^invalid /p' > actual &&
2852 test_cmp expect actual
2953}
@@ -33,14 +57,14 @@ test_no_cache_tree () {
3357 cmp_cache_tree expect
3458}
3559
36- test_expect_failure ' initial commit has cache-tree' '
60+ test_expect_success ' initial commit has cache-tree' '
3761 test_commit foo &&
38- test_shallow_cache_tree
62+ test_cache_tree
3963'
4064
4165test_expect_success ' read-tree HEAD establishes cache-tree' '
4266 git read-tree HEAD &&
43- test_shallow_cache_tree
67+ test_cache_tree
4468'
4569
4670test_expect_success ' git-add invalidates cache-tree' '
@@ -58,15 +82,29 @@ test_expect_success 'git-add in subdir invalidates cache-tree' '
5882 test_invalid_cache_tree
5983'
6084
85+ cat > before << \EOF
86+ SHA (3 entries, 2 subtrees)
87+ SHA dir1/ (1 entries, 0 subtrees)
88+ SHA dir2/ (1 entries, 0 subtrees)
89+ EOF
90+
91+ cat > expect << \EOF
92+ invalid (2 subtrees)
93+ invalid dir1/ (0 subtrees)
94+ SHA dir2/ (1 entries, 0 subtrees)
95+ EOF
96+
6197test_expect_success ' git-add in subdir does not invalidate sibling cache-tree' '
6298 git tag no-children &&
6399 test_when_finished "git reset --hard no-children; git read-tree HEAD" &&
64100 mkdir dir1 dir2 &&
65101 test_commit dir1/a &&
66102 test_commit dir2/b &&
67103 echo "I changed this file" >dir1/a &&
104+ cmp_cache_tree before &&
105+ echo "I changed this file" >dir1/a &&
68106 git add dir1/a &&
69- test_invalid_cache_tree dir1/
107+ cmp_cache_tree expect
70108'
71109
72110test_expect_success ' update-index invalidates cache-tree' '
@@ -79,7 +117,7 @@ test_expect_success 'update-index invalidates cache-tree' '
79117test_expect_success ' write-tree establishes cache-tree' '
80118 test-scrap-cache-tree &&
81119 git write-tree &&
82- test_shallow_cache_tree
120+ test_cache_tree
83121'
84122
85123test_expect_success ' test-scrap-cache-tree works' '
@@ -90,37 +128,86 @@ test_expect_success 'test-scrap-cache-tree works' '
90128
91129test_expect_success ' second commit has cache-tree' '
92130 test_commit bar &&
93- test_shallow_cache_tree
131+ test_cache_tree
132+ '
133+
134+ test_expect_success ' commit --interactive gives cache-tree on partial commit' '
135+ cat <<-\EOT >foo.c &&
136+ int foo()
137+ {
138+ return 42;
139+ }
140+ int bar()
141+ {
142+ return 42;
143+ }
144+ EOT
145+ git add foo.c &&
146+ test_invalid_cache_tree &&
147+ git commit -m "add a file" &&
148+ test_cache_tree &&
149+ cat <<-\EOT >foo.c &&
150+ int foo()
151+ {
152+ return 43;
153+ }
154+ int bar()
155+ {
156+ return 44;
157+ }
158+ EOT
159+ (echo p; echo 1; echo; echo s; echo n; echo y; echo q) |
160+ git commit --interactive -m foo &&
161+ test_cache_tree
162+ '
163+
164+ test_expect_success ' commit in child dir has cache-tree' '
165+ mkdir dir &&
166+ >dir/child.t &&
167+ git add dir/child.t &&
168+ git commit -m dir/child.t &&
169+ test_cache_tree
94170'
95171
96172test_expect_success ' reset --hard gives cache-tree' '
97173 test-scrap-cache-tree &&
98174 git reset --hard &&
99- test_shallow_cache_tree
175+ test_cache_tree
100176'
101177
102178test_expect_success ' reset --hard without index gives cache-tree' '
103179 rm -f .git/index &&
104180 git reset --hard &&
105- test_shallow_cache_tree
181+ test_cache_tree
106182'
107183
108184test_expect_success ' checkout gives cache-tree' '
109185 git tag current &&
110186 git checkout HEAD^ &&
111- test_shallow_cache_tree
187+ test_cache_tree
112188'
113189
114190test_expect_success ' checkout -b gives cache-tree' '
115191 git checkout current &&
116192 git checkout -b prev HEAD^ &&
117- test_shallow_cache_tree
193+ test_cache_tree
118194'
119195
120196test_expect_success ' checkout -B gives cache-tree' '
121197 git checkout current &&
122198 git checkout -B prev HEAD^ &&
123- test_shallow_cache_tree
199+ test_cache_tree
200+ '
201+
202+ test_expect_success ' partial commit gives cache-tree' '
203+ git checkout -b partial no-children &&
204+ test_commit one &&
205+ test_commit two &&
206+ echo "some change" >one.t &&
207+ git add one.t &&
208+ echo "some other change" >two.t &&
209+ git commit two.t -m partial &&
210+ test_cache_tree
124211'
125212
126213test_done
0 commit comments