log -L: store the path instead of a diff_filespec
[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 -X' '
302
303         mkdir -p build docs &&
304         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
305         git clean -X &&
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 -f docs/manual.txt &&
313         test ! -f obj.o &&
314         test -f build/lib.so
315
316 '
317
318 test_expect_success 'git clean -d -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 -d -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 ! -d build
332
333 '
334
335 test_expect_success 'clean.requireForce defaults to true' '
336
337         git config --unset clean.requireForce &&
338         test_must_fail git clean
339
340 '
341
342 test_expect_success 'clean.requireForce' '
343
344         git config clean.requireForce true &&
345         test_must_fail git clean
346
347 '
348
349 test_expect_success 'clean.requireForce and -n' '
350
351         mkdir -p build docs &&
352         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
353         git clean -n &&
354         test -f Makefile &&
355         test -f README &&
356         test -f src/part1.c &&
357         test -f src/part2.c &&
358         test -f a.out &&
359         test -f src/part3.c &&
360         test -f docs/manual.txt &&
361         test -f obj.o &&
362         test -f build/lib.so
363
364 '
365
366 test_expect_success 'clean.requireForce and -f' '
367
368         git clean -f &&
369         test -f README &&
370         test -f src/part1.c &&
371         test -f src/part2.c &&
372         test ! -f a.out &&
373         test ! -f src/part3.c &&
374         test -f docs/manual.txt &&
375         test -f obj.o &&
376         test -f build/lib.so
377
378 '
379
380 test_expect_success C_LOCALE_OUTPUT 'core.excludesfile' '
381
382         echo excludes >excludes &&
383         echo included >included &&
384         git config core.excludesfile excludes &&
385         output=$(git clean -n excludes included 2>&1) &&
386         expr "$output" : ".*included" >/dev/null &&
387         ! expr "$output" : ".*excludes" >/dev/null
388
389 '
390
391 test_expect_success SANITY 'removal failure' '
392
393         mkdir foo &&
394         touch foo/bar &&
395         (exec <foo/bar &&
396          chmod 0 foo &&
397          test_must_fail git clean -f -d &&
398          chmod 755 foo)
399 '
400
401 test_expect_success 'nested git work tree' '
402         rm -fr foo bar baz &&
403         mkdir -p foo bar baz/boo &&
404         (
405                 cd foo &&
406                 git init &&
407                 >hello.world
408                 git add . &&
409                 git commit -a -m nested
410         ) &&
411         (
412                 cd bar &&
413                 >goodbye.people
414         ) &&
415         (
416                 cd baz/boo &&
417                 git init &&
418                 >deeper.world
419                 git add . &&
420                 git commit -a -m deeply.nested
421         ) &&
422         git clean -f -d &&
423         test -f foo/.git/index &&
424         test -f foo/hello.world &&
425         test -f baz/boo/.git/index &&
426         test -f baz/boo/deeper.world &&
427         ! test -d bar
428 '
429
430 test_expect_success 'force removal of nested git work tree' '
431         rm -fr foo bar baz &&
432         mkdir -p foo bar baz/boo &&
433         (
434                 cd foo &&
435                 git init &&
436                 >hello.world
437                 git add . &&
438                 git commit -a -m nested
439         ) &&
440         (
441                 cd bar &&
442                 >goodbye.people
443         ) &&
444         (
445                 cd baz/boo &&
446                 git init &&
447                 >deeper.world
448                 git add . &&
449                 git commit -a -m deeply.nested
450         ) &&
451         git clean -f -f -d &&
452         ! test -d foo &&
453         ! test -d bar &&
454         ! test -d baz
455 '
456
457 test_expect_success 'git clean -e' '
458         rm -fr repo &&
459         mkdir repo &&
460         (
461                 cd repo &&
462                 git init &&
463                 touch known 1 2 3 &&
464                 git add known &&
465                 git clean -f -e 1 -e 2 &&
466                 test -e 1 &&
467                 test -e 2 &&
468                 ! (test -e 3) &&
469                 test -e known
470         )
471 '
472
473 test_expect_success SANITY 'git clean -d with an unreadable empty directory' '
474         mkdir foo &&
475         chmod a= foo &&
476         git clean -dfx foo &&
477         ! test -d foo
478 '
479
480 test_done