3 test_description
='.mailmap configurations'
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
15 test_expect_success setup
'
19 git commit -m initial &&
23 git commit --author "nick1 <bugs@company.xx>" -m second
35 test_expect_success
'No mailmap' '
36 git shortlog HEAD >actual &&
37 test_cmp expect actual
49 test_expect_success
'default .mailmap' '
50 echo "Repo Guy <author@example.com>" > .mailmap &&
51 git shortlog HEAD >actual &&
52 test_cmp expect actual
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
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
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
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
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
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
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
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>
159 Blob Guy <author@example.com>
160 Blob Guy <bugs@company.xx>
162 printf "Tricky Guy <author@example.com>" >no-newline &&
163 git add just-bugs both no-newline &&
164 git commit -m "my mailmaps" &&
165 echo "Repo Guy <author@example.com>" >.mailmap &&
166 echo "Internal Guy <author@example.com>" >internal.map
169 test_expect_success
'mailmap.blob set' '
170 cat >expect <<-\EOF &&
178 git -c mailmap.blob=map:just-bugs shortlog HEAD >actual &&
179 test_cmp expect actual
182 test_expect_success
'mailmap.blob overrides .mailmap' '
183 cat >expect <<-\EOF &&
189 git -c mailmap.blob=map:both shortlog HEAD >actual &&
190 test_cmp expect actual
193 test_expect_success
'mailmap.file overrides mailmap.blob' '
194 cat >expect <<-\EOF &&
203 -c mailmap.blob=map:both \
204 -c mailmap.file=internal.map \
205 shortlog HEAD >actual &&
206 test_cmp expect actual
209 test_expect_success
'mailmap.blob can be missing' '
210 cat >expect <<-\EOF &&
218 git -c mailmap.blob=map:nonexistent shortlog HEAD >actual &&
219 test_cmp expect actual
222 test_expect_success
'mailmap.blob defaults to off in non-bare repo' '
226 test_commit one .mailmap "Fake Name <author@example.com>" &&
227 echo " 1 Fake Name" >expect &&
228 git shortlog -ns HEAD >actual &&
229 test_cmp expect actual &&
231 echo " 1 A U Thor" >expect &&
232 git shortlog -ns HEAD >actual &&
233 test_cmp expect actual
237 test_expect_success
'mailmap.blob defaults to HEAD:.mailmap in bare repo' '
238 git clone --bare non-bare bare &&
241 echo " 1 Fake Name" >expect &&
242 git shortlog -ns HEAD >actual &&
243 test_cmp expect actual
247 test_expect_success
'mailmap.blob can handle blobs without trailing newline' '
248 cat >expect <<-\EOF &&
256 git -c mailmap.blob=map:no-newline shortlog HEAD >actual &&
257 test_cmp expect actual
260 test_expect_success
'cleanup after mailmap.blob tests' '
264 # Extended mailmap configurations should give us the following output for shortlog
266 A U Thor
<author@example.com
> (1):
269 CTO
<cto@company.xx
> (1):
272 Other Author
<other@author.xx
> (2):
276 Santa Claus
<santa.claus@northpole.xx
> (2):
280 Some Dude
<some@dude.xx
> (1):
285 test_expect_success
'Shortlog output (complex mapping)' '
289 git commit --author "nick2 <bugs@company.xx>" -m third &&
294 git commit --author "nick2 <nick2@company.xx>" -m fourth &&
299 git commit --author "santa <me@company.xx>" -m fifth &&
304 git commit --author "claus <me@company.xx>" -m sixth &&
309 git commit --author "CTO <cto@coompany.xx>" -m seventh &&
311 mkdir -p internal_mailmap &&
312 echo "Committed <committer@example.com>" > internal_mailmap/.mailmap &&
313 echo "<cto@company.xx> <cto@coompany.xx>" >> internal_mailmap/.mailmap &&
314 echo "Some Dude <some@dude.xx> nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
315 echo "Other Author <other@author.xx> nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
316 echo "Other Author <other@author.xx> <nick2@company.xx>" >> internal_mailmap/.mailmap &&
317 echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
318 echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
320 git shortlog -e HEAD >actual &&
321 test_cmp expect actual
325 # git log with --pretty format which uses the name and email mailmap placemarkers
327 Author CTO
<cto@coompany.xx
> maps to CTO
<cto@company.xx
>
328 Committer C O Mitter
<committer@example.com
> maps to Committed
<committer@example.com
>
330 Author claus
<me@company.xx
> maps to Santa Claus
<santa.claus@northpole.xx
>
331 Committer C O Mitter
<committer@example.com
> maps to Committed
<committer@example.com
>
333 Author santa
<me@company.xx
> maps to Santa Claus
<santa.claus@northpole.xx
>
334 Committer C O Mitter
<committer@example.com
> maps to Committed
<committer@example.com
>
336 Author nick2
<nick2@company.xx
> maps to Other Author
<other@author.xx
>
337 Committer C O Mitter
<committer@example.com
> maps to Committed
<committer@example.com
>
339 Author nick2
<bugs@company.xx
> maps to Other Author
<other@author.xx
>
340 Committer C O Mitter
<committer@example.com
> maps to Committed
<committer@example.com
>
342 Author nick1
<bugs@company.xx
> maps to Some Dude
<some@dude.xx
>
343 Committer C O Mitter
<committer@example.com
> maps to Committed
<committer@example.com
>
345 Author A U Thor
<author@example.com
> maps to A U Thor
<author@example.com
>
346 Committer C O Mitter
<committer@example.com
> maps to Committed
<committer@example.com
>
349 test_expect_success
'Log output (complex mapping)' '
350 git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
351 test_cmp expect actual
355 Author
: CTO
<cto@company.xx
>
356 Author
: Santa Claus
<santa.claus@northpole.xx
>
357 Author
: Santa Claus
<santa.claus@northpole.xx
>
358 Author
: Other Author
<other@author.xx
>
359 Author
: Other Author
<other@author.xx
>
360 Author
: Some Dude
<some@dude.xx
>
361 Author
: A U Thor
<author@example.com
>
364 test_expect_success
'Log output with --use-mailmap' '
365 git log --use-mailmap | grep Author >actual &&
366 test_cmp expect actual
370 Author
: CTO
<cto@company.xx
>
371 Author
: Santa Claus
<santa.claus@northpole.xx
>
372 Author
: Santa Claus
<santa.claus@northpole.xx
>
373 Author
: Other Author
<other@author.xx
>
374 Author
: Other Author
<other@author.xx
>
375 Author
: Some Dude
<some@dude.xx
>
376 Author
: A U Thor
<author@example.com
>
379 test_expect_success
'Log output with log.mailmap' '
380 git -c log.mailmap=True log | grep Author >actual &&
381 test_cmp expect actual
385 Author
: Santa Claus
<santa.claus@northpole.xx
>
386 Author
: Santa Claus
<santa.claus@northpole.xx
>
389 test_expect_success
'Grep author with --use-mailmap' '
390 git log --use-mailmap --author Santa | grep Author >actual &&
391 test_cmp expect actual
394 Author
: Santa Claus
<santa.claus@northpole.xx
>
395 Author
: Santa Claus
<santa.claus@northpole.xx
>
398 test_expect_success
'Grep author with log.mailmap' '
399 git -c log.mailmap=True log --author Santa | grep Author >actual &&
400 test_cmp expect actual
405 test_expect_success
'Only grep replaced author with --use-mailmap' '
406 git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
407 test_cmp expect actual
412 ^OBJI
(A U Thor DATE
1) one
413 OBJID
(Some Dude DATE
2) two
414 OBJID
(Other Author DATE
3) three
415 OBJID
(Other Author DATE
4) four
416 OBJID
(Santa Claus DATE
5) five
417 OBJID
(Santa Claus DATE
6) six
418 OBJID
(CTO DATE
7) seven
420 test_expect_success
'Blame output (complex mapping)' '
421 git blame one >actual &&
422 fuzz_blame actual >actual.fuzz &&
423 test_cmp expect actual.fuzz