clean: require double -f options to nuke nested git repository and work tree
[git/git.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' '
26
27 mkdir -p build docs &&
28 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
29 git clean &&
30 test -f Makefile &&
31 test -f README &&
32 test -f src/part1.c &&
33 test -f src/part2.c &&
34 test ! -f a.out &&
35 test ! -f src/part3.c &&
36 test -f docs/manual.txt &&
37 test -f obj.o &&
38 test -f build/lib.so
39
40 '
41
42 test_expect_success 'git clean src/' '
43
44 mkdir -p build docs &&
45 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
46 git clean src/ &&
47 test -f Makefile &&
48 test -f README &&
49 test -f src/part1.c &&
50 test -f src/part2.c &&
51 test -f a.out &&
52 test ! -f src/part3.c &&
53 test -f docs/manual.txt &&
54 test -f obj.o &&
55 test -f build/lib.so
56
57 '
58
59 test_expect_success 'git clean src/ src/' '
60
61 mkdir -p build docs &&
62 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
63 git clean src/ src/ &&
64 test -f Makefile &&
65 test -f README &&
66 test -f src/part1.c &&
67 test -f src/part2.c &&
68 test -f a.out &&
69 test ! -f src/part3.c &&
70 test -f docs/manual.txt &&
71 test -f obj.o &&
72 test -f build/lib.so
73
74 '
75
76 test_expect_success 'git clean with prefix' '
77
78 mkdir -p build docs src/test &&
79 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so src/test/1.c &&
80 (cd src/ && git clean) &&
81 test -f Makefile &&
82 test -f README &&
83 test -f src/part1.c &&
84 test -f src/part2.c &&
85 test -f a.out &&
86 test ! -f src/part3.c &&
87 test -f src/test/1.c &&
88 test -f docs/manual.txt &&
89 test -f obj.o &&
90 test -f build/lib.so
91
92 '
93
94 test_expect_success 'git clean with relative prefix' '
95
96 mkdir -p build docs &&
97 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
98 would_clean=$(
99 cd docs &&
100 git clean -n ../src |
101 sed -n -e "s|^Would remove ||p"
102 ) &&
103 test "$would_clean" = ../src/part3.c || {
104 echo "OOps <$would_clean>"
105 false
106 }
107 '
108
109 test_expect_success 'git clean with absolute path' '
110
111 mkdir -p build docs &&
112 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
113 would_clean=$(
114 cd docs &&
115 git clean -n "$(pwd)/../src" |
116 sed -n -e "s|^Would remove ||p"
117 ) &&
118 test "$would_clean" = ../src/part3.c || {
119 echo "OOps <$would_clean>"
120 false
121 }
122 '
123
124 test_expect_success 'git clean with out of work tree relative path' '
125
126 mkdir -p build docs &&
127 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
128 (
129 cd docs &&
130 test_must_fail git clean -n ../..
131 )
132 '
133
134 test_expect_success 'git clean with out of work tree absolute path' '
135
136 mkdir -p build docs &&
137 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
138 dd=$(cd .. && pwd) &&
139 (
140 cd docs &&
141 test_must_fail git clean -n $dd
142 )
143 '
144
145 test_expect_success 'git clean -d with prefix and path' '
146
147 mkdir -p build docs src/feature &&
148 touch a.out src/part3.c src/feature/file.c docs/manual.txt obj.o build/lib.so &&
149 (cd src/ && git clean -d feature/) &&
150 test -f Makefile &&
151 test -f README &&
152 test -f src/part1.c &&
153 test -f src/part2.c &&
154 test -f a.out &&
155 test -f src/part3.c &&
156 test ! -f src/feature/file.c &&
157 test -f docs/manual.txt &&
158 test -f obj.o &&
159 test -f build/lib.so
160
161 '
162
163 test_expect_success 'git clean symbolic link' '
164
165 mkdir -p build docs &&
166 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
167 ln -s docs/manual.txt src/part4.c
168 git clean &&
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/part4.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 'git clean with wildcard' '
183
184 touch a.clean b.clean other.c &&
185 git clean "*.clean" &&
186 test -f Makefile &&
187 test -f README &&
188 test -f src/part1.c &&
189 test -f src/part2.c &&
190 test ! -f a.clean &&
191 test ! -f b.clean &&
192 test -f other.c
193
194 '
195
196 test_expect_success 'git clean -n' '
197
198 mkdir -p build docs &&
199 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
200 git clean -n &&
201 test -f Makefile &&
202 test -f README &&
203 test -f src/part1.c &&
204 test -f src/part2.c &&
205 test -f a.out &&
206 test -f src/part3.c &&
207 test -f docs/manual.txt &&
208 test -f obj.o &&
209 test -f build/lib.so
210
211 '
212
213 test_expect_success 'git clean -d' '
214
215 mkdir -p build docs &&
216 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
217 git clean -d &&
218 test -f Makefile &&
219 test -f README &&
220 test -f src/part1.c &&
221 test -f src/part2.c &&
222 test ! -f a.out &&
223 test ! -f src/part3.c &&
224 test ! -d docs &&
225 test -f obj.o &&
226 test -f build/lib.so
227
228 '
229
230 test_expect_success 'git clean -d src/ examples/' '
231
232 mkdir -p build docs examples &&
233 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so examples/1.c &&
234 git clean -d src/ examples/ &&
235 test -f Makefile &&
236 test -f README &&
237 test -f src/part1.c &&
238 test -f src/part2.c &&
239 test -f a.out &&
240 test ! -f src/part3.c &&
241 test ! -f examples/1.c &&
242 test -f docs/manual.txt &&
243 test -f obj.o &&
244 test -f build/lib.so
245
246 '
247
248 test_expect_success 'git clean -x' '
249
250 mkdir -p build docs &&
251 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
252 git clean -x &&
253 test -f Makefile &&
254 test -f README &&
255 test -f src/part1.c &&
256 test -f src/part2.c &&
257 test ! -f a.out &&
258 test ! -f src/part3.c &&
259 test -f docs/manual.txt &&
260 test ! -f obj.o &&
261 test -f build/lib.so
262
263 '
264
265 test_expect_success 'git clean -d -x' '
266
267 mkdir -p build docs &&
268 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
269 git clean -d -x &&
270 test -f Makefile &&
271 test -f README &&
272 test -f src/part1.c &&
273 test -f src/part2.c &&
274 test ! -f a.out &&
275 test ! -f src/part3.c &&
276 test ! -d docs &&
277 test ! -f obj.o &&
278 test ! -d build
279
280 '
281
282 test_expect_success 'git clean -X' '
283
284 mkdir -p build docs &&
285 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
286 git clean -X &&
287 test -f Makefile &&
288 test -f README &&
289 test -f src/part1.c &&
290 test -f src/part2.c &&
291 test -f a.out &&
292 test -f src/part3.c &&
293 test -f docs/manual.txt &&
294 test ! -f obj.o &&
295 test -f build/lib.so
296
297 '
298
299 test_expect_success 'git clean -d -X' '
300
301 mkdir -p build docs &&
302 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
303 git clean -d -X &&
304 test -f Makefile &&
305 test -f README &&
306 test -f src/part1.c &&
307 test -f src/part2.c &&
308 test -f a.out &&
309 test -f src/part3.c &&
310 test -f docs/manual.txt &&
311 test ! -f obj.o &&
312 test ! -d build
313
314 '
315
316 test_expect_success 'clean.requireForce defaults to true' '
317
318 git config --unset clean.requireForce &&
319 test_must_fail git clean
320
321 '
322
323 test_expect_success 'clean.requireForce' '
324
325 git config clean.requireForce true &&
326 test_must_fail git clean
327
328 '
329
330 test_expect_success 'clean.requireForce and -n' '
331
332 mkdir -p build docs &&
333 touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
334 git clean -n &&
335 test -f Makefile &&
336 test -f README &&
337 test -f src/part1.c &&
338 test -f src/part2.c &&
339 test -f a.out &&
340 test -f src/part3.c &&
341 test -f docs/manual.txt &&
342 test -f obj.o &&
343 test -f build/lib.so
344
345 '
346
347 test_expect_success 'clean.requireForce and -f' '
348
349 git clean -f &&
350 test -f README &&
351 test -f src/part1.c &&
352 test -f src/part2.c &&
353 test ! -f a.out &&
354 test ! -f src/part3.c &&
355 test -f docs/manual.txt &&
356 test -f obj.o &&
357 test -f build/lib.so
358
359 '
360
361 test_expect_success 'core.excludesfile' '
362
363 echo excludes >excludes &&
364 echo included >included &&
365 git config core.excludesfile excludes &&
366 output=$(git clean -n excludes included 2>&1) &&
367 expr "$output" : ".*included" >/dev/null &&
368 ! expr "$output" : ".*excludes" >/dev/null
369
370 '
371
372 test_expect_success 'removal failure' '
373
374 mkdir foo &&
375 touch foo/bar &&
376 (exec <foo/bar &&
377 chmod 0 foo &&
378 test_must_fail git clean -f -d)
379
380 '
381 chmod 755 foo
382
383 test_expect_success 'nested git work tree' '
384 rm -fr foo bar &&
385 mkdir foo bar &&
386 (
387 cd foo &&
388 git init &&
389 >hello.world
390 git add . &&
391 git commit -a -m nested
392 ) &&
393 (
394 cd bar &&
395 >goodbye.people
396 ) &&
397 git clean -f -d &&
398 test -f foo/.git/index &&
399 test -f foo/hello.world &&
400 ! test -d bar
401 '
402
403 test_expect_success 'force removal of nested git work tree' '
404 rm -fr foo bar &&
405 mkdir foo bar &&
406 (
407 cd foo &&
408 git init &&
409 >hello.world
410 git add . &&
411 git commit -a -m nested
412 ) &&
413 (
414 cd bar &&
415 >goodbye.people
416 ) &&
417 git clean -f -f -d &&
418 ! test -d foo &&
419 ! test -d bar
420 '
421
422 test_done