1#!/bin/sh
2
3test_description='.mailmap configurations'
4
5. ./test-lib.sh
6
7fuzz_blame () {
8 sed "
9 s/$_x05[0-9a-f][0-9a-f][0-9a-f]/OBJID/g
10 s/$_x05[0-9a-f][0-9a-f]/OBJI/g
11 s/[-0-9]\{10\} [:0-9]\{8\} [-+][0-9]\{4\}/DATE/g
12 " "$@"
13}
14
15test_expect_success setup '
16 cat >contacts <<-\EOF &&
17 A U Thor <author@example.com>
18 nick1 <bugs@company.xx>
19 EOF
20
21 echo one >one &&
22 git add one &&
23 test_tick &&
24 git commit -m initial &&
25 echo two >>one &&
26 git add one &&
27 test_tick &&
28 git commit --author "nick1 <bugs@company.xx>" -m second
29'
30
31test_expect_success 'check-mailmap no arguments' '
32 test_must_fail git check-mailmap
33'
34
35test_expect_success 'check-mailmap arguments' '
36 cat >expect <<-\EOF &&
37 A U Thor <author@example.com>
38 nick1 <bugs@company.xx>
39 EOF
40 git check-mailmap \
41 "A U Thor <author@example.com>" \
42 "nick1 <bugs@company.xx>" >actual &&
43 test_cmp expect actual
44'
45
46test_expect_success 'check-mailmap --stdin' '
47 cat >expect <<-\EOF &&
48 A U Thor <author@example.com>
49 nick1 <bugs@company.xx>
50 EOF
51 git check-mailmap --stdin <contacts >actual &&
52 test_cmp expect actual
53'
54
55test_expect_success 'check-mailmap --stdin arguments' '
56 cat >expect <<-\EOF &&
57 Internal Guy <bugs@company.xy>
58 EOF
59 cat <contacts >>expect &&
60 git check-mailmap --stdin "Internal Guy <bugs@company.xy>" \
61 <contacts >actual &&
62 test_cmp expect actual
63'
64
65test_expect_success 'check-mailmap bogus contact' '
66 test_must_fail git check-mailmap bogus
67'
68
69cat >expect <<\EOF
70A U Thor (1):
71 initial
72
73nick1 (1):
74 second
75
76EOF
77
78test_expect_success 'No mailmap' '
79 git shortlog HEAD >actual &&
80 test_cmp expect actual
81'
82
83cat >expect <<\EOF
84Repo Guy (1):
85 initial
86
87nick1 (1):
88 second
89
90EOF
91
92test_expect_success 'default .mailmap' '
93 echo "Repo Guy <author@example.com>" > .mailmap &&
94 git shortlog HEAD >actual &&
95 test_cmp expect actual
96'
97
98# Using a mailmap file in a subdirectory of the repo here, but
99# could just as well have been a file outside of the repository
100cat >expect <<\EOF
101Internal Guy (1):
102 second
103
104Repo Guy (1):
105 initial
106
107EOF
108test_expect_success 'mailmap.file set' '
109 mkdir -p internal_mailmap &&
110 echo "Internal Guy <bugs@company.xx>" > internal_mailmap/.mailmap &&
111 git config mailmap.file internal_mailmap/.mailmap &&
112 git shortlog HEAD >actual &&
113 test_cmp expect actual
114'
115
116cat >expect <<\EOF
117External Guy (1):
118 initial
119
120Internal Guy (1):
121 second
122
123EOF
124test_expect_success 'mailmap.file override' '
125 echo "External Guy <author@example.com>" >> internal_mailmap/.mailmap &&
126 git config mailmap.file internal_mailmap/.mailmap &&
127 git shortlog HEAD >actual &&
128 test_cmp expect actual
129'
130
131cat >expect <<\EOF
132Repo Guy (1):
133 initial
134
135nick1 (1):
136 second
137
138EOF
139
140test_expect_success 'mailmap.file non-existent' '
141 rm internal_mailmap/.mailmap &&
142 rmdir internal_mailmap &&
143 git shortlog HEAD >actual &&
144 test_cmp expect actual
145'
146
147cat >expect <<\EOF
148Internal Guy (1):
149 second
150
151Repo Guy (1):
152 initial
153
154EOF
155
156test_expect_success 'name entry after email entry' '
157 mkdir -p internal_mailmap &&
158 echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
159 echo "Internal Guy <bugs@company.xx>" >>internal_mailmap/.mailmap &&
160 git shortlog HEAD >actual &&
161 test_cmp expect actual
162'
163
164cat >expect <<\EOF
165Internal Guy (1):
166 second
167
168Repo Guy (1):
169 initial
170
171EOF
172
173test_expect_success 'name entry after email entry, case-insensitive' '
174 mkdir -p internal_mailmap &&
175 echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
176 echo "Internal Guy <BUGS@Company.xx>" >>internal_mailmap/.mailmap &&
177 git shortlog HEAD >actual &&
178 test_cmp expect actual
179'
180
181cat >expect <<\EOF
182A U Thor (1):
183 initial
184
185nick1 (1):
186 second
187
188EOF
189test_expect_success 'No mailmap files, but configured' '
190 rm -f .mailmap internal_mailmap/.mailmap &&
191 git shortlog HEAD >actual &&
192 test_cmp expect actual
193'
194
195test_expect_success 'setup mailmap blob tests' '
196 git checkout -b map &&
197 test_when_finished "git checkout master" &&
198 cat >just-bugs <<-\EOF &&
199 Blob Guy <bugs@company.xx>
200 EOF
201 cat >both <<-\EOF &&
202 Blob Guy <author@example.com>
203 Blob Guy <bugs@company.xx>
204 EOF
205 git add just-bugs both &&
206 git commit -m "my mailmaps" &&
207 echo "Repo Guy <author@example.com>" >.mailmap &&
208 echo "Internal Guy <author@example.com>" >internal.map
209'
210
211test_expect_success 'mailmap.blob set' '
212 cat >expect <<-\EOF &&
213 Blob Guy (1):
214 second
215
216 Repo Guy (1):
217 initial
218
219 EOF
220 git -c mailmap.blob=map:just-bugs shortlog HEAD >actual &&
221 test_cmp expect actual
222'
223
224test_expect_success 'mailmap.blob overrides .mailmap' '
225 cat >expect <<-\EOF &&
226 Blob Guy (2):
227 initial
228 second
229
230 EOF
231 git -c mailmap.blob=map:both shortlog HEAD >actual &&
232 test_cmp expect actual
233'
234
235test_expect_success 'mailmap.file overrides mailmap.blob' '
236 cat >expect <<-\EOF &&
237 Blob Guy (1):
238 second
239
240 Internal Guy (1):
241 initial
242
243 EOF
244 git \
245 -c mailmap.blob=map:both \
246 -c mailmap.file=internal.map \
247 shortlog HEAD >actual &&
248 test_cmp expect actual
249'
250
251test_expect_success 'mailmap.blob can be missing' '
252 cat >expect <<-\EOF &&
253 Repo Guy (1):
254 initial
255
256 nick1 (1):
257 second
258
259 EOF
260 git -c mailmap.blob=map:nonexistent shortlog HEAD >actual &&
261 test_cmp expect actual
262'
263
264test_expect_success 'mailmap.blob defaults to off in non-bare repo' '
265 git init non-bare &&
266 (
267 cd non-bare &&
268 test_commit one .mailmap "Fake Name <author@example.com>" &&
269 echo " 1 Fake Name" >expect &&
270 git shortlog -ns HEAD >actual &&
271 test_cmp expect actual &&
272 rm .mailmap &&
273 echo " 1 A U Thor" >expect &&
274 git shortlog -ns HEAD >actual &&
275 test_cmp expect actual
276 )
277'
278
279test_expect_success 'mailmap.blob defaults to HEAD:.mailmap in bare repo' '
280 git clone --bare non-bare bare &&
281 (
282 cd bare &&
283 echo " 1 Fake Name" >expect &&
284 git shortlog -ns HEAD >actual &&
285 test_cmp expect actual
286 )
287'
288
289test_expect_success 'cleanup after mailmap.blob tests' '
290 rm -f .mailmap
291'
292
293test_expect_success 'single-character name' '
294 echo " 1 A <author@example.com>" >expect &&
295 echo " 1 nick1 <bugs@company.xx>" >>expect &&
296 echo "A <author@example.com>" >.mailmap &&
297 test_when_finished "rm .mailmap" &&
298 git shortlog -es HEAD >actual &&
299 test_cmp expect actual
300'
301
302test_expect_success 'preserve canonical email case' '
303 echo " 1 A U Thor <AUTHOR@example.com>" >expect &&
304 echo " 1 nick1 <bugs@company.xx>" >>expect &&
305 echo "<AUTHOR@example.com> <author@example.com>" >.mailmap &&
306 test_when_finished "rm .mailmap" &&
307 git shortlog -es HEAD >actual &&
308 test_cmp expect actual
309'
310
311# Extended mailmap configurations should give us the following output for shortlog
312cat >expect <<\EOF
313A U Thor <author@example.com> (1):
314 initial
315
316CTO <cto@company.xx> (1):
317 seventh
318
319Other Author <other@author.xx> (2):
320 third
321 fourth
322
323Santa Claus <santa.claus@northpole.xx> (2):
324 fifth
325 sixth
326
327Some Dude <some@dude.xx> (1):
328 second
329
330EOF
331
332test_expect_success 'Shortlog output (complex mapping)' '
333 echo three >>one &&
334 git add one &&
335 test_tick &&
336 git commit --author "nick2 <bugs@company.xx>" -m third &&
337
338 echo four >>one &&
339 git add one &&
340 test_tick &&
341 git commit --author "nick2 <nick2@company.xx>" -m fourth &&
342
343 echo five >>one &&
344 git add one &&
345 test_tick &&
346 git commit --author "santa <me@company.xx>" -m fifth &&
347
348 echo six >>one &&
349 git add one &&
350 test_tick &&
351 git commit --author "claus <me@company.xx>" -m sixth &&
352
353 echo seven >>one &&
354 git add one &&
355 test_tick &&
356 git commit --author "CTO <cto@coompany.xx>" -m seventh &&
357
358 mkdir -p internal_mailmap &&
359 echo "Committed <committer@example.com>" > internal_mailmap/.mailmap &&
360 echo "<cto@company.xx> <cto@coompany.xx>" >> internal_mailmap/.mailmap &&
361 echo "Some Dude <some@dude.xx> nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
362 echo "Other Author <other@author.xx> nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
363 echo "Other Author <other@author.xx> <nick2@company.xx>" >> internal_mailmap/.mailmap &&
364 echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
365 echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
366
367 git shortlog -e HEAD >actual &&
368 test_cmp expect actual
369
370'
371
372# git log with --pretty format which uses the name and email mailmap placemarkers
373cat >expect <<\EOF
374Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
375Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
376
377Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
378Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
379
380Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
381Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
382
383Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
384Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
385
386Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
387Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
388
389Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
390Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
391
392Author A U Thor <author@example.com> maps to A U Thor <author@example.com>
393Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
394EOF
395
396test_expect_success 'Log output (complex mapping)' '
397 git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
398 test_cmp expect actual
399'
400
401cat >expect <<\EOF
402Author: CTO <cto@company.xx>
403Author: Santa Claus <santa.claus@northpole.xx>
404Author: Santa Claus <santa.claus@northpole.xx>
405Author: Other Author <other@author.xx>
406Author: Other Author <other@author.xx>
407Author: Some Dude <some@dude.xx>
408Author: A U Thor <author@example.com>
409EOF
410
411test_expect_success 'Log output with --use-mailmap' '
412 git log --use-mailmap | grep Author >actual &&
413 test_cmp expect actual
414'
415
416cat >expect <<\EOF
417Author: CTO <cto@company.xx>
418Author: Santa Claus <santa.claus@northpole.xx>
419Author: Santa Claus <santa.claus@northpole.xx>
420Author: Other Author <other@author.xx>
421Author: Other Author <other@author.xx>
422Author: Some Dude <some@dude.xx>
423Author: A U Thor <author@example.com>
424EOF
425
426test_expect_success 'Log output with log.mailmap' '
427 git -c log.mailmap=True log | grep Author >actual &&
428 test_cmp expect actual
429'
430
431cat >expect <<\EOF
432Author: Santa Claus <santa.claus@northpole.xx>
433Author: Santa Claus <santa.claus@northpole.xx>
434EOF
435
436test_expect_success 'Grep author with --use-mailmap' '
437 git log --use-mailmap --author Santa | grep Author >actual &&
438 test_cmp expect actual
439'
440cat >expect <<\EOF
441Author: Santa Claus <santa.claus@northpole.xx>
442Author: Santa Claus <santa.claus@northpole.xx>
443EOF
444
445test_expect_success 'Grep author with log.mailmap' '
446 git -c log.mailmap=True log --author Santa | grep Author >actual &&
447 test_cmp expect actual
448'
449
450>expect
451
452test_expect_success 'Only grep replaced author with --use-mailmap' '
453 git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
454 test_cmp expect actual
455'
456
457# git blame
458cat >expect <<\EOF
459^OBJI (A U Thor DATE 1) one
460OBJID (Some Dude DATE 2) two
461OBJID (Other Author DATE 3) three
462OBJID (Other Author DATE 4) four
463OBJID (Santa Claus DATE 5) five
464OBJID (Santa Claus DATE 6) six
465OBJID (CTO DATE 7) seven
466EOF
467test_expect_success 'Blame output (complex mapping)' '
468 git blame one >actual &&
469 fuzz_blame actual >actual.fuzz &&
470 test_cmp expect actual.fuzz
471'
472
473test_done