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