]>
Commit | Line | Data |
---|---|---|
ef79b1f8 NTND |
1 | #!/bin/sh |
2 | ||
3 | test_description='test case exclude pathspec' | |
4 | ||
5 | . ./test-lib.sh | |
6 | ||
7 | test_expect_success 'setup' ' | |
8 | for p in file sub/file sub/sub/file sub/file2 sub/sub/sub/file sub2/file; do | |
9 | if echo $p | grep /; then | |
7b8c0b53 | 10 | mkdir -p $(dirname $p) |
ef79b1f8 NTND |
11 | fi && |
12 | : >$p && | |
13 | git add $p && | |
0c51d6b4 | 14 | git commit -m $p || return 1 |
ef79b1f8 NTND |
15 | done && |
16 | git log --oneline --format=%s >actual && | |
17 | cat <<EOF >expect && | |
18 | sub2/file | |
19 | sub/sub/sub/file | |
20 | sub/file2 | |
21 | sub/sub/file | |
22 | sub/file | |
23 | file | |
24 | EOF | |
25 | test_cmp expect actual | |
26 | ' | |
27 | ||
93dbefb3 | 28 | test_expect_success 'exclude only pathspec uses default implicit pathspec' ' |
859b7f1d LT |
29 | git log --oneline --format=%s -- . ":(exclude)sub" >expect && |
30 | git log --oneline --format=%s -- ":(exclude)sub" >actual && | |
31 | test_cmp expect actual | |
ef79b1f8 NTND |
32 | ' |
33 | ||
34 | test_expect_success 't_e_i() exclude sub' ' | |
60687de5 | 35 | git log --oneline --format=%s -- . ":(exclude)sub" >actual && |
ef79b1f8 NTND |
36 | cat <<EOF >expect && |
37 | sub2/file | |
38 | file | |
39 | EOF | |
40 | test_cmp expect actual | |
41 | ' | |
42 | ||
43 | test_expect_success 't_e_i() exclude sub/sub/file' ' | |
60687de5 | 44 | git log --oneline --format=%s -- . ":(exclude)sub/sub/file" >actual && |
ef79b1f8 NTND |
45 | cat <<EOF >expect && |
46 | sub2/file | |
47 | sub/sub/sub/file | |
48 | sub/file2 | |
49 | sub/file | |
50 | file | |
51 | EOF | |
52 | test_cmp expect actual | |
53 | ' | |
54 | ||
55 | test_expect_success 't_e_i() exclude sub using mnemonic' ' | |
60687de5 | 56 | git log --oneline --format=%s -- . ":!sub" >actual && |
ef79b1f8 NTND |
57 | cat <<EOF >expect && |
58 | sub2/file | |
59 | file | |
60 | EOF | |
61 | test_cmp expect actual | |
62 | ' | |
63 | ||
64 | test_expect_success 't_e_i() exclude :(icase)SUB' ' | |
60687de5 | 65 | git log --oneline --format=%s -- . ":(exclude,icase)SUB" >actual && |
ef79b1f8 NTND |
66 | cat <<EOF >expect && |
67 | sub2/file | |
68 | file | |
69 | EOF | |
70 | test_cmp expect actual | |
71 | ' | |
72 | ||
73 | test_expect_success 't_e_i() exclude sub2 from sub' ' | |
74 | ( | |
75 | cd sub && | |
60687de5 | 76 | git log --oneline --format=%s -- :/ ":/!sub2" >actual && |
ef79b1f8 NTND |
77 | cat <<EOF >expect && |
78 | sub/sub/sub/file | |
79 | sub/file2 | |
80 | sub/sub/file | |
81 | sub/file | |
82 | file | |
83 | EOF | |
84 | test_cmp expect actual | |
85 | ) | |
86 | ' | |
87 | ||
88 | test_expect_success 't_e_i() exclude sub/*file' ' | |
60687de5 | 89 | git log --oneline --format=%s -- . ":(exclude)sub/*file" >actual && |
ef79b1f8 NTND |
90 | cat <<EOF >expect && |
91 | sub2/file | |
92 | sub/file2 | |
93 | file | |
94 | EOF | |
95 | test_cmp expect actual | |
96 | ' | |
97 | ||
98 | test_expect_success 't_e_i() exclude :(glob)sub/*/file' ' | |
60687de5 | 99 | git log --oneline --format=%s -- . ":(exclude,glob)sub/*/file" >actual && |
ef79b1f8 NTND |
100 | cat <<EOF >expect && |
101 | sub2/file | |
102 | sub/sub/sub/file | |
103 | sub/file2 | |
104 | sub/file | |
105 | file | |
106 | EOF | |
107 | test_cmp expect actual | |
108 | ' | |
109 | ||
110 | test_expect_success 'm_p_d() exclude sub' ' | |
60687de5 | 111 | git ls-files -- . ":(exclude)sub" >actual && |
ef79b1f8 NTND |
112 | cat <<EOF >expect && |
113 | file | |
114 | sub2/file | |
115 | EOF | |
116 | test_cmp expect actual | |
117 | ' | |
118 | ||
119 | test_expect_success 'm_p_d() exclude sub/sub/file' ' | |
60687de5 | 120 | git ls-files -- . ":(exclude)sub/sub/file" >actual && |
ef79b1f8 NTND |
121 | cat <<EOF >expect && |
122 | file | |
123 | sub/file | |
124 | sub/file2 | |
125 | sub/sub/sub/file | |
126 | sub2/file | |
127 | EOF | |
128 | test_cmp expect actual | |
129 | ' | |
130 | ||
131 | test_expect_success 'm_p_d() exclude sub using mnemonic' ' | |
60687de5 | 132 | git ls-files -- . ":!sub" >actual && |
ef79b1f8 NTND |
133 | cat <<EOF >expect && |
134 | file | |
135 | sub2/file | |
136 | EOF | |
137 | test_cmp expect actual | |
138 | ' | |
139 | ||
140 | test_expect_success 'm_p_d() exclude :(icase)SUB' ' | |
60687de5 | 141 | git ls-files -- . ":(exclude,icase)SUB" >actual && |
ef79b1f8 NTND |
142 | cat <<EOF >expect && |
143 | file | |
144 | sub2/file | |
145 | EOF | |
146 | test_cmp expect actual | |
147 | ' | |
148 | ||
149 | test_expect_success 'm_p_d() exclude sub2 from sub' ' | |
150 | ( | |
151 | cd sub && | |
60687de5 | 152 | git ls-files -- :/ ":/!sub2" >actual && |
ef79b1f8 NTND |
153 | cat <<EOF >expect && |
154 | ../file | |
155 | file | |
156 | file2 | |
157 | sub/file | |
158 | sub/sub/file | |
159 | EOF | |
160 | test_cmp expect actual | |
161 | ) | |
162 | ' | |
163 | ||
164 | test_expect_success 'm_p_d() exclude sub/*file' ' | |
60687de5 | 165 | git ls-files -- . ":(exclude)sub/*file" >actual && |
ef79b1f8 NTND |
166 | cat <<EOF >expect && |
167 | file | |
168 | sub/file2 | |
169 | sub2/file | |
170 | EOF | |
171 | test_cmp expect actual | |
172 | ' | |
173 | ||
174 | test_expect_success 'm_p_d() exclude :(glob)sub/*/file' ' | |
60687de5 | 175 | git ls-files -- . ":(exclude,glob)sub/*/file" >actual && |
ef79b1f8 NTND |
176 | cat <<EOF >expect && |
177 | file | |
178 | sub/file | |
179 | sub/file2 | |
180 | sub/sub/sub/file | |
181 | sub2/file | |
182 | EOF | |
183 | test_cmp expect actual | |
184 | ' | |
185 | ||
93dbefb3 MR |
186 | test_expect_success 'multiple exclusions' ' |
187 | git ls-files -- ":^*/file2" ":^sub2" >actual && | |
188 | cat <<-\EOF >expect && | |
189 | file | |
190 | sub/file | |
191 | sub/sub/file | |
192 | sub/sub/sub/file | |
193 | EOF | |
194 | test_cmp expect actual | |
195 | ' | |
196 | ||
b7845ceb | 197 | test_expect_success 't_e_i() exclude case #8' ' |
b02fdbc8 | 198 | test_when_finished "rm -fr case8" && |
b7845ceb NTND |
199 | git init case8 && |
200 | ( | |
201 | cd case8 && | |
202 | echo file >file1 && | |
203 | echo file >file2 && | |
204 | git add file1 file2 && | |
205 | git commit -m twofiles && | |
206 | git grep -l file HEAD :^file2 >actual && | |
207 | echo HEAD:file1 >expected && | |
208 | test_cmp expected actual && | |
209 | git grep -l file HEAD :^file1 >actual && | |
210 | echo HEAD:file2 >expected && | |
211 | test_cmp expected actual | |
212 | ) | |
213 | ' | |
214 | ||
f1f061e1 EN |
215 | test_expect_success 'grep --untracked PATTERN' ' |
216 | # This test is not an actual test of exclude patterns, rather it | |
217 | # is here solely to ensure that if any tests are inserted, deleted, or | |
218 | # changed above, that we still have untracked files with the expected | |
219 | # contents for the NEXT two tests. | |
220 | cat <<-\EOF >expect-grep && | |
221 | actual | |
222 | expect | |
223 | sub/actual | |
224 | sub/expect | |
225 | EOF | |
226 | git grep -l --untracked file -- >actual-grep && | |
227 | test_cmp expect-grep actual-grep | |
228 | ' | |
229 | ||
230 | test_expect_success 'grep --untracked PATTERN :(exclude)DIR' ' | |
231 | cat <<-\EOF >expect-grep && | |
232 | actual | |
233 | expect | |
234 | EOF | |
235 | git grep -l --untracked file -- ":(exclude)sub" >actual-grep && | |
236 | test_cmp expect-grep actual-grep | |
237 | ' | |
238 | ||
239 | test_expect_success 'grep --untracked PATTERN :(exclude)*FILE' ' | |
240 | cat <<-\EOF >expect-grep && | |
241 | actual | |
242 | sub/actual | |
243 | EOF | |
244 | git grep -l --untracked file -- ":(exclude)*expect" >actual-grep && | |
245 | test_cmp expect-grep actual-grep | |
246 | ' | |
247 | ||
b02fdbc8 JH |
248 | # Depending on the command, all negative pathspec needs to subtract |
249 | # either from the full tree, or from the current directory. | |
250 | # | |
251 | # The sample tree checked out at this point has: | |
252 | # file | |
253 | # sub/file | |
254 | # sub/file2 | |
255 | # sub/sub/file | |
256 | # sub/sub/sub/file | |
257 | # sub2/file | |
258 | # | |
259 | # but there may also be some cruft that interferes with "git clean" | |
260 | # and "git add" tests. | |
261 | ||
262 | test_expect_success 'archive with all negative' ' | |
263 | git reset --hard && | |
264 | git clean -f && | |
265 | git -C sub archive --format=tar HEAD -- ":!sub/" >archive && | |
266 | "$TAR" tf archive >actual && | |
267 | cat >expect <<-\EOF && | |
268 | file | |
269 | file2 | |
270 | EOF | |
271 | test_cmp expect actual | |
272 | ' | |
273 | ||
274 | test_expect_success 'add with all negative' ' | |
275 | H=$(git rev-parse HEAD) && | |
276 | git reset --hard $H && | |
277 | git clean -f && | |
278 | test_when_finished "git reset --hard $H" && | |
279 | for path in file sub/file sub/sub/file sub2/file | |
280 | do | |
281 | echo smudge >>"$path" || return 1 | |
282 | done && | |
283 | git -C sub add -- ":!sub/" && | |
284 | git diff --name-only --no-renames --cached >actual && | |
285 | cat >expect <<-\EOF && | |
286 | file | |
287 | sub/file | |
288 | sub2/file | |
289 | EOF | |
290 | test_cmp expect actual && | |
291 | git diff --name-only --no-renames >actual && | |
292 | echo sub/sub/file >expect && | |
293 | test_cmp expect actual | |
294 | ' | |
295 | ||
64ec8efb JS |
296 | test_lazy_prereq ADD_I_USE_BUILTIN_OR_PERL ' |
297 | test_have_prereq ADD_I_USE_BUILTIN || test_have_prereq PERL | |
298 | ' | |
299 | ||
300 | test_expect_success ADD_I_USE_BUILTIN_OR_PERL 'add -p with all negative' ' | |
b02fdbc8 JH |
301 | H=$(git rev-parse HEAD) && |
302 | git reset --hard $H && | |
303 | git clean -f && | |
304 | test_when_finished "git reset --hard $H" && | |
305 | for path in file sub/file sub/sub/file sub2/file | |
306 | do | |
307 | echo smudge >>"$path" || return 1 | |
308 | done && | |
309 | yes | git -C sub add -p -- ":!sub/" && | |
310 | git diff --name-only --no-renames --cached >actual && | |
311 | cat >expect <<-\EOF && | |
312 | file | |
313 | sub/file | |
314 | sub2/file | |
315 | EOF | |
316 | test_cmp expect actual && | |
317 | git diff --name-only --no-renames >actual && | |
318 | echo sub/sub/file >expect && | |
319 | test_cmp expect actual | |
320 | ' | |
321 | ||
322 | test_expect_success 'clean with all negative' ' | |
323 | H=$(git rev-parse HEAD) && | |
324 | git reset --hard $H && | |
325 | test_when_finished "git reset --hard $H && git clean -f" && | |
326 | git clean -f && | |
327 | for path in file9 sub/file9 sub/sub/file9 sub2/file9 | |
328 | do | |
329 | echo cruft >"$path" || return 1 | |
330 | done && | |
331 | git -C sub clean -f -- ":!sub" && | |
332 | test_path_is_file file9 && | |
333 | test_path_is_missing sub/file9 && | |
334 | test_path_is_file sub/sub/file9 && | |
335 | test_path_is_file sub2/file9 | |
336 | ' | |
337 | ||
338 | test_expect_success 'commit with all negative' ' | |
339 | H=$(git rev-parse HEAD) && | |
340 | git reset --hard $H && | |
341 | test_when_finished "git reset --hard $H" && | |
342 | for path in file sub/file sub/sub/file sub2/file | |
343 | do | |
344 | echo smudge >>"$path" || return 1 | |
345 | done && | |
346 | git -C sub commit -m sample -- ":!sub/" && | |
347 | git diff --name-only --no-renames HEAD^ HEAD >actual && | |
348 | cat >expect <<-\EOF && | |
349 | file | |
350 | sub/file | |
351 | sub2/file | |
352 | EOF | |
353 | test_cmp expect actual && | |
354 | git diff --name-only --no-renames HEAD >actual && | |
355 | echo sub/sub/file >expect && | |
356 | test_cmp expect actual | |
357 | ' | |
358 | ||
359 | test_expect_success 'reset with all negative' ' | |
360 | H=$(git rev-parse HEAD) && | |
361 | git reset --hard $H && | |
362 | test_when_finished "git reset --hard $H" && | |
363 | for path in file sub/file sub/sub/file sub2/file | |
364 | do | |
365 | echo smudge >>"$path" && | |
366 | git add "$path" || return 1 | |
367 | done && | |
368 | git -C sub reset --quiet -- ":!sub/" && | |
369 | git diff --name-only --no-renames --cached >actual && | |
370 | echo sub/sub/file >expect && | |
371 | test_cmp expect actual | |
372 | ' | |
373 | ||
374 | test_expect_success 'grep with all negative' ' | |
375 | H=$(git rev-parse HEAD) && | |
376 | git reset --hard $H && | |
377 | test_when_finished "git reset --hard $H" && | |
378 | for path in file sub/file sub/sub/file sub2/file | |
379 | do | |
380 | echo "needle $path" >>"$path" || return 1 | |
381 | done && | |
382 | git -C sub grep -h needle -- ":!sub/" >actual && | |
383 | cat >expect <<-\EOF && | |
384 | needle sub/file | |
385 | EOF | |
386 | test_cmp expect actual | |
387 | ' | |
388 | ||
389 | test_expect_success 'ls-files with all negative' ' | |
390 | git reset --hard && | |
391 | git -C sub ls-files -- ":!sub/" >actual && | |
392 | cat >expect <<-\EOF && | |
393 | file | |
394 | file2 | |
395 | EOF | |
396 | test_cmp expect actual | |
397 | ' | |
398 | ||
399 | test_expect_success 'rm with all negative' ' | |
400 | git reset --hard && | |
401 | test_when_finished "git reset --hard" && | |
402 | git -C sub rm -r --cached -- ":!sub/" >actual && | |
403 | git diff --name-only --no-renames --diff-filter=D --cached >actual && | |
404 | cat >expect <<-\EOF && | |
405 | sub/file | |
406 | sub/file2 | |
407 | EOF | |
408 | test_cmp expect actual | |
409 | ' | |
410 | ||
411 | test_expect_success 'stash with all negative' ' | |
412 | H=$(git rev-parse HEAD) && | |
413 | git reset --hard $H && | |
414 | test_when_finished "git reset --hard $H" && | |
415 | for path in file sub/file sub/sub/file sub2/file | |
416 | do | |
417 | echo smudge >>"$path" || return 1 | |
418 | done && | |
419 | git -C sub stash push -m sample -- ":!sub/" && | |
420 | git diff --name-only --no-renames HEAD >actual && | |
421 | echo sub/sub/file >expect && | |
422 | test_cmp expect actual && | |
423 | git stash show --name-only >actual && | |
424 | cat >expect <<-\EOF && | |
425 | file | |
426 | sub/file | |
427 | sub2/file | |
428 | EOF | |
429 | test_cmp expect actual | |
430 | ' | |
431 | ||
ef79b1f8 | 432 | test_done |