t4205, t6006, t7102: make functions better readable
[git/git.git] / t / t4205-log-pretty-formats.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2010, Will Palmer
4 # Copyright (c) 2011, Alexey Shumkin (+ non-UTF-8 commit encoding tests)
5 #
6
7 test_description='Test pretty formats'
8 . ./test-lib.sh
9
10 commit_msg () {
11 # String "initial. initial" partly in German
12 # (translated with Google Translate),
13 # encoded in UTF-8, used as a commit log message below.
14 msg=$(printf "initial. anf\303\244nglich")
15 if test -n "$1"
16 then
17 msg=$(echo $msg | iconv -f utf-8 -t $1)
18 fi
19 if test -n "$2" -a -n "$3"
20 then
21 # cut string, replace cut part with two dots
22 # $2 - chars count from the beginning of the string
23 # $3 - "trailing" chars
24 # LC_ALL is set to make `sed` interpret "." as a UTF-8 char not a byte
25 # as it does with C locale
26 msg=$(echo $msg | LC_ALL=en_US.UTF-8 sed -e "s/^\(.\{$2\}\)$3/\1../")
27 fi
28 echo $msg
29 }
30
31 test_expect_success 'set up basic repos' '
32 >foo &&
33 >bar &&
34 git add foo &&
35 test_tick &&
36 git config i18n.commitEncoding iso8859-1 &&
37 git commit -m "$(commit_msg iso8859-1)" &&
38 git add bar &&
39 test_tick &&
40 git commit -m "add bar" &&
41 git config --unset i18n.commitEncoding
42 '
43
44 test_expect_success 'alias builtin format' '
45 git log --pretty=oneline >expected &&
46 git config pretty.test-alias oneline &&
47 git log --pretty=test-alias >actual &&
48 test_cmp expected actual
49 '
50
51 test_expect_success 'alias masking builtin format' '
52 git log --pretty=oneline >expected &&
53 git config pretty.oneline "%H" &&
54 git log --pretty=oneline >actual &&
55 test_cmp expected actual
56 '
57
58 test_expect_success 'alias user-defined format' '
59 git log --pretty="format:%h" >expected &&
60 git config pretty.test-alias "format:%h" &&
61 git log --pretty=test-alias >actual &&
62 test_cmp expected actual
63 '
64
65 test_expect_success 'alias user-defined tformat with %s (iso8859-1 encoding)' '
66 git config i18n.logOutputEncoding iso8859-1 &&
67 git log --oneline >expected-s &&
68 git log --pretty="tformat:%h %s" >actual-s &&
69 git config --unset i18n.logOutputEncoding &&
70 test_cmp expected-s actual-s
71 '
72
73 test_expect_success 'alias user-defined tformat with %s (utf-8 encoding)' '
74 git log --oneline >expected-s &&
75 git log --pretty="tformat:%h %s" >actual-s &&
76 test_cmp expected-s actual-s
77 '
78
79 test_expect_success 'alias user-defined tformat' '
80 git log --pretty="tformat:%h" >expected &&
81 git config pretty.test-alias "tformat:%h" &&
82 git log --pretty=test-alias >actual &&
83 test_cmp expected actual
84 '
85
86 test_expect_success 'alias non-existent format' '
87 git config pretty.test-alias format-that-will-never-exist &&
88 test_must_fail git log --pretty=test-alias
89 '
90
91 test_expect_success 'alias of an alias' '
92 git log --pretty="tformat:%h" >expected &&
93 git config pretty.test-foo "tformat:%h" &&
94 git config pretty.test-bar test-foo &&
95 git log --pretty=test-bar >actual && test_cmp expected actual
96 '
97
98 test_expect_success 'alias masking an alias' '
99 git log --pretty=format:"Two %H" >expected &&
100 git config pretty.duplicate "format:One %H" &&
101 git config --add pretty.duplicate "format:Two %H" &&
102 git log --pretty=duplicate >actual &&
103 test_cmp expected actual
104 '
105
106 test_expect_success 'alias loop' '
107 git config pretty.test-foo test-bar &&
108 git config pretty.test-bar test-foo &&
109 test_must_fail git log --pretty=test-foo
110 '
111
112 test_expect_success 'NUL separation' '
113 printf "add bar\0$(commit_msg)" >expected &&
114 git log -z --pretty="format:%s" >actual &&
115 test_cmp expected actual
116 '
117
118 test_expect_success 'NUL termination' '
119 printf "add bar\0$(commit_msg)\0" >expected &&
120 git log -z --pretty="tformat:%s" >actual &&
121 test_cmp expected actual
122 '
123
124 test_expect_success 'NUL separation with --stat' '
125 stat0_part=$(git diff --stat HEAD^ HEAD) &&
126 stat1_part=$(git diff-tree --no-commit-id --stat --root HEAD^) &&
127 printf "add bar\n$stat0_part\n\0$(commit_msg)\n$stat1_part\n" >expected &&
128 git log -z --stat --pretty="format:%s" >actual &&
129 test_i18ncmp expected actual
130 '
131
132 test_expect_failure 'NUL termination with --stat' '
133 stat0_part=$(git diff --stat HEAD^ HEAD) &&
134 stat1_part=$(git diff-tree --no-commit-id --stat --root HEAD^) &&
135 printf "add bar\n$stat0_part\n\0$(commit_msg)\n$stat1_part\n0" >expected &&
136 git log -z --stat --pretty="tformat:%s" >actual &&
137 test_i18ncmp expected actual
138 '
139
140 test_expect_success 'setup more commits' '
141 test_commit "message one" one one message-one &&
142 test_commit "message two" two two message-two &&
143 head1=$(git rev-parse --verify --short HEAD~0) &&
144 head2=$(git rev-parse --verify --short HEAD~1) &&
145 head3=$(git rev-parse --verify --short HEAD~2) &&
146 head4=$(git rev-parse --verify --short HEAD~3)
147 '
148
149 test_expect_success 'left alignment formatting' '
150 git log --pretty="format:%<(40)%s" >actual &&
151 # complete the incomplete line at the end
152 echo >>actual &&
153 qz_to_tab_space <<EOF >expected &&
154 message two Z
155 message one Z
156 add bar Z
157 $(commit_msg) Z
158 EOF
159 test_cmp expected actual
160 '
161
162 test_expect_success 'left alignment formatting at the nth column' '
163 git log --pretty="format:%h %<|(40)%s" >actual &&
164 # complete the incomplete line at the end
165 echo >>actual &&
166 qz_to_tab_space <<EOF >expected &&
167 $head1 message two Z
168 $head2 message one Z
169 $head3 add bar Z
170 $head4 $(commit_msg) Z
171 EOF
172 test_cmp expected actual
173 '
174
175 test_expect_success 'left alignment formatting with no padding' '
176 git log --pretty="format:%<(1)%s" >actual &&
177 # complete the incomplete line at the end
178 echo >>actual &&
179 cat <<EOF >expected &&
180 message two
181 message one
182 add bar
183 $(commit_msg)
184 EOF
185 test_cmp expected actual
186 '
187
188 test_expect_success 'left alignment formatting with trunc' '
189 git log --pretty="format:%<(10,trunc)%s" >actual &&
190 # complete the incomplete line at the end
191 echo >>actual &&
192 qz_to_tab_space <<EOF >expected &&
193 message ..
194 message ..
195 add bar Z
196 $(commit_msg "" "8" "..*$")
197 EOF
198 test_cmp expected actual
199 '
200
201 test_expect_success 'left alignment formatting with ltrunc' '
202 git log --pretty="format:%<(10,ltrunc)%s" >actual &&
203 # complete the incomplete line at the end
204 echo >>actual &&
205 qz_to_tab_space <<EOF >expected &&
206 ..sage two
207 ..sage one
208 add bar Z
209 $(commit_msg "" "0" ".\{11\}")
210 EOF
211 test_cmp expected actual
212 '
213
214 test_expect_success 'left alignment formatting with mtrunc' '
215 git log --pretty="format:%<(10,mtrunc)%s" >actual &&
216 # complete the incomplete line at the end
217 echo >>actual &&
218 qz_to_tab_space <<EOF >expected &&
219 mess.. two
220 mess.. one
221 add bar Z
222 $(commit_msg "" "4" ".\{11\}")
223 EOF
224 test_cmp expected actual
225 '
226
227 test_expect_success 'right alignment formatting' '
228 git log --pretty="format:%>(40)%s" >actual &&
229 # complete the incomplete line at the end
230 echo >>actual &&
231 qz_to_tab_space <<EOF >expected &&
232 Z message two
233 Z message one
234 Z add bar
235 Z $(commit_msg)
236 EOF
237 test_cmp expected actual
238 '
239
240 test_expect_success 'right alignment formatting at the nth column' '
241 git log --pretty="format:%h %>|(40)%s" >actual &&
242 # complete the incomplete line at the end
243 echo >>actual &&
244 qz_to_tab_space <<EOF >expected &&
245 $head1 message two
246 $head2 message one
247 $head3 add bar
248 $head4 $(commit_msg)
249 EOF
250 test_cmp expected actual
251 '
252
253 test_expect_success 'right alignment formatting with no padding' '
254 git log --pretty="format:%>(1)%s" >actual &&
255 # complete the incomplete line at the end
256 echo >>actual &&
257 cat <<EOF >expected &&
258 message two
259 message one
260 add bar
261 $(commit_msg)
262 EOF
263 test_cmp expected actual
264 '
265
266 test_expect_success 'center alignment formatting' '
267 git log --pretty="format:%><(40)%s" >actual &&
268 # complete the incomplete line at the end
269 echo >>actual &&
270 qz_to_tab_space <<EOF >expected &&
271 Z message two Z
272 Z message one Z
273 Z add bar Z
274 Z $(commit_msg) Z
275 EOF
276 test_cmp expected actual
277 '
278
279 test_expect_success 'center alignment formatting at the nth column' '
280 git log --pretty="format:%h %><|(40)%s" >actual &&
281 # complete the incomplete line at the end
282 echo >>actual &&
283 qz_to_tab_space <<EOF >expected &&
284 $head1 message two Z
285 $head2 message one Z
286 $head3 add bar Z
287 $head4 $(commit_msg) Z
288 EOF
289 test_cmp expected actual
290 '
291
292 test_expect_success 'center alignment formatting with no padding' '
293 git log --pretty="format:%><(1)%s" >actual &&
294 # complete the incomplete line at the end
295 echo >>actual &&
296 cat <<EOF >expected &&
297 message two
298 message one
299 add bar
300 $(commit_msg)
301 EOF
302 test_cmp expected actual
303 '
304
305 test_expect_success 'left/right alignment formatting with stealing' '
306 git commit --amend -m short --author "long long long <long@me.com>" &&
307 git log --pretty="format:%<(10,trunc)%s%>>(10,ltrunc)% an" >actual &&
308 # complete the incomplete line at the end
309 echo >>actual &&
310 cat <<EOF >expected &&
311 short long long long
312 message .. A U Thor
313 add bar A U Thor
314 $(commit_msg "" "8" "..*$") A U Thor
315 EOF
316 test_cmp expected actual
317 '
318
319 test_done