1#!/bin/sh
2
3test_description='test for-each-refs usage of ref-filter APIs'
4
5. ./test-lib.sh
6. "$TEST_DIRECTORY"/lib-gpg.sh
7
8if ! test_have_prereq GPG
9then
10 skip_all="skipping for-each-ref tests, GPG not available"
11 test_done
12fi
13
14test_expect_success 'setup some history and refs' '
15 test_commit one &&
16 test_commit two &&
17 test_commit three &&
18 git checkout -b side &&
19 test_commit four &&
20 git tag -s -m "A signed tag" signed-tag &&
21 git tag -s -m "Signed doubly" doubly-signed-tag signed-tag &&
22 git checkout master &&
23 git update-ref refs/odd/spot master
24'
25
26test_expect_success 'filtering with --points-at' '
27 cat >expect <<-\EOF &&
28 refs/heads/master
29 refs/odd/spot
30 refs/tags/three
31 EOF
32 git for-each-ref --format="%(refname)" --points-at=master >actual &&
33 test_cmp expect actual
34'
35
36test_expect_success 'check signed tags with --points-at' '
37 sed -e "s/Z$//" >expect <<-\EOF &&
38 refs/heads/side Z
39 refs/tags/four Z
40 refs/tags/signed-tag four
41 EOF
42 git for-each-ref --format="%(refname) %(*subject)" --points-at=side >actual &&
43 test_cmp expect actual
44'
45
46test_expect_success 'filtering with --merged' '
47 cat >expect <<-\EOF &&
48 refs/heads/master
49 refs/odd/spot
50 refs/tags/one
51 refs/tags/three
52 refs/tags/two
53 EOF
54 git for-each-ref --format="%(refname)" --merged=master >actual &&
55 test_cmp expect actual
56'
57
58test_expect_success 'filtering with --no-merged' '
59 cat >expect <<-\EOF &&
60 refs/heads/side
61 refs/tags/doubly-signed-tag
62 refs/tags/four
63 refs/tags/signed-tag
64 EOF
65 git for-each-ref --format="%(refname)" --no-merged=master >actual &&
66 test_cmp expect actual
67'
68
69test_expect_success 'filtering with --contains' '
70 cat >expect <<-\EOF &&
71 refs/heads/master
72 refs/heads/side
73 refs/odd/spot
74 refs/tags/doubly-signed-tag
75 refs/tags/four
76 refs/tags/signed-tag
77 refs/tags/three
78 refs/tags/two
79 EOF
80 git for-each-ref --format="%(refname)" --contains=two >actual &&
81 test_cmp expect actual
82'
83
84test_expect_success '%(color) must fail' '
85 test_must_fail git for-each-ref --format="%(color)%(refname)"
86'
87
88test_expect_success 'left alignment is default' '
89 cat >expect <<-\EOF &&
90 refname is refs/heads/master |refs/heads/master
91 refname is refs/heads/side |refs/heads/side
92 refname is refs/odd/spot |refs/odd/spot
93 refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
94 refname is refs/tags/four |refs/tags/four
95 refname is refs/tags/one |refs/tags/one
96 refname is refs/tags/signed-tag|refs/tags/signed-tag
97 refname is refs/tags/three |refs/tags/three
98 refname is refs/tags/two |refs/tags/two
99 EOF
100 git for-each-ref --format="%(align:30)refname is %(refname)%(end)|%(refname)" >actual &&
101 test_cmp expect actual
102'
103
104test_expect_success 'middle alignment' '
105 cat >expect <<-\EOF &&
106 | refname is refs/heads/master |refs/heads/master
107 | refname is refs/heads/side |refs/heads/side
108 | refname is refs/odd/spot |refs/odd/spot
109 |refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
110 | refname is refs/tags/four |refs/tags/four
111 | refname is refs/tags/one |refs/tags/one
112 |refname is refs/tags/signed-tag|refs/tags/signed-tag
113 | refname is refs/tags/three |refs/tags/three
114 | refname is refs/tags/two |refs/tags/two
115 EOF
116 git for-each-ref --format="|%(align:middle,30)refname is %(refname)%(end)|%(refname)" >actual &&
117 test_cmp expect actual
118'
119
120test_expect_success 'right alignment' '
121 cat >expect <<-\EOF &&
122 | refname is refs/heads/master|refs/heads/master
123 | refname is refs/heads/side|refs/heads/side
124 | refname is refs/odd/spot|refs/odd/spot
125 |refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
126 | refname is refs/tags/four|refs/tags/four
127 | refname is refs/tags/one|refs/tags/one
128 |refname is refs/tags/signed-tag|refs/tags/signed-tag
129 | refname is refs/tags/three|refs/tags/three
130 | refname is refs/tags/two|refs/tags/two
131 EOF
132 git for-each-ref --format="|%(align:30,right)refname is %(refname)%(end)|%(refname)" >actual &&
133 test_cmp expect actual
134'
135
136cat >expect <<-\EOF
137| refname is refs/heads/master |refs/heads/master
138| refname is refs/heads/side |refs/heads/side
139| refname is refs/odd/spot |refs/odd/spot
140| refname is refs/tags/doubly-signed-tag |refs/tags/doubly-signed-tag
141| refname is refs/tags/four |refs/tags/four
142| refname is refs/tags/one |refs/tags/one
143| refname is refs/tags/signed-tag |refs/tags/signed-tag
144| refname is refs/tags/three |refs/tags/three
145| refname is refs/tags/two |refs/tags/two
146EOF
147
148test_align_permutations() {
149 while read -r option
150 do
151 test_expect_success "align:$option" '
152 git for-each-ref --format="|%(align:$option)refname is %(refname)%(end)|%(refname)" >actual &&
153 test_cmp expect actual
154 '
155 done
156}
157
158test_align_permutations <<-\EOF
159 middle,42
160 42,middle
161 position=middle,42
162 42,position=middle
163 middle,width=42
164 width=42,middle
165 position=middle,width=42
166 width=42,position=middle
167EOF
168
169# Last one wins (silently) when multiple arguments of the same type are given
170
171test_align_permutations <<-\EOF
172 32,width=42,middle
173 width=30,42,middle
174 width=42,position=right,middle
175 42,right,position=middle
176EOF
177
178# Individual atoms inside %(align:...) and %(end) must not be quoted.
179
180test_expect_success 'alignment with format quote' "
181 cat >expect <<-\EOF &&
182 |' '\''master| A U Thor'\'' '|
183 |' '\''side| A U Thor'\'' '|
184 |' '\''odd/spot| A U Thor'\'' '|
185 |' '\''doubly-signed-tag| '\'' '|
186 |' '\''four| A U Thor'\'' '|
187 |' '\''one| A U Thor'\'' '|
188 |' '\''signed-tag| '\'' '|
189 |' '\''three| A U Thor'\'' '|
190 |' '\''two| A U Thor'\'' '|
191 EOF
192 git for-each-ref --shell --format=\"|%(align:30,middle)'%(refname:short)| %(authorname)'%(end)|\" >actual &&
193 test_cmp expect actual
194"
195
196test_expect_success 'nested alignment with quote formatting' "
197 cat >expect <<-\EOF &&
198 |' master '|
199 |' side '|
200 |' odd/spot '|
201 |'doubly-signed-tag '|
202 |' four '|
203 |' one '|
204 |' signed-tag '|
205 |' three '|
206 |' two '|
207 EOF
208 git for-each-ref --shell --format='|%(align:30,left)%(align:15,right)%(refname:short)%(end)%(end)|' >actual &&
209 test_cmp expect actual
210"
211
212test_expect_success 'check `%(contents:lines=1)`' '
213 cat >expect <<-\EOF &&
214 master |three
215 side |four
216 odd/spot |three
217 doubly-signed-tag |Signed doubly
218 four |four
219 one |one
220 signed-tag |A signed tag
221 three |three
222 two |two
223 EOF
224 git for-each-ref --format="%(refname:short) |%(contents:lines=1)" >actual &&
225 test_cmp expect actual
226'
227
228test_expect_success 'check `%(contents:lines=0)`' '
229 cat >expect <<-\EOF &&
230 master |
231 side |
232 odd/spot |
233 doubly-signed-tag |
234 four |
235 one |
236 signed-tag |
237 three |
238 two |
239 EOF
240 git for-each-ref --format="%(refname:short) |%(contents:lines=0)" >actual &&
241 test_cmp expect actual
242'
243
244test_expect_success 'check `%(contents:lines=99999)`' '
245 cat >expect <<-\EOF &&
246 master |three
247 side |four
248 odd/spot |three
249 doubly-signed-tag |Signed doubly
250 four |four
251 one |one
252 signed-tag |A signed tag
253 three |three
254 two |two
255 EOF
256 git for-each-ref --format="%(refname:short) |%(contents:lines=99999)" >actual &&
257 test_cmp expect actual
258'
259
260test_expect_success '`%(contents:lines=-1)` should fail' '
261 test_must_fail git for-each-ref --format="%(refname:short) |%(contents:lines=-1)"
262'
263
264test_expect_success 'setup for version sort' '
265 test_commit foo1.3 &&
266 test_commit foo1.6 &&
267 test_commit foo1.10
268'
269
270test_expect_success 'version sort' '
271 git for-each-ref --sort=version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
272 cat >expect <<-\EOF &&
273 foo1.3
274 foo1.6
275 foo1.10
276 EOF
277 test_cmp expect actual
278'
279
280test_expect_success 'version sort (shortened)' '
281 git for-each-ref --sort=v:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
282 cat >expect <<-\EOF &&
283 foo1.3
284 foo1.6
285 foo1.10
286 EOF
287 test_cmp expect actual
288'
289
290test_expect_success 'reverse version sort' '
291 git for-each-ref --sort=-version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
292 cat >expect <<-\EOF &&
293 foo1.10
294 foo1.6
295 foo1.3
296 EOF
297 test_cmp expect actual
298'
299
300test_done