]>
Commit | Line | Data |
---|---|---|
af83bafa KN |
1 | #!/bin/sh |
2 | ||
3 | test_description='test for-each-refs usage of ref-filter APIs' | |
4 | ||
5 | . ./test-lib.sh | |
6 | . "$TEST_DIRECTORY"/lib-gpg.sh | |
7 | ||
af83bafa KN |
8 | test_expect_success 'setup some history and refs' ' |
9 | test_commit one && | |
10 | test_commit two && | |
11 | test_commit three && | |
12 | git checkout -b side && | |
13 | test_commit four && | |
7bc734ee ES |
14 | git tag -m "An annotated tag" annotated-tag && |
15 | git tag -m "Annonated doubly" doubly-annotated-tag annotated-tag && | |
f3072180 JK |
16 | |
17 | # Note that these "signed" tags might not actually be signed. | |
18 | # Tests which care about the distinction should be marked | |
19 | # with the GPG prereq. | |
618310a3 ES |
20 | if test_have_prereq GPG |
21 | then | |
f3072180 JK |
22 | sign=-s |
23 | else | |
24 | sign= | |
618310a3 | 25 | fi && |
f3072180 JK |
26 | git tag $sign -m "A signed tag" signed-tag && |
27 | git tag $sign -m "Signed doubly" doubly-signed-tag signed-tag && | |
28 | ||
af83bafa KN |
29 | git checkout master && |
30 | git update-ref refs/odd/spot master | |
31 | ' | |
32 | ||
d325406e KN |
33 | test_expect_success 'filtering with --points-at' ' |
34 | cat >expect <<-\EOF && | |
35 | refs/heads/master | |
36 | refs/odd/spot | |
37 | refs/tags/three | |
38 | EOF | |
39 | git for-each-ref --format="%(refname)" --points-at=master >actual && | |
40 | test_cmp expect actual | |
41 | ' | |
42 | ||
43 | test_expect_success 'check signed tags with --points-at' ' | |
f3072180 | 44 | sed -e "s/Z$//" >expect <<-\EOF && |
d325406e | 45 | refs/heads/side Z |
7bc734ee | 46 | refs/tags/annotated-tag four |
d325406e KN |
47 | refs/tags/four Z |
48 | refs/tags/signed-tag four | |
49 | EOF | |
50 | git for-each-ref --format="%(refname) %(*subject)" --points-at=side >actual && | |
51 | test_cmp expect actual | |
52 | ' | |
53 | ||
7c328348 KN |
54 | test_expect_success 'filtering with --merged' ' |
55 | cat >expect <<-\EOF && | |
56 | refs/heads/master | |
57 | refs/odd/spot | |
58 | refs/tags/one | |
59 | refs/tags/three | |
60 | refs/tags/two | |
61 | EOF | |
62 | git for-each-ref --format="%(refname)" --merged=master >actual && | |
63 | test_cmp expect actual | |
64 | ' | |
65 | ||
66 | test_expect_success 'filtering with --no-merged' ' | |
f3072180 | 67 | cat >expect <<-\EOF && |
7c328348 | 68 | refs/heads/side |
7bc734ee ES |
69 | refs/tags/annotated-tag |
70 | refs/tags/doubly-annotated-tag | |
ef93c7db | 71 | refs/tags/doubly-signed-tag |
7c328348 KN |
72 | refs/tags/four |
73 | refs/tags/signed-tag | |
74 | EOF | |
75 | git for-each-ref --format="%(refname)" --no-merged=master >actual && | |
76 | test_cmp expect actual | |
77 | ' | |
78 | ||
4a71109a | 79 | test_expect_success 'filtering with --contains' ' |
f3072180 | 80 | cat >expect <<-\EOF && |
4a71109a KN |
81 | refs/heads/master |
82 | refs/heads/side | |
83 | refs/odd/spot | |
7bc734ee ES |
84 | refs/tags/annotated-tag |
85 | refs/tags/doubly-annotated-tag | |
ef93c7db | 86 | refs/tags/doubly-signed-tag |
4a71109a KN |
87 | refs/tags/four |
88 | refs/tags/signed-tag | |
89 | refs/tags/three | |
90 | refs/tags/two | |
91 | EOF | |
92 | git for-each-ref --format="%(refname)" --contains=two >actual && | |
93 | test_cmp expect actual | |
94 | ' | |
95 | ||
ac3f5a34 ÆAB |
96 | test_expect_success 'filtering with --no-contains' ' |
97 | cat >expect <<-\EOF && | |
98 | refs/tags/one | |
99 | EOF | |
100 | git for-each-ref --format="%(refname)" --no-contains=two >actual && | |
101 | test_cmp expect actual | |
102 | ' | |
103 | ||
104 | test_expect_success 'filtering with --contains and --no-contains' ' | |
105 | cat >expect <<-\EOF && | |
106 | refs/tags/two | |
107 | EOF | |
108 | git for-each-ref --format="%(refname)" --contains=two --no-contains=three >actual && | |
109 | test_cmp expect actual | |
110 | ' | |
111 | ||
40a7551d KN |
112 | test_expect_success '%(color) must fail' ' |
113 | test_must_fail git for-each-ref --format="%(color)%(refname)" | |
114 | ' | |
115 | ||
ce592082 | 116 | test_expect_success 'left alignment is default' ' |
f3072180 | 117 | cat >expect <<-\EOF && |
ce592082 KN |
118 | refname is refs/heads/master |refs/heads/master |
119 | refname is refs/heads/side |refs/heads/side | |
120 | refname is refs/odd/spot |refs/odd/spot | |
7bc734ee ES |
121 | refname is refs/tags/annotated-tag|refs/tags/annotated-tag |
122 | refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag | |
ef93c7db | 123 | refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag |
ce592082 KN |
124 | refname is refs/tags/four |refs/tags/four |
125 | refname is refs/tags/one |refs/tags/one | |
126 | refname is refs/tags/signed-tag|refs/tags/signed-tag | |
127 | refname is refs/tags/three |refs/tags/three | |
128 | refname is refs/tags/two |refs/tags/two | |
129 | EOF | |
130 | git for-each-ref --format="%(align:30)refname is %(refname)%(end)|%(refname)" >actual && | |
131 | test_cmp expect actual | |
132 | ' | |
133 | ||
134 | test_expect_success 'middle alignment' ' | |
f3072180 | 135 | cat >expect <<-\EOF && |
ce592082 KN |
136 | | refname is refs/heads/master |refs/heads/master |
137 | | refname is refs/heads/side |refs/heads/side | |
138 | | refname is refs/odd/spot |refs/odd/spot | |
7bc734ee ES |
139 | |refname is refs/tags/annotated-tag|refs/tags/annotated-tag |
140 | |refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag | |
ef93c7db | 141 | |refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag |
ce592082 KN |
142 | | refname is refs/tags/four |refs/tags/four |
143 | | refname is refs/tags/one |refs/tags/one | |
144 | |refname is refs/tags/signed-tag|refs/tags/signed-tag | |
145 | | refname is refs/tags/three |refs/tags/three | |
146 | | refname is refs/tags/two |refs/tags/two | |
147 | EOF | |
148 | git for-each-ref --format="|%(align:middle,30)refname is %(refname)%(end)|%(refname)" >actual && | |
149 | test_cmp expect actual | |
150 | ' | |
151 | ||
152 | test_expect_success 'right alignment' ' | |
f3072180 | 153 | cat >expect <<-\EOF && |
ce592082 KN |
154 | | refname is refs/heads/master|refs/heads/master |
155 | | refname is refs/heads/side|refs/heads/side | |
156 | | refname is refs/odd/spot|refs/odd/spot | |
7bc734ee ES |
157 | |refname is refs/tags/annotated-tag|refs/tags/annotated-tag |
158 | |refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag | |
ef93c7db | 159 | |refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag |
ce592082 KN |
160 | | refname is refs/tags/four|refs/tags/four |
161 | | refname is refs/tags/one|refs/tags/one | |
162 | |refname is refs/tags/signed-tag|refs/tags/signed-tag | |
163 | | refname is refs/tags/three|refs/tags/three | |
164 | | refname is refs/tags/two|refs/tags/two | |
165 | EOF | |
166 | git for-each-ref --format="|%(align:30,right)refname is %(refname)%(end)|%(refname)" >actual && | |
167 | test_cmp expect actual | |
168 | ' | |
169 | ||
f3072180 | 170 | cat >expect <<-\EOF |
395fb8f9 KN |
171 | | refname is refs/heads/master |refs/heads/master |
172 | | refname is refs/heads/side |refs/heads/side | |
173 | | refname is refs/odd/spot |refs/odd/spot | |
7bc734ee ES |
174 | | refname is refs/tags/annotated-tag |refs/tags/annotated-tag |
175 | |refname is refs/tags/doubly-annotated-tag |refs/tags/doubly-annotated-tag | |
ef93c7db | 176 | | refname is refs/tags/doubly-signed-tag |refs/tags/doubly-signed-tag |
395fb8f9 KN |
177 | | refname is refs/tags/four |refs/tags/four |
178 | | refname is refs/tags/one |refs/tags/one | |
179 | | refname is refs/tags/signed-tag |refs/tags/signed-tag | |
180 | | refname is refs/tags/three |refs/tags/three | |
181 | | refname is refs/tags/two |refs/tags/two | |
182 | EOF | |
183 | ||
184 | test_align_permutations() { | |
185 | while read -r option | |
186 | do | |
187 | test_expect_success "align:$option" ' | |
188 | git for-each-ref --format="|%(align:$option)refname is %(refname)%(end)|%(refname)" >actual && | |
189 | test_cmp expect actual | |
190 | ' | |
191 | done | |
192 | } | |
193 | ||
194 | test_align_permutations <<-\EOF | |
195 | middle,42 | |
196 | 42,middle | |
197 | position=middle,42 | |
198 | 42,position=middle | |
199 | middle,width=42 | |
200 | width=42,middle | |
201 | position=middle,width=42 | |
202 | width=42,position=middle | |
203 | EOF | |
204 | ||
205 | # Last one wins (silently) when multiple arguments of the same type are given | |
206 | ||
207 | test_align_permutations <<-\EOF | |
208 | 32,width=42,middle | |
209 | width=30,42,middle | |
210 | width=42,position=right,middle | |
211 | 42,right,position=middle | |
212 | EOF | |
213 | ||
ce592082 KN |
214 | # Individual atoms inside %(align:...) and %(end) must not be quoted. |
215 | ||
216 | test_expect_success 'alignment with format quote' " | |
f3072180 | 217 | cat >expect <<-\EOF && |
ce592082 KN |
218 | |' '\''master| A U Thor'\'' '| |
219 | |' '\''side| A U Thor'\'' '| | |
220 | |' '\''odd/spot| A U Thor'\'' '| | |
7bc734ee ES |
221 | |' '\''annotated-tag| '\'' '| |
222 | |' '\''doubly-annotated-tag| '\'' '| | |
ef93c7db | 223 | |' '\''doubly-signed-tag| '\'' '| |
ce592082 KN |
224 | |' '\''four| A U Thor'\'' '| |
225 | |' '\''one| A U Thor'\'' '| | |
226 | |' '\''signed-tag| '\'' '| | |
227 | |' '\''three| A U Thor'\'' '| | |
228 | |' '\''two| A U Thor'\'' '| | |
229 | EOF | |
230 | git for-each-ref --shell --format=\"|%(align:30,middle)'%(refname:short)| %(authorname)'%(end)|\" >actual && | |
231 | test_cmp expect actual | |
232 | " | |
233 | ||
234 | test_expect_success 'nested alignment with quote formatting' " | |
f3072180 | 235 | cat >expect <<-\EOF && |
ce592082 KN |
236 | |' master '| |
237 | |' side '| | |
238 | |' odd/spot '| | |
7bc734ee ES |
239 | |' annotated-tag '| |
240 | |'doubly-annotated-tag '| | |
ef93c7db | 241 | |'doubly-signed-tag '| |
ce592082 KN |
242 | |' four '| |
243 | |' one '| | |
244 | |' signed-tag '| | |
245 | |' three '| | |
246 | |' two '| | |
247 | EOF | |
248 | git for-each-ref --shell --format='|%(align:30,left)%(align:15,right)%(refname:short)%(end)%(end)|' >actual && | |
249 | test_cmp expect actual | |
250 | " | |
251 | ||
1bb38e5a | 252 | test_expect_success 'check `%(contents:lines=1)`' ' |
f3072180 | 253 | cat >expect <<-\EOF && |
1bb38e5a KN |
254 | master |three |
255 | side |four | |
256 | odd/spot |three | |
7bc734ee ES |
257 | annotated-tag |An annotated tag |
258 | doubly-annotated-tag |Annonated doubly | |
ef93c7db | 259 | doubly-signed-tag |Signed doubly |
1bb38e5a KN |
260 | four |four |
261 | one |one | |
ef93c7db | 262 | signed-tag |A signed tag |
1bb38e5a KN |
263 | three |three |
264 | two |two | |
265 | EOF | |
266 | git for-each-ref --format="%(refname:short) |%(contents:lines=1)" >actual && | |
267 | test_cmp expect actual | |
268 | ' | |
269 | ||
270 | test_expect_success 'check `%(contents:lines=0)`' ' | |
f3072180 | 271 | cat >expect <<-\EOF && |
1bb38e5a KN |
272 | master | |
273 | side | | |
274 | odd/spot | | |
7bc734ee ES |
275 | annotated-tag | |
276 | doubly-annotated-tag | | |
ef93c7db | 277 | doubly-signed-tag | |
1bb38e5a KN |
278 | four | |
279 | one | | |
280 | signed-tag | | |
281 | three | | |
282 | two | | |
283 | EOF | |
284 | git for-each-ref --format="%(refname:short) |%(contents:lines=0)" >actual && | |
285 | test_cmp expect actual | |
286 | ' | |
287 | ||
288 | test_expect_success 'check `%(contents:lines=99999)`' ' | |
f3072180 | 289 | cat >expect <<-\EOF && |
1bb38e5a KN |
290 | master |three |
291 | side |four | |
292 | odd/spot |three | |
7bc734ee ES |
293 | annotated-tag |An annotated tag |
294 | doubly-annotated-tag |Annonated doubly | |
ef93c7db | 295 | doubly-signed-tag |Signed doubly |
1bb38e5a KN |
296 | four |four |
297 | one |one | |
ef93c7db | 298 | signed-tag |A signed tag |
1bb38e5a KN |
299 | three |three |
300 | two |two | |
301 | EOF | |
302 | git for-each-ref --format="%(refname:short) |%(contents:lines=99999)" >actual && | |
303 | test_cmp expect actual | |
304 | ' | |
305 | ||
306 | test_expect_success '`%(contents:lines=-1)` should fail' ' | |
307 | test_must_fail git for-each-ref --format="%(refname:short) |%(contents:lines=-1)" | |
308 | ' | |
309 | ||
90c00408 KN |
310 | test_expect_success 'setup for version sort' ' |
311 | test_commit foo1.3 && | |
312 | test_commit foo1.6 && | |
313 | test_commit foo1.10 | |
314 | ' | |
315 | ||
316 | test_expect_success 'version sort' ' | |
317 | git for-each-ref --sort=version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual && | |
318 | cat >expect <<-\EOF && | |
319 | foo1.3 | |
320 | foo1.6 | |
321 | foo1.10 | |
322 | EOF | |
323 | test_cmp expect actual | |
324 | ' | |
325 | ||
326 | test_expect_success 'version sort (shortened)' ' | |
327 | git for-each-ref --sort=v:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual && | |
328 | cat >expect <<-\EOF && | |
329 | foo1.3 | |
330 | foo1.6 | |
331 | foo1.10 | |
332 | EOF | |
333 | test_cmp expect actual | |
334 | ' | |
335 | ||
336 | test_expect_success 'reverse version sort' ' | |
337 | git for-each-ref --sort=-version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual && | |
338 | cat >expect <<-\EOF && | |
339 | foo1.10 | |
340 | foo1.6 | |
341 | foo1.3 | |
342 | EOF | |
343 | test_cmp expect actual | |
344 | ' | |
345 | ||
c58492d4 KN |
346 | test_expect_success 'improper usage of %(if), %(then), %(else) and %(end) atoms' ' |
347 | test_must_fail git for-each-ref --format="%(if)" && | |
348 | test_must_fail git for-each-ref --format="%(then) %(end)" && | |
349 | test_must_fail git for-each-ref --format="%(else) %(end)" && | |
350 | test_must_fail git for-each-ref --format="%(if) %(else) %(end)" && | |
351 | test_must_fail git for-each-ref --format="%(if) %(then) %(then) %(end)" && | |
352 | test_must_fail git for-each-ref --format="%(then) %(else) %(end)" && | |
353 | test_must_fail git for-each-ref --format="%(if) %(else) %(end)" && | |
354 | test_must_fail git for-each-ref --format="%(if) %(then) %(else)" && | |
355 | test_must_fail git for-each-ref --format="%(if) %(else) %(then) %(end)" && | |
356 | test_must_fail git for-each-ref --format="%(if) %(then) %(else) %(else) %(end)" && | |
357 | test_must_fail git for-each-ref --format="%(if) %(end)" | |
358 | ' | |
359 | ||
360 | test_expect_success 'check %(if)...%(then)...%(end) atoms' ' | |
361 | git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Author: %(authorname)%(end)" >actual && | |
362 | cat >expect <<-\EOF && | |
363 | refs/heads/master Author: A U Thor | |
364 | refs/heads/side Author: A U Thor | |
365 | refs/odd/spot Author: A U Thor | |
366 | refs/tags/annotated-tag | |
367 | refs/tags/doubly-annotated-tag | |
368 | refs/tags/doubly-signed-tag | |
369 | refs/tags/foo1.10 Author: A U Thor | |
370 | refs/tags/foo1.3 Author: A U Thor | |
371 | refs/tags/foo1.6 Author: A U Thor | |
372 | refs/tags/four Author: A U Thor | |
373 | refs/tags/one Author: A U Thor | |
374 | refs/tags/signed-tag | |
375 | refs/tags/three Author: A U Thor | |
376 | refs/tags/two Author: A U Thor | |
377 | EOF | |
378 | test_cmp expect actual | |
379 | ' | |
380 | ||
381 | test_expect_success 'check %(if)...%(then)...%(else)...%(end) atoms' ' | |
382 | git for-each-ref --format="%(if)%(authorname)%(then)%(authorname)%(else)No author%(end): %(refname)" >actual && | |
383 | cat >expect <<-\EOF && | |
384 | A U Thor: refs/heads/master | |
385 | A U Thor: refs/heads/side | |
386 | A U Thor: refs/odd/spot | |
387 | No author: refs/tags/annotated-tag | |
388 | No author: refs/tags/doubly-annotated-tag | |
389 | No author: refs/tags/doubly-signed-tag | |
390 | A U Thor: refs/tags/foo1.10 | |
391 | A U Thor: refs/tags/foo1.3 | |
392 | A U Thor: refs/tags/foo1.6 | |
393 | A U Thor: refs/tags/four | |
394 | A U Thor: refs/tags/one | |
395 | No author: refs/tags/signed-tag | |
396 | A U Thor: refs/tags/three | |
397 | A U Thor: refs/tags/two | |
398 | EOF | |
399 | test_cmp expect actual | |
400 | ' | |
401 | test_expect_success 'ignore spaces in %(if) atom usage' ' | |
402 | git for-each-ref --format="%(refname:short): %(if)%(HEAD)%(then)Head ref%(else)Not Head ref%(end)" >actual && | |
403 | cat >expect <<-\EOF && | |
404 | master: Head ref | |
405 | side: Not Head ref | |
406 | odd/spot: Not Head ref | |
407 | annotated-tag: Not Head ref | |
408 | doubly-annotated-tag: Not Head ref | |
409 | doubly-signed-tag: Not Head ref | |
410 | foo1.10: Not Head ref | |
411 | foo1.3: Not Head ref | |
412 | foo1.6: Not Head ref | |
413 | four: Not Head ref | |
414 | one: Not Head ref | |
415 | signed-tag: Not Head ref | |
416 | three: Not Head ref | |
417 | two: Not Head ref | |
418 | EOF | |
419 | test_cmp expect actual | |
420 | ' | |
421 | ||
4f3e3b37 KN |
422 | test_expect_success 'check %(if:equals=<string>)' ' |
423 | git for-each-ref --format="%(if:equals=master)%(refname:short)%(then)Found master%(else)Not master%(end)" refs/heads/ >actual && | |
424 | cat >expect <<-\EOF && | |
425 | Found master | |
426 | Not master | |
427 | EOF | |
428 | test_cmp expect actual | |
429 | ' | |
430 | ||
431 | test_expect_success 'check %(if:notequals=<string>)' ' | |
432 | git for-each-ref --format="%(if:notequals=master)%(refname:short)%(then)Not master%(else)Found master%(end)" refs/heads/ >actual && | |
433 | cat >expect <<-\EOF && | |
434 | Found master | |
435 | Not master | |
436 | EOF | |
437 | test_cmp expect actual | |
438 | ' | |
439 | ||
17d6c744 ÆAB |
440 | test_expect_success '--merged is incompatible with --no-merged' ' |
441 | test_must_fail git for-each-ref --merged HEAD --no-merged HEAD | |
442 | ' | |
443 | ||
af83bafa | 444 | test_done |