git-clean: add tests for relative path
[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 &&
79         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
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 docs/manual.txt &&
88         test -f obj.o &&
89         test -f build/lib.so
90
91 '
92
93 test_expect_success 'git-clean with relative prefix' '
94
95         mkdir -p build docs &&
96         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
97         would_clean=$(
98                 cd docs &&
99                 git clean -n ../src |
100                 sed -n -e "s|^Would remove ||p"
101         ) &&
102         test "$would_clean" = ../src/part3.c || {
103                 echo "OOps <$would_clean>"
104                 false
105         }
106 '
107
108 test_expect_success 'git-clean with absolute path' '
109
110         mkdir -p build docs &&
111         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
112         would_clean=$(
113                 cd docs &&
114                 git clean -n $(pwd)/../src |
115                 sed -n -e "s|^Would remove ||p"
116         ) &&
117         test "$would_clean" = ../src/part3.c || {
118                 echo "OOps <$would_clean>"
119                 false
120         }
121 '
122
123 test_expect_success 'git-clean with out of work tree relative path' '
124
125         mkdir -p build docs &&
126         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
127         (
128                 cd docs &&
129                 test_must_fail git clean -n ../..
130         )
131 '
132
133 test_expect_success 'git-clean with out of work tree absolute path' '
134
135         mkdir -p build docs &&
136         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
137         dd=$(cd .. && pwd) &&
138         (
139                 cd docs &&
140                 test_must_fail git clean -n $dd
141         )
142 '
143
144 test_expect_success 'git-clean -d with prefix and path' '
145
146         mkdir -p build docs src/feature &&
147         touch a.out src/part3.c src/feature/file.c docs/manual.txt obj.o build/lib.so &&
148         (cd src/ && git-clean -d feature/) &&
149         test -f Makefile &&
150         test -f README &&
151         test -f src/part1.c &&
152         test -f src/part2.c &&
153         test -f a.out &&
154         test -f src/part3.c &&
155         test ! -f src/feature/file.c &&
156         test -f docs/manual.txt &&
157         test -f obj.o &&
158         test -f build/lib.so
159
160 '
161
162 test_expect_success 'git-clean symbolic link' '
163
164         mkdir -p build docs &&
165         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
166         ln -s docs/manual.txt src/part4.c
167         git-clean &&
168         test -f Makefile &&
169         test -f README &&
170         test -f src/part1.c &&
171         test -f src/part2.c &&
172         test ! -f a.out &&
173         test ! -f src/part3.c &&
174         test ! -f src/part4.c &&
175         test -f docs/manual.txt &&
176         test -f obj.o &&
177         test -f build/lib.so
178
179 '
180
181 test_expect_success 'git-clean with wildcard' '
182
183         touch a.clean b.clean other.c &&
184         git-clean "*.clean" &&
185         test -f Makefile &&
186         test -f README &&
187         test -f src/part1.c &&
188         test -f src/part2.c &&
189         test ! -f a.clean &&
190         test ! -f b.clean &&
191         test -f other.c
192
193 '
194
195 test_expect_success 'git-clean -n' '
196
197         mkdir -p build docs &&
198         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
199         git-clean -n &&
200         test -f Makefile &&
201         test -f README &&
202         test -f src/part1.c &&
203         test -f src/part2.c &&
204         test -f a.out &&
205         test -f src/part3.c &&
206         test -f docs/manual.txt &&
207         test -f obj.o &&
208         test -f build/lib.so
209
210 '
211
212 test_expect_success 'git-clean -d' '
213
214         mkdir -p build docs &&
215         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
216         git-clean -d &&
217         test -f Makefile &&
218         test -f README &&
219         test -f src/part1.c &&
220         test -f src/part2.c &&
221         test ! -f a.out &&
222         test ! -f src/part3.c &&
223         test ! -d docs &&
224         test -f obj.o &&
225         test -f build/lib.so
226
227 '
228
229 test_expect_success 'git-clean -d src/ examples/' '
230
231         mkdir -p build docs examples &&
232         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so examples/1.c &&
233         git-clean -d src/ examples/ &&
234         test -f Makefile &&
235         test -f README &&
236         test -f src/part1.c &&
237         test -f src/part2.c &&
238         test -f a.out &&
239         test ! -f src/part3.c &&
240         test ! -f examples/1.c &&
241         test -f docs/manual.txt &&
242         test -f obj.o &&
243         test -f build/lib.so
244
245 '
246
247 test_expect_success 'git-clean -x' '
248
249         mkdir -p build docs &&
250         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
251         git-clean -x &&
252         test -f Makefile &&
253         test -f README &&
254         test -f src/part1.c &&
255         test -f src/part2.c &&
256         test ! -f a.out &&
257         test ! -f src/part3.c &&
258         test -f docs/manual.txt &&
259         test ! -f obj.o &&
260         test -f build/lib.so
261
262 '
263
264 test_expect_success 'git-clean -d -x' '
265
266         mkdir -p build docs &&
267         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
268         git-clean -d -x &&
269         test -f Makefile &&
270         test -f README &&
271         test -f src/part1.c &&
272         test -f src/part2.c &&
273         test ! -f a.out &&
274         test ! -f src/part3.c &&
275         test ! -d docs &&
276         test ! -f obj.o &&
277         test ! -d build
278
279 '
280
281 test_expect_success 'git-clean -X' '
282
283         mkdir -p build docs &&
284         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
285         git-clean -X &&
286         test -f Makefile &&
287         test -f README &&
288         test -f src/part1.c &&
289         test -f src/part2.c &&
290         test -f a.out &&
291         test -f src/part3.c &&
292         test -f docs/manual.txt &&
293         test ! -f obj.o &&
294         test -f build/lib.so
295
296 '
297
298 test_expect_success 'git-clean -d -X' '
299
300         mkdir -p build docs &&
301         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
302         git-clean -d -X &&
303         test -f Makefile &&
304         test -f README &&
305         test -f src/part1.c &&
306         test -f src/part2.c &&
307         test -f a.out &&
308         test -f src/part3.c &&
309         test -f docs/manual.txt &&
310         test ! -f obj.o &&
311         test ! -d build
312
313 '
314
315 test_expect_success 'clean.requireForce defaults to true' '
316
317         git config --unset clean.requireForce &&
318         ! git-clean
319
320 '
321
322 test_expect_success 'clean.requireForce' '
323
324         git config clean.requireForce true &&
325         ! git-clean
326
327 '
328
329 test_expect_success 'clean.requireForce and -n' '
330
331         mkdir -p build docs &&
332         touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
333         git-clean -n &&
334         test -f Makefile &&
335         test -f README &&
336         test -f src/part1.c &&
337         test -f src/part2.c &&
338         test -f a.out &&
339         test -f src/part3.c &&
340         test -f docs/manual.txt &&
341         test -f obj.o &&
342         test -f build/lib.so
343
344 '
345
346 test_expect_success 'clean.requireForce and -f' '
347
348         git-clean -f &&
349         test -f README &&
350         test -f src/part1.c &&
351         test -f src/part2.c &&
352         test ! -f a.out &&
353         test ! -f src/part3.c &&
354         test -f docs/manual.txt &&
355         test -f obj.o &&
356         test -f build/lib.so
357
358 '
359
360 test_expect_success 'core.excludesfile' '
361
362         echo excludes >excludes &&
363         echo included >included &&
364         git config core.excludesfile excludes &&
365         output=$(git clean -n excludes included 2>&1) &&
366         expr "$output" : ".*included" >/dev/null &&
367         ! expr "$output" : ".*excludes" >/dev/null
368
369 '
370
371 test_expect_success 'removal failure' '
372
373         mkdir foo &&
374         touch foo/bar &&
375         exec <foo/bar &&
376         chmod 0 foo &&
377         test_must_fail git clean -f -d
378
379 '
380 chmod 755 foo
381
382 test_done