Skip to content

Commit a3ddcef

Browse files
pcloudsgitster
authored andcommitted
t7063: tests for untracked cache
Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent f64cb88 commit a3ddcef

File tree

4 files changed

+416
-0
lines changed

4 files changed

+416
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@
184184
/test-delta
185185
/test-dump-cache-tree
186186
/test-dump-split-index
187+
/test-dump-untracked-cache
187188
/test-scrap-cache-tree
188189
/test-genrandom
189190
/test-hashmap

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,7 @@ TEST_PROGRAMS_NEED_X += test-date
570570
TEST_PROGRAMS_NEED_X += test-delta
571571
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
572572
TEST_PROGRAMS_NEED_X += test-dump-split-index
573+
TEST_PROGRAMS_NEED_X += test-dump-untracked-cache
573574
TEST_PROGRAMS_NEED_X += test-genrandom
574575
TEST_PROGRAMS_NEED_X += test-hashmap
575576
TEST_PROGRAMS_NEED_X += test-index-version

t/t7063-status-untracked-cache.sh

Lines changed: 353 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,353 @@
1+
#!/bin/sh
2+
3+
test_description='test untracked cache'
4+
5+
. ./test-lib.sh
6+
7+
avoid_racy() {
8+
sleep 1
9+
}
10+
11+
git update-index --untracked-cache
12+
# It's fine if git update-index returns an error code other than one,
13+
# it'll be caught in the first test.
14+
if test $? -eq 1; then
15+
skip_all='This system does not support untracked cache'
16+
test_done
17+
fi
18+
19+
test_expect_success 'setup' '
20+
git init worktree &&
21+
cd worktree &&
22+
mkdir done dtwo dthree &&
23+
touch one two three done/one dtwo/two dthree/three &&
24+
git add one two done/one &&
25+
: >.git/info/exclude &&
26+
git update-index --untracked-cache
27+
'
28+
29+
test_expect_success 'untracked cache is empty' '
30+
test-dump-untracked-cache >../actual &&
31+
cat >../expect <<EOF &&
32+
info/exclude 0000000000000000000000000000000000000000
33+
core.excludesfile 0000000000000000000000000000000000000000
34+
exclude_per_dir .gitignore
35+
flags 00000006
36+
EOF
37+
test_cmp ../expect ../actual
38+
'
39+
40+
cat >../status.expect <<EOF &&
41+
A done/one
42+
A one
43+
A two
44+
?? dthree/
45+
?? dtwo/
46+
?? three
47+
EOF
48+
49+
cat >../dump.expect <<EOF &&
50+
info/exclude e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
51+
core.excludesfile 0000000000000000000000000000000000000000
52+
exclude_per_dir .gitignore
53+
flags 00000006
54+
/ 0000000000000000000000000000000000000000 recurse valid
55+
dthree/
56+
dtwo/
57+
three
58+
/done/ 0000000000000000000000000000000000000000 recurse valid
59+
/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid
60+
three
61+
/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid
62+
two
63+
EOF
64+
65+
test_expect_success 'status first time (empty cache)' '
66+
avoid_racy &&
67+
: >../trace &&
68+
GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \
69+
git status --porcelain >../actual &&
70+
test_cmp ../status.expect ../actual &&
71+
cat >../trace.expect <<EOF &&
72+
node creation: 3
73+
gitignore invalidation: 1
74+
directory invalidation: 0
75+
opendir: 4
76+
EOF
77+
test_cmp ../trace.expect ../trace
78+
'
79+
80+
test_expect_success 'untracked cache after first status' '
81+
test-dump-untracked-cache >../actual &&
82+
test_cmp ../dump.expect ../actual
83+
'
84+
85+
test_expect_success 'status second time (fully populated cache)' '
86+
avoid_racy &&
87+
: >../trace &&
88+
GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \
89+
git status --porcelain >../actual &&
90+
test_cmp ../status.expect ../actual &&
91+
cat >../trace.expect <<EOF &&
92+
node creation: 0
93+
gitignore invalidation: 0
94+
directory invalidation: 0
95+
opendir: 0
96+
EOF
97+
test_cmp ../trace.expect ../trace
98+
'
99+
100+
test_expect_success 'untracked cache after second status' '
101+
test-dump-untracked-cache >../actual &&
102+
test_cmp ../dump.expect ../actual
103+
'
104+
105+
test_expect_success 'modify in root directory, one dir invalidation' '
106+
avoid_racy &&
107+
: >four &&
108+
: >../trace &&
109+
GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \
110+
git status --porcelain >../actual &&
111+
cat >../status.expect <<EOF &&
112+
A done/one
113+
A one
114+
A two
115+
?? dthree/
116+
?? dtwo/
117+
?? four
118+
?? three
119+
EOF
120+
test_cmp ../status.expect ../actual &&
121+
cat >../trace.expect <<EOF &&
122+
node creation: 0
123+
gitignore invalidation: 0
124+
directory invalidation: 1
125+
opendir: 1
126+
EOF
127+
test_cmp ../trace.expect ../trace
128+
129+
'
130+
131+
test_expect_success 'verify untracked cache dump' '
132+
test-dump-untracked-cache >../actual &&
133+
cat >../expect <<EOF &&
134+
info/exclude e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
135+
core.excludesfile 0000000000000000000000000000000000000000
136+
exclude_per_dir .gitignore
137+
flags 00000006
138+
/ 0000000000000000000000000000000000000000 recurse valid
139+
dthree/
140+
dtwo/
141+
four
142+
three
143+
/done/ 0000000000000000000000000000000000000000 recurse valid
144+
/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid
145+
three
146+
/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid
147+
two
148+
EOF
149+
test_cmp ../expect ../actual
150+
'
151+
152+
test_expect_success 'new .gitignore invalidates recursively' '
153+
avoid_racy &&
154+
echo four >.gitignore &&
155+
: >../trace &&
156+
GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \
157+
git status --porcelain >../actual &&
158+
cat >../status.expect <<EOF &&
159+
A done/one
160+
A one
161+
A two
162+
?? .gitignore
163+
?? dthree/
164+
?? dtwo/
165+
?? three
166+
EOF
167+
test_cmp ../status.expect ../actual &&
168+
cat >../trace.expect <<EOF &&
169+
node creation: 0
170+
gitignore invalidation: 1
171+
directory invalidation: 1
172+
opendir: 4
173+
EOF
174+
test_cmp ../trace.expect ../trace
175+
176+
'
177+
178+
test_expect_success 'verify untracked cache dump' '
179+
test-dump-untracked-cache >../actual &&
180+
cat >../expect <<EOF &&
181+
info/exclude e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
182+
core.excludesfile 0000000000000000000000000000000000000000
183+
exclude_per_dir .gitignore
184+
flags 00000006
185+
/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid
186+
.gitignore
187+
dthree/
188+
dtwo/
189+
three
190+
/done/ 0000000000000000000000000000000000000000 recurse valid
191+
/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid
192+
three
193+
/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid
194+
two
195+
EOF
196+
test_cmp ../expect ../actual
197+
'
198+
199+
test_expect_success 'new info/exclude invalidates everything' '
200+
avoid_racy &&
201+
echo three >>.git/info/exclude &&
202+
: >../trace &&
203+
GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \
204+
git status --porcelain >../actual &&
205+
cat >../status.expect <<EOF &&
206+
A done/one
207+
A one
208+
A two
209+
?? .gitignore
210+
?? dtwo/
211+
EOF
212+
test_cmp ../status.expect ../actual &&
213+
cat >../trace.expect <<EOF &&
214+
node creation: 0
215+
gitignore invalidation: 1
216+
directory invalidation: 0
217+
opendir: 4
218+
EOF
219+
test_cmp ../trace.expect ../trace
220+
'
221+
222+
test_expect_success 'verify untracked cache dump' '
223+
test-dump-untracked-cache >../actual &&
224+
cat >../expect <<EOF &&
225+
info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0
226+
core.excludesfile 0000000000000000000000000000000000000000
227+
exclude_per_dir .gitignore
228+
flags 00000006
229+
/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid
230+
.gitignore
231+
dtwo/
232+
/done/ 0000000000000000000000000000000000000000 recurse valid
233+
/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid
234+
/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid
235+
two
236+
EOF
237+
test_cmp ../expect ../actual
238+
'
239+
240+
test_expect_success 'move two from tracked to untracked' '
241+
git rm --cached two &&
242+
test-dump-untracked-cache >../actual &&
243+
cat >../expect <<EOF &&
244+
info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0
245+
core.excludesfile 0000000000000000000000000000000000000000
246+
exclude_per_dir .gitignore
247+
flags 00000006
248+
/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse
249+
/done/ 0000000000000000000000000000000000000000 recurse valid
250+
/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid
251+
/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid
252+
two
253+
EOF
254+
test_cmp ../expect ../actual
255+
'
256+
257+
test_expect_success 'status after the move' '
258+
: >../trace &&
259+
GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \
260+
git status --porcelain >../actual &&
261+
cat >../status.expect <<EOF &&
262+
A done/one
263+
A one
264+
?? .gitignore
265+
?? dtwo/
266+
?? two
267+
EOF
268+
test_cmp ../status.expect ../actual &&
269+
cat >../trace.expect <<EOF &&
270+
node creation: 0
271+
gitignore invalidation: 0
272+
directory invalidation: 0
273+
opendir: 1
274+
EOF
275+
test_cmp ../trace.expect ../trace
276+
'
277+
278+
test_expect_success 'verify untracked cache dump' '
279+
test-dump-untracked-cache >../actual &&
280+
cat >../expect <<EOF &&
281+
info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0
282+
core.excludesfile 0000000000000000000000000000000000000000
283+
exclude_per_dir .gitignore
284+
flags 00000006
285+
/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid
286+
.gitignore
287+
dtwo/
288+
two
289+
/done/ 0000000000000000000000000000000000000000 recurse valid
290+
/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid
291+
/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid
292+
two
293+
EOF
294+
test_cmp ../expect ../actual
295+
'
296+
297+
test_expect_success 'move two from untracked to tracked' '
298+
git add two &&
299+
test-dump-untracked-cache >../actual &&
300+
cat >../expect <<EOF &&
301+
info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0
302+
core.excludesfile 0000000000000000000000000000000000000000
303+
exclude_per_dir .gitignore
304+
flags 00000006
305+
/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse
306+
/done/ 0000000000000000000000000000000000000000 recurse valid
307+
/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid
308+
/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid
309+
two
310+
EOF
311+
test_cmp ../expect ../actual
312+
'
313+
314+
test_expect_success 'status after the move' '
315+
: >../trace &&
316+
GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \
317+
git status --porcelain >../actual &&
318+
cat >../status.expect <<EOF &&
319+
A done/one
320+
A one
321+
A two
322+
?? .gitignore
323+
?? dtwo/
324+
EOF
325+
test_cmp ../status.expect ../actual &&
326+
cat >../trace.expect <<EOF &&
327+
node creation: 0
328+
gitignore invalidation: 0
329+
directory invalidation: 0
330+
opendir: 1
331+
EOF
332+
test_cmp ../trace.expect ../trace
333+
'
334+
335+
test_expect_success 'verify untracked cache dump' '
336+
test-dump-untracked-cache >../actual &&
337+
cat >../expect <<EOF &&
338+
info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0
339+
core.excludesfile 0000000000000000000000000000000000000000
340+
exclude_per_dir .gitignore
341+
flags 00000006
342+
/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid
343+
.gitignore
344+
dtwo/
345+
/done/ 0000000000000000000000000000000000000000 recurse valid
346+
/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid
347+
/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid
348+
two
349+
EOF
350+
test_cmp ../expect ../actual
351+
'
352+
353+
test_done

0 commit comments

Comments
 (0)