]>
Commit | Line | Data |
---|---|---|
4eb0346f TR |
1 | #!/bin/sh |
2 | ||
3 | test_description="Test whether cache-tree is properly updated | |
4 | ||
5 | Tests whether various commands properly update and/or rewrite the | |
6 | cache-tree extension. | |
7 | " | |
8 | . ./test-lib.sh | |
9 | ||
10 | cmp_cache_tree () { | |
9c4d6c02 | 11 | test-dump-cache-tree | sed -e '/#(ref)/d' >actual && |
4eb0346f TR |
12 | sed "s/$_x40/SHA/" <actual >filtered && |
13 | test_cmp "$1" filtered | |
14 | } | |
15 | ||
16 | # We don't bother with actually checking the SHA1: | |
17 | # test-dump-cache-tree already verifies that all existing data is | |
18 | # correct. | |
9c4d6c02 DT |
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) && | |
d69360c6 | 25 | subtree_count=$(echo "$subtrees"|awk -v c=0 '$1 != "" {++c} END {print c}') && |
9c4d6c02 DT |
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 && | |
4eb0346f TR |
45 | cmp_cache_tree expect |
46 | } | |
47 | ||
48 | test_invalid_cache_tree () { | |
59a8adb6 | 49 | printf "invalid %s ()\n" "" "$@" >expect && |
9c4d6c02 | 50 | test-dump-cache-tree | |
59a8adb6 DT |
51 | sed -n -e "s/[0-9]* subtrees//" -e '/#(ref)/d' -e '/^invalid /p' >actual && |
52 | test_cmp expect actual | |
4eb0346f TR |
53 | } |
54 | ||
55 | test_no_cache_tree () { | |
56 | : >expect && | |
57 | cmp_cache_tree expect | |
58 | } | |
59 | ||
9c4d6c02 | 60 | test_expect_success 'initial commit has cache-tree' ' |
4eb0346f | 61 | test_commit foo && |
9c4d6c02 | 62 | test_cache_tree |
4eb0346f TR |
63 | ' |
64 | ||
65 | test_expect_success 'read-tree HEAD establishes cache-tree' ' | |
66 | git read-tree HEAD && | |
9c4d6c02 | 67 | test_cache_tree |
4eb0346f TR |
68 | ' |
69 | ||
70 | test_expect_success 'git-add invalidates cache-tree' ' | |
71 | test_when_finished "git reset --hard; git read-tree HEAD" && | |
aecf567c | 72 | echo "I changed this file" >foo && |
4eb0346f TR |
73 | git add foo && |
74 | test_invalid_cache_tree | |
75 | ' | |
76 | ||
59a8adb6 DT |
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 | ||
9c4d6c02 DT |
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 | ||
59a8adb6 DT |
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 && | |
9c4d6c02 DT |
104 | cmp_cache_tree before && |
105 | echo "I changed this file" >dir1/a && | |
59a8adb6 | 106 | git add dir1/a && |
9c4d6c02 | 107 | cmp_cache_tree expect |
59a8adb6 DT |
108 | ' |
109 | ||
4eb0346f TR |
110 | test_expect_success 'update-index invalidates cache-tree' ' |
111 | test_when_finished "git reset --hard; git read-tree HEAD" && | |
aecf567c | 112 | echo "I changed this file" >foo && |
4eb0346f TR |
113 | git update-index --add foo && |
114 | test_invalid_cache_tree | |
115 | ' | |
116 | ||
117 | test_expect_success 'write-tree establishes cache-tree' ' | |
118 | test-scrap-cache-tree && | |
119 | git write-tree && | |
9c4d6c02 | 120 | test_cache_tree |
4eb0346f TR |
121 | ' |
122 | ||
123 | test_expect_success 'test-scrap-cache-tree works' ' | |
124 | git read-tree HEAD && | |
125 | test-scrap-cache-tree && | |
126 | test_no_cache_tree | |
127 | ' | |
128 | ||
11c8a74a | 129 | test_expect_success 'second commit has cache-tree' ' |
4eb0346f | 130 | test_commit bar && |
9c4d6c02 DT |
131 | test_cache_tree |
132 | ' | |
133 | ||
5a97639b | 134 | test_expect_success PERL 'commit --interactive gives cache-tree on partial commit' ' |
9c4d6c02 DT |
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 | |
4eb0346f TR |
170 | ' |
171 | ||
6c52ec8a | 172 | test_expect_success 'reset --hard gives cache-tree' ' |
4eb0346f TR |
173 | test-scrap-cache-tree && |
174 | git reset --hard && | |
9c4d6c02 | 175 | test_cache_tree |
4eb0346f TR |
176 | ' |
177 | ||
6c52ec8a | 178 | test_expect_success 'reset --hard without index gives cache-tree' ' |
4eb0346f TR |
179 | rm -f .git/index && |
180 | git reset --hard && | |
9c4d6c02 | 181 | test_cache_tree |
4eb0346f TR |
182 | ' |
183 | ||
aecf567c DT |
184 | test_expect_success 'checkout gives cache-tree' ' |
185 | git tag current && | |
4eb0346f | 186 | git checkout HEAD^ && |
9c4d6c02 | 187 | test_cache_tree |
4eb0346f TR |
188 | ' |
189 | ||
aecf567c DT |
190 | test_expect_success 'checkout -b gives cache-tree' ' |
191 | git checkout current && | |
192 | git checkout -b prev HEAD^ && | |
9c4d6c02 | 193 | test_cache_tree |
aecf567c DT |
194 | ' |
195 | ||
196 | test_expect_success 'checkout -B gives cache-tree' ' | |
197 | git checkout current && | |
198 | git checkout -B prev HEAD^ && | |
9c4d6c02 DT |
199 | test_cache_tree |
200 | ' | |
201 | ||
52fca218 BD |
202 | test_expect_success 'merge --ff-only maintains cache-tree' ' |
203 | git checkout current && | |
204 | git checkout -b changes && | |
205 | test_commit llamas && | |
206 | test_commit pachyderm && | |
207 | test_cache_tree && | |
208 | git checkout current && | |
209 | test_cache_tree && | |
210 | git merge --ff-only changes && | |
211 | test_cache_tree | |
212 | ' | |
213 | ||
214 | test_expect_success 'merge maintains cache-tree' ' | |
215 | git checkout current && | |
216 | git checkout -b changes2 && | |
217 | test_commit alpacas && | |
218 | test_cache_tree && | |
219 | git checkout current && | |
220 | test_commit struthio && | |
221 | test_cache_tree && | |
222 | git merge changes2 && | |
223 | test_cache_tree | |
224 | ' | |
225 | ||
9c4d6c02 DT |
226 | test_expect_success 'partial commit gives cache-tree' ' |
227 | git checkout -b partial no-children && | |
228 | test_commit one && | |
229 | test_commit two && | |
230 | echo "some change" >one.t && | |
231 | git add one.t && | |
232 | echo "some other change" >two.t && | |
233 | git commit two.t -m partial && | |
234 | test_cache_tree | |
aecf567c DT |
235 | ' |
236 | ||
4ed115e9 JH |
237 | test_expect_success 'no phantom error when switching trees' ' |
238 | mkdir newdir && | |
239 | >newdir/one && | |
240 | git add newdir/one && | |
241 | git checkout 2>errors && | |
242 | ! test -s errors | |
243 | ' | |
244 | ||
475a3445 DT |
245 | test_expect_success 'switching trees does not invalidate shared index' ' |
246 | git update-index --split-index && | |
247 | >split && | |
248 | git add split && | |
249 | test-dump-split-index .git/index | grep -v ^own >before && | |
250 | git commit -m "as-is" && | |
251 | test-dump-split-index .git/index | grep -v ^own >after && | |
252 | test_cmp before after | |
253 | ' | |
254 | ||
4eb0346f | 255 | test_done |