@@ -8,58 +8,116 @@ 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 () {
25- echo " invalid (0 subtrees)" > expect &&
26- printf " SHA #(ref) (%d entries, 0 subtrees)\n" $( git ls-files| wc -l) >> expect &&
27- cmp_cache_tree expect
49+ printf " invalid %s ()\n" " " " $@ " > expect &&
50+ test-dump-cache-tree |
51+ sed -n -e " s/[0-9]* subtrees//" -e ' /#(ref)/d' -e ' /^invalid /p' > actual &&
52+ test_cmp expect actual
2853}
2954
3055test_no_cache_tree () {
3156 : > expect &&
3257 cmp_cache_tree expect
3358}
3459
35- test_expect_failure ' initial commit has cache-tree' '
60+ test_expect_success ' initial commit has cache-tree' '
3661 test_commit foo &&
37- test_shallow_cache_tree
62+ test_cache_tree
3863'
3964
4065test_expect_success ' read-tree HEAD establishes cache-tree' '
4166 git read-tree HEAD &&
42- test_shallow_cache_tree
67+ test_cache_tree
4368'
4469
4570test_expect_success ' git-add invalidates cache-tree' '
4671 test_when_finished "git reset --hard; git read-tree HEAD" &&
47- echo "I changed this file" > foo &&
72+ echo "I changed this file" >foo &&
4873 git add foo &&
4974 test_invalid_cache_tree
5075'
5176
77+ test_expect_success ' git-add in subdir invalidates cache-tree' '
78+ test_when_finished "git reset --hard; git read-tree HEAD" &&
79+ mkdir dirx &&
80+ echo "I changed this file" >dirx/foo &&
81+ git add dirx/foo &&
82+ test_invalid_cache_tree
83+ '
84+
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+
97+ test_expect_success ' git-add in subdir does not invalidate sibling cache-tree' '
98+ git tag no-children &&
99+ test_when_finished "git reset --hard no-children; git read-tree HEAD" &&
100+ mkdir dir1 dir2 &&
101+ test_commit dir1/a &&
102+ test_commit dir2/b &&
103+ echo "I changed this file" >dir1/a &&
104+ cmp_cache_tree before &&
105+ echo "I changed this file" >dir1/a &&
106+ git add dir1/a &&
107+ cmp_cache_tree expect
108+ '
109+
52110test_expect_success ' update-index invalidates cache-tree' '
53111 test_when_finished "git reset --hard; git read-tree HEAD" &&
54- echo "I changed this file" > foo &&
112+ echo "I changed this file" >foo &&
55113 git update-index --add foo &&
56114 test_invalid_cache_tree
57115'
58116
59117test_expect_success ' write-tree establishes cache-tree' '
60118 test-scrap-cache-tree &&
61119 git write-tree &&
62- test_shallow_cache_tree
120+ test_cache_tree
63121'
64122
65123test_expect_success ' test-scrap-cache-tree works' '
@@ -70,24 +128,94 @@ test_expect_success 'test-scrap-cache-tree works' '
70128
71129test_expect_success ' second commit has cache-tree' '
72130 test_commit bar &&
73- 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
74170'
75171
76172test_expect_success ' reset --hard gives cache-tree' '
77173 test-scrap-cache-tree &&
78174 git reset --hard &&
79- test_shallow_cache_tree
175+ test_cache_tree
80176'
81177
82178test_expect_success ' reset --hard without index gives cache-tree' '
83179 rm -f .git/index &&
84180 git reset --hard &&
85- test_shallow_cache_tree
181+ test_cache_tree
86182'
87183
88- test_expect_failure ' checkout gives cache-tree' '
184+ test_expect_success ' checkout gives cache-tree' '
185+ git tag current &&
89186 git checkout HEAD^ &&
90- test_shallow_cache_tree
187+ test_cache_tree
188+ '
189+
190+ test_expect_success ' checkout -b gives cache-tree' '
191+ git checkout current &&
192+ git checkout -b prev HEAD^ &&
193+ test_cache_tree
194+ '
195+
196+ test_expect_success ' checkout -B gives cache-tree' '
197+ git checkout current &&
198+ git checkout -B prev HEAD^ &&
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
211+ '
212+
213+ test_expect_success ' no phantom error when switching trees' '
214+ mkdir newdir &&
215+ >newdir/one &&
216+ git add newdir/one &&
217+ git checkout 2>errors &&
218+ ! test -s errors
91219'
92220
93221test_done
0 commit comments