Merge branch 'tf/prompt-preserve-exit-status'
[git] / t / t7300-clean.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Michael Spang
4 #
5
6 test_description='git clean basic tests'
7
8 . ./test-lib.sh
9
10 git config clean.requireForce no
11
12 test_expect_success 'setup' '
13
14         mkdir -p src &&
15         touch src/part1.c Makefile &&
16         echo build >.gitignore &&
17         echo \*.o >>.gitignore &&
18         git add . &&
19         git commit -m setup &&
20         touch src/part2.c README &&
21         git add .
22
23 '
24
25 test_expect_success 'git clean with skip-worktree .gitignore' '
26         git update-index --skip-worktree .gitignore &&
27         rm .gitignore &&
28         mkdir -p build docs &&
29         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
30         git clean &&
31         test -f Makefile &&
32         test -f README &&
33         test -f src/part1.c &&
34         test -f src/part2.c &&
35         test ! -f a.out &&
36         test ! -f src/part3.c &&
37         test -f docs/manual.txt &&
38         test -f obj.o &&
39         test -f build/lib.so &&
40         git update-index --no-skip-worktree .gitignore &&
41         git checkout .gitignore
42 '
43
44 test_expect_success 'git clean' '
45
46         mkdir -p build docs &&
47         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
48         git clean &&
49         test -f Makefile &&
50         test -f README &&
51         test -f src/part1.c &&
52         test -f src/part2.c &&
53         test ! -f a.out &&
54         test ! -f src/part3.c &&
55         test -f docs/manual.txt &&
56         test -f obj.o &&
57         test -f build/lib.so
58
59 '
60
61 test_expect_success 'git clean src/' '
62
63         mkdir -p build docs &&
64         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
65         git clean src/ &&
66         test -f Makefile &&
67         test -f README &&
68         test -f src/part1.c &&
69         test -f src/part2.c &&
70         test -f a.out &&
71         test ! -f src/part3.c &&
72         test -f docs/manual.txt &&
73         test -f obj.o &&
74         test -f build/lib.so
75
76 '
77
78 test_expect_success 'git clean src/ src/' '
79
80         mkdir -p build docs &&
81         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
82         git clean src/ src/ &&
83         test -f Makefile &&
84         test -f README &&
85         test -f src/part1.c &&
86         test -f src/part2.c &&
87         test -f a.out &&
88         test ! -f src/part3.c &&
89         test -f docs/manual.txt &&
90         test -f obj.o &&
91         test -f build/lib.so
92
93 '
94
95 test_expect_success 'git clean with prefix' '
96
97         mkdir -p build docs src/test &&
98         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so src/test/1.c &&
99         (cd src/ && git clean) &&
100         test -f Makefile &&
101         test -f README &&
102         test -f src/part1.c &&
103         test -f src/part2.c &&
104         test -f a.out &&
105         test ! -f src/part3.c &&
106         test -f src/test/1.c &&
107         test -f docs/manual.txt &&
108         test -f obj.o &&
109         test -f build/lib.so
110
111 '
112
113 test_expect_success C_LOCALE_OUTPUT 'git clean with relative prefix' '
114
115         mkdir -p build docs &&
116         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
117         would_clean=$(
118                 cd docs &&
119                 git clean -n ../src |
120                 sed -n -e "s|^Would remove ||p"
121         ) &&
122         test "$would_clean" = ../src/part3.c || {
123                 echo "OOps <$would_clean>"
124                 false
125         }
126 '
127
128 test_expect_success C_LOCALE_OUTPUT 'git clean with absolute path' '
129
130         mkdir -p build docs &&
131         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
132         would_clean=$(
133                 cd docs &&
134                 git clean -n "$(pwd)/../src" |
135                 sed -n -e "s|^Would remove ||p"
136         ) &&
137         test "$would_clean" = ../src/part3.c || {
138                 echo "OOps <$would_clean>"
139                 false
140         }
141 '
142
143 test_expect_success 'git clean with out of work tree relative path' '
144
145         mkdir -p build docs &&
146         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
147         (
148                 cd docs &&
149                 test_must_fail git clean -n ../..
150         )
151 '
152
153 test_expect_success 'git clean with out of work tree absolute path' '
154
155         mkdir -p build docs &&
156         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
157         dd=$(cd .. && pwd) &&
158         (
159                 cd docs &&
160                 test_must_fail git clean -n $dd
161         )
162 '
163
164 test_expect_success 'git clean -d with prefix and path' '
165
166         mkdir -p build docs src/feature &&
167         touch a.out src/part3.c src/feature/file.c docs/manual.txt obj.o build/lib.so &&
168         (cd src/ && git clean -d feature/) &&
169         test -f Makefile &&
170         test -f README &&
171         test -f src/part1.c &&
172         test -f src/part2.c &&
173         test -f a.out &&
174         test -f src/part3.c &&
175         test ! -f src/feature/file.c &&
176         test -f docs/manual.txt &&
177         test -f obj.o &&
178         test -f build/lib.so
179
180 '
181
182 test_expect_success SYMLINKS 'git clean symbolic link' '
183
184         mkdir -p build docs &&
185         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
186         ln -s docs/manual.txt src/part4.c &&
187         git clean &&
188         test -f Makefile &&
189         test -f README &&
190         test -f src/part1.c &&
191         test -f src/part2.c &&
192         test ! -f a.out &&
193         test ! -f src/part3.c &&
194         test ! -f src/part4.c &&
195         test -f docs/manual.txt &&
196         test -f obj.o &&
197         test -f build/lib.so
198
199 '
200
201 test_expect_success 'git clean with wildcard' '
202
203         touch a.clean b.clean other.c &&
204         git clean "*.clean" &&
205         test -f Makefile &&
206         test -f README &&
207         test -f src/part1.c &&
208         test -f src/part2.c &&
209         test ! -f a.clean &&
210         test ! -f b.clean &&
211         test -f other.c
212
213 '
214
215 test_expect_success 'git clean -n' '
216
217         mkdir -p build docs &&
218         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
219         git clean -n &&
220         test -f Makefile &&
221         test -f README &&
222         test -f src/part1.c &&
223         test -f src/part2.c &&
224         test -f a.out &&
225         test -f src/part3.c &&
226         test -f docs/manual.txt &&
227         test -f obj.o &&
228         test -f build/lib.so
229
230 '
231
232 test_expect_success 'git clean -d' '
233
234         mkdir -p build docs &&
235         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
236         git clean -d &&
237         test -f Makefile &&
238         test -f README &&
239         test -f src/part1.c &&
240         test -f src/part2.c &&
241         test ! -f a.out &&
242         test ! -f src/part3.c &&
243         test ! -d docs &&
244         test -f obj.o &&
245         test -f build/lib.so
246
247 '
248
249 test_expect_success 'git clean -d src/ examples/' '
250
251         mkdir -p build docs examples &&
252         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so examples/1.c &&
253         git clean -d src/ examples/ &&
254         test -f Makefile &&
255         test -f README &&
256         test -f src/part1.c &&
257         test -f src/part2.c &&
258         test -f a.out &&
259         test ! -f src/part3.c &&
260         test ! -f examples/1.c &&
261         test -f docs/manual.txt &&
262         test -f obj.o &&
263         test -f build/lib.so
264
265 '
266
267 test_expect_success 'git clean -x' '
268
269         mkdir -p build docs &&
270         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
271         git clean -x &&
272         test -f Makefile &&
273         test -f README &&
274         test -f src/part1.c &&
275         test -f src/part2.c &&
276         test ! -f a.out &&
277         test ! -f src/part3.c &&
278         test -f docs/manual.txt &&
279         test ! -f obj.o &&
280         test -f build/lib.so
281
282 '
283
284 test_expect_success 'git clean -d -x' '
285
286         mkdir -p build docs &&
287         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
288         git clean -d -x &&
289         test -f Makefile &&
290         test -f README &&
291         test -f src/part1.c &&
292         test -f src/part2.c &&
293         test ! -f a.out &&
294         test ! -f src/part3.c &&
295         test ! -d docs &&
296         test ! -f obj.o &&
297         test ! -d build
298
299 '
300
301 test_expect_success 'git clean -d -x with ignored tracked directory' '
302
303         mkdir -p build docs &&
304         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
305         git clean -d -x -e src &&
306         test -f Makefile &&
307         test -f README &&
308         test -f src/part1.c &&
309         test -f src/part2.c &&
310         test ! -f a.out &&
311         test -f src/part3.c &&
312         test ! -d docs &&
313         test ! -f obj.o &&
314         test ! -d build
315
316 '
317
318 test_expect_success 'git clean -X' '
319
320         mkdir -p build docs &&
321         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
322         git clean -X &&
323         test -f Makefile &&
324         test -f README &&
325         test -f src/part1.c &&
326         test -f src/part2.c &&
327         test -f a.out &&
328         test -f src/part3.c &&
329         test -f docs/manual.txt &&
330         test ! -f obj.o &&
331         test -f build/lib.so
332
333 '
334
335 test_expect_success 'git clean -d -X' '
336
337         mkdir -p build docs &&
338         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
339         git clean -d -X &&
340         test -f Makefile &&
341         test -f README &&
342         test -f src/part1.c &&
343         test -f src/part2.c &&
344         test -f a.out &&
345         test -f src/part3.c &&
346         test -f docs/manual.txt &&
347         test ! -f obj.o &&
348         test ! -d build
349
350 '
351
352 test_expect_success 'git clean -d -X with ignored tracked directory' '
353
354         mkdir -p build docs &&
355         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
356         git clean -d -X -e src &&
357         test -f Makefile &&
358         test -f README &&
359         test -f src/part1.c &&
360         test -f src/part2.c &&
361         test -f a.out &&
362         test ! -f src/part3.c &&
363         test -f docs/manual.txt &&
364         test ! -f obj.o &&
365         test ! -d build
366
367 '
368
369 test_expect_success 'clean.requireForce defaults to true' '
370
371         git config --unset clean.requireForce &&
372         test_must_fail git clean
373
374 '
375
376 test_expect_success 'clean.requireForce' '
377
378         git config clean.requireForce true &&
379         test_must_fail git clean
380
381 '
382
383 test_expect_success 'clean.requireForce and -n' '
384
385         mkdir -p build docs &&
386         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
387         git clean -n &&
388         test -f Makefile &&
389         test -f README &&
390         test -f src/part1.c &&
391         test -f src/part2.c &&
392         test -f a.out &&
393         test -f src/part3.c &&
394         test -f docs/manual.txt &&
395         test -f obj.o &&
396         test -f build/lib.so
397
398 '
399
400 test_expect_success 'clean.requireForce and -f' '
401
402         git clean -f &&
403         test -f README &&
404         test -f src/part1.c &&
405         test -f src/part2.c &&
406         test ! -f a.out &&
407         test ! -f src/part3.c &&
408         test -f docs/manual.txt &&
409         test -f obj.o &&
410         test -f build/lib.so
411
412 '
413
414 test_expect_success C_LOCALE_OUTPUT 'core.excludesfile' '
415
416         echo excludes >excludes &&
417         echo included >included &&
418         git config core.excludesfile excludes &&
419         output=$(git clean -n excludes included 2>&1) &&
420         expr "$output" : ".*included" >/dev/null &&
421         ! expr "$output" : ".*excludes" >/dev/null
422
423 '
424
425 test_expect_success SANITY 'removal failure' '
426
427         mkdir foo &&
428         touch foo/bar &&
429         test_when_finished "chmod 755 foo" &&
430         (exec <foo/bar &&
431          chmod 0 foo &&
432          test_must_fail git clean -f -d)
433 '
434
435 test_expect_success 'nested git work tree' '
436         rm -fr foo bar baz &&
437         mkdir -p foo bar baz/boo &&
438         (
439                 cd foo &&
440                 git init &&
441                 >hello.world
442                 git add . &&
443                 git commit -a -m nested
444         ) &&
445         (
446                 cd bar &&
447                 >goodbye.people
448         ) &&
449         (
450                 cd baz/boo &&
451                 git init &&
452                 >deeper.world
453                 git add . &&
454                 git commit -a -m deeply.nested
455         ) &&
456         git clean -f -d &&
457         test -f foo/.git/index &&
458         test -f foo/hello.world &&
459         test -f baz/boo/.git/index &&
460         test -f baz/boo/deeper.world &&
461         ! test -d bar
462 '
463
464 test_expect_success 'force removal of nested git work tree' '
465         rm -fr foo bar baz &&
466         mkdir -p foo bar baz/boo &&
467         (
468                 cd foo &&
469                 git init &&
470                 >hello.world
471                 git add . &&
472                 git commit -a -m nested
473         ) &&
474         (
475                 cd bar &&
476                 >goodbye.people
477         ) &&
478         (
479                 cd baz/boo &&
480                 git init &&
481                 >deeper.world
482                 git add . &&
483                 git commit -a -m deeply.nested
484         ) &&
485         git clean -f -f -d &&
486         ! test -d foo &&
487         ! test -d bar &&
488         ! test -d baz
489 '
490
491 test_expect_success 'git clean -e' '
492         rm -fr repo &&
493         mkdir repo &&
494         (
495                 cd repo &&
496                 git init &&
497                 touch known 1 2 3 &&
498                 git add known &&
499                 git clean -f -e 1 -e 2 &&
500                 test -e 1 &&
501                 test -e 2 &&
502                 ! (test -e 3) &&
503                 test -e known
504         )
505 '
506
507 test_expect_success SANITY 'git clean -d with an unreadable empty directory' '
508         mkdir foo &&
509         chmod a= foo &&
510         git clean -dfx foo &&
511         ! test -d foo
512 '
513
514 test_expect_success 'git clean -d respects pathspecs (dir is prefix of pathspec)' '
515         mkdir -p foo &&
516         mkdir -p foobar &&
517         git clean -df foobar &&
518         test_path_is_dir foo &&
519         test_path_is_missing foobar
520 '
521
522 test_expect_success 'git clean -d respects pathspecs (pathspec is prefix of dir)' '
523         mkdir -p foo &&
524         mkdir -p foobar &&
525         git clean -df foo &&
526         test_path_is_missing foo &&
527         test_path_is_dir foobar
528 '
529
530 test_done