| #!/bin/sh | 
 |  | 
 | test_description='.mailmap configurations' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | fuzz_blame () { | 
 | 	sed " | 
 | 		s/$_x05[0-9a-f][0-9a-f][0-9a-f]/OBJID/g | 
 | 		s/$_x05[0-9a-f][0-9a-f]/OBJI/g | 
 | 		s/[-0-9]\{10\} [:0-9]\{8\} [-+][0-9]\{4\}/DATE/g | 
 | 	" "$@" | 
 | } | 
 |  | 
 | test_expect_success setup ' | 
 | 	echo one >one && | 
 | 	git add one && | 
 | 	test_tick && | 
 | 	git commit -m initial && | 
 | 	echo two >>one && | 
 | 	git add one && | 
 | 	test_tick && | 
 | 	git commit --author "nick1 <bugs@company.xx>" -m second | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | A U Thor (1): | 
 |       initial | 
 |  | 
 | nick1 (1): | 
 |       second | 
 |  | 
 | EOF | 
 |  | 
 | test_expect_success 'No mailmap' ' | 
 | 	git shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | Repo Guy (1): | 
 |       initial | 
 |  | 
 | nick1 (1): | 
 |       second | 
 |  | 
 | EOF | 
 |  | 
 | test_expect_success 'default .mailmap' ' | 
 | 	echo "Repo Guy <author@example.com>" > .mailmap && | 
 | 	git shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | # Using a mailmap file in a subdirectory of the repo here, but | 
 | # could just as well have been a file outside of the repository | 
 | cat >expect <<\EOF | 
 | Internal Guy (1): | 
 |       second | 
 |  | 
 | Repo Guy (1): | 
 |       initial | 
 |  | 
 | EOF | 
 | test_expect_success 'mailmap.file set' ' | 
 | 	mkdir -p internal_mailmap && | 
 | 	echo "Internal Guy <bugs@company.xx>" > internal_mailmap/.mailmap && | 
 | 	git config mailmap.file internal_mailmap/.mailmap && | 
 | 	git shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | External Guy (1): | 
 |       initial | 
 |  | 
 | Internal Guy (1): | 
 |       second | 
 |  | 
 | EOF | 
 | test_expect_success 'mailmap.file override' ' | 
 | 	echo "External Guy <author@example.com>" >> internal_mailmap/.mailmap && | 
 | 	git config mailmap.file internal_mailmap/.mailmap && | 
 | 	git shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | Repo Guy (1): | 
 |       initial | 
 |  | 
 | nick1 (1): | 
 |       second | 
 |  | 
 | EOF | 
 |  | 
 | test_expect_success 'mailmap.file non-existent' ' | 
 | 	rm internal_mailmap/.mailmap && | 
 | 	rmdir internal_mailmap && | 
 | 	git shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | Internal Guy (1): | 
 |       second | 
 |  | 
 | Repo Guy (1): | 
 |       initial | 
 |  | 
 | EOF | 
 |  | 
 | test_expect_success 'name entry after email entry' ' | 
 | 	mkdir -p internal_mailmap && | 
 | 	echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap && | 
 | 	echo "Internal Guy <bugs@company.xx>" >>internal_mailmap/.mailmap && | 
 | 	git shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | Internal Guy (1): | 
 |       second | 
 |  | 
 | Repo Guy (1): | 
 |       initial | 
 |  | 
 | EOF | 
 |  | 
 | test_expect_success 'name entry after email entry, case-insensitive' ' | 
 | 	mkdir -p internal_mailmap && | 
 | 	echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap && | 
 | 	echo "Internal Guy <BUGS@Company.xx>" >>internal_mailmap/.mailmap && | 
 | 	git shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | A U Thor (1): | 
 |       initial | 
 |  | 
 | nick1 (1): | 
 |       second | 
 |  | 
 | EOF | 
 | test_expect_success 'No mailmap files, but configured' ' | 
 | 	rm -f .mailmap internal_mailmap/.mailmap && | 
 | 	git shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'setup mailmap blob tests' ' | 
 | 	git checkout -b map && | 
 | 	test_when_finished "git checkout master" && | 
 | 	cat >just-bugs <<-\EOF && | 
 | 	Blob Guy <bugs@company.xx> | 
 | 	EOF | 
 | 	cat >both <<-\EOF && | 
 | 	Blob Guy <author@example.com> | 
 | 	Blob Guy <bugs@company.xx> | 
 | 	EOF | 
 | 	git add just-bugs both && | 
 | 	git commit -m "my mailmaps" && | 
 | 	echo "Repo Guy <author@example.com>" >.mailmap && | 
 | 	echo "Internal Guy <author@example.com>" >internal.map | 
 | ' | 
 |  | 
 | test_expect_success 'mailmap.blob set' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	Blob Guy (1): | 
 | 	      second | 
 |  | 
 | 	Repo Guy (1): | 
 | 	      initial | 
 |  | 
 | 	EOF | 
 | 	git -c mailmap.blob=map:just-bugs shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'mailmap.blob overrides .mailmap' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	Blob Guy (2): | 
 | 	      initial | 
 | 	      second | 
 |  | 
 | 	EOF | 
 | 	git -c mailmap.blob=map:both shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'mailmap.file overrides mailmap.blob' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	Blob Guy (1): | 
 | 	      second | 
 |  | 
 | 	Internal Guy (1): | 
 | 	      initial | 
 |  | 
 | 	EOF | 
 | 	git \ | 
 | 	  -c mailmap.blob=map:both \ | 
 | 	  -c mailmap.file=internal.map \ | 
 | 	  shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'mailmap.blob can be missing' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	Repo Guy (1): | 
 | 	      initial | 
 |  | 
 | 	nick1 (1): | 
 | 	      second | 
 |  | 
 | 	EOF | 
 | 	git -c mailmap.blob=map:nonexistent shortlog HEAD >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'mailmap.blob defaults to off in non-bare repo' ' | 
 | 	git init non-bare && | 
 | 	( | 
 | 		cd non-bare && | 
 | 		test_commit one .mailmap "Fake Name <author@example.com>" && | 
 | 		echo "     1	Fake Name" >expect && | 
 | 		git shortlog -ns HEAD >actual && | 
 | 		test_cmp expect actual && | 
 | 		rm .mailmap && | 
 | 		echo "     1	A U Thor" >expect && | 
 | 		git shortlog -ns HEAD >actual && | 
 | 		test_cmp expect actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'mailmap.blob defaults to HEAD:.mailmap in bare repo' ' | 
 | 	git clone --bare non-bare bare && | 
 | 	( | 
 | 		cd bare && | 
 | 		echo "     1	Fake Name" >expect && | 
 | 		git shortlog -ns HEAD >actual && | 
 | 		test_cmp expect actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'cleanup after mailmap.blob tests' ' | 
 | 	rm -f .mailmap | 
 | ' | 
 |  | 
 | # Extended mailmap configurations should give us the following output for shortlog | 
 | cat >expect <<\EOF | 
 | A U Thor <author@example.com> (1): | 
 |       initial | 
 |  | 
 | CTO <cto@company.xx> (1): | 
 |       seventh | 
 |  | 
 | Other Author <other@author.xx> (2): | 
 |       third | 
 |       fourth | 
 |  | 
 | Santa Claus <santa.claus@northpole.xx> (2): | 
 |       fifth | 
 |       sixth | 
 |  | 
 | Some Dude <some@dude.xx> (1): | 
 |       second | 
 |  | 
 | EOF | 
 |  | 
 | test_expect_success 'Shortlog output (complex mapping)' ' | 
 | 	echo three >>one && | 
 | 	git add one && | 
 | 	test_tick && | 
 | 	git commit --author "nick2 <bugs@company.xx>" -m third && | 
 |  | 
 | 	echo four >>one && | 
 | 	git add one && | 
 | 	test_tick && | 
 | 	git commit --author "nick2 <nick2@company.xx>" -m fourth && | 
 |  | 
 | 	echo five >>one && | 
 | 	git add one && | 
 | 	test_tick && | 
 | 	git commit --author "santa <me@company.xx>" -m fifth && | 
 |  | 
 | 	echo six >>one && | 
 | 	git add one && | 
 | 	test_tick && | 
 | 	git commit --author "claus <me@company.xx>" -m sixth && | 
 |  | 
 | 	echo seven >>one && | 
 | 	git add one && | 
 | 	test_tick && | 
 | 	git commit --author "CTO <cto@coompany.xx>" -m seventh && | 
 |  | 
 | 	mkdir -p internal_mailmap && | 
 | 	echo "Committed <committer@example.com>" > internal_mailmap/.mailmap && | 
 | 	echo "<cto@company.xx>                       <cto@coompany.xx>" >> internal_mailmap/.mailmap && | 
 | 	echo "Some Dude <some@dude.xx>         nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap && | 
 | 	echo "Other Author <other@author.xx>   nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap && | 
 | 	echo "Other Author <other@author.xx>         <nick2@company.xx>" >> internal_mailmap/.mailmap && | 
 | 	echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap && | 
 | 	echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap && | 
 |  | 
 | 	git shortlog -e HEAD >actual && | 
 | 	test_cmp expect actual | 
 |  | 
 | ' | 
 |  | 
 | # git log with --pretty format which uses the name and email mailmap placemarkers | 
 | cat >expect <<\EOF | 
 | Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx> | 
 | Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com> | 
 |  | 
 | Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx> | 
 | Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com> | 
 |  | 
 | Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx> | 
 | Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com> | 
 |  | 
 | Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx> | 
 | Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com> | 
 |  | 
 | Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx> | 
 | Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com> | 
 |  | 
 | Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx> | 
 | Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com> | 
 |  | 
 | Author A U Thor <author@example.com> maps to A U Thor <author@example.com> | 
 | Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com> | 
 | EOF | 
 |  | 
 | test_expect_success 'Log output (complex mapping)' ' | 
 | 	git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | Author: CTO <cto@company.xx> | 
 | Author: Santa Claus <santa.claus@northpole.xx> | 
 | Author: Santa Claus <santa.claus@northpole.xx> | 
 | Author: Other Author <other@author.xx> | 
 | Author: Other Author <other@author.xx> | 
 | Author: Some Dude <some@dude.xx> | 
 | Author: A U Thor <author@example.com> | 
 | EOF | 
 |  | 
 | test_expect_success 'Log output with --use-mailmap' ' | 
 | 	git log --use-mailmap | grep Author >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | Author: CTO <cto@company.xx> | 
 | Author: Santa Claus <santa.claus@northpole.xx> | 
 | Author: Santa Claus <santa.claus@northpole.xx> | 
 | Author: Other Author <other@author.xx> | 
 | Author: Other Author <other@author.xx> | 
 | Author: Some Dude <some@dude.xx> | 
 | Author: A U Thor <author@example.com> | 
 | EOF | 
 |  | 
 | test_expect_success 'Log output with log.mailmap' ' | 
 | 	git -c log.mailmap=True log | grep Author >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | Author: Santa Claus <santa.claus@northpole.xx> | 
 | Author: Santa Claus <santa.claus@northpole.xx> | 
 | EOF | 
 |  | 
 | test_expect_success 'Grep author with --use-mailmap' ' | 
 | 	git log --use-mailmap --author Santa | grep Author >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 | cat >expect <<\EOF | 
 | Author: Santa Claus <santa.claus@northpole.xx> | 
 | Author: Santa Claus <santa.claus@northpole.xx> | 
 | EOF | 
 |  | 
 | test_expect_success 'Grep author with log.mailmap' ' | 
 | 	git -c log.mailmap=True log --author Santa | grep Author >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | >expect | 
 |  | 
 | test_expect_success 'Only grep replaced author with --use-mailmap' ' | 
 | 	git log --use-mailmap --author "<cto@coompany.xx>" >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | # git blame | 
 | cat >expect <<\EOF | 
 | ^OBJI (A U Thor     DATE 1) one | 
 | OBJID (Some Dude    DATE 2) two | 
 | OBJID (Other Author DATE 3) three | 
 | OBJID (Other Author DATE 4) four | 
 | OBJID (Santa Claus  DATE 5) five | 
 | OBJID (Santa Claus  DATE 6) six | 
 | OBJID (CTO          DATE 7) seven | 
 | EOF | 
 | test_expect_success 'Blame output (complex mapping)' ' | 
 | 	git blame one >actual && | 
 | 	fuzz_blame actual >actual.fuzz && | 
 | 	test_cmp expect actual.fuzz | 
 | ' | 
 |  | 
 | test_done |