mirror of
https://github.com/git/git
synced 2024-09-13 13:24:41 +00:00
2d02bc91c0
In the "git blame --porcelain" output, lines that ends with three
integers may not be the line that shows a commit object with line
numbers and block length (the contents from the blamed file or the
summary field can have a line that happens to match). Also, the
names of the author may have more than three SP separated tokens
("git blame -L242,+1 cf6de18aab
Documentation/SubmittingPatches"
gives an example). The existing "grep -E | cut" pipeline is a bit
too loose on these two points.
While they can be assumed on the test data, it is not so hard to
use the right pattern from the documented format, so let's do so.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
890 lines
24 KiB
Bash
Executable file
890 lines
24 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='.mailmap configurations'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'setup commits and contacts file' '
|
|
test_commit initial one one &&
|
|
test_commit --author "nick1 <bugs@company.xx>" --append second one two
|
|
'
|
|
|
|
test_expect_success 'check-mailmap no arguments' '
|
|
test_must_fail git check-mailmap
|
|
'
|
|
|
|
test_expect_success 'check-mailmap arguments' '
|
|
cat >expect <<-EOF &&
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
|
nick1 <bugs@company.xx>
|
|
EOF
|
|
git check-mailmap \
|
|
"$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>" \
|
|
"nick1 <bugs@company.xx>" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'check-mailmap --stdin' '
|
|
cat >expect <<-EOF &&
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
|
nick1 <bugs@company.xx>
|
|
EOF
|
|
git check-mailmap --stdin <expect >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'check-mailmap --stdin arguments: no mapping' '
|
|
test_when_finished "rm contacts" &&
|
|
cat >contacts <<-EOF &&
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
|
nick1 <bugs@company.xx>
|
|
EOF
|
|
cat >expect <<-\EOF &&
|
|
Internal Guy <bugs@company.xy>
|
|
EOF
|
|
cat contacts >>expect &&
|
|
|
|
git check-mailmap --stdin "Internal Guy <bugs@company.xy>" \
|
|
<contacts >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'check-mailmap --stdin arguments: mapping' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cat >.mailmap <<-EOF &&
|
|
New Name <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
cat >stdin <<-EOF &&
|
|
Old Name <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
|
|
cp .mailmap expect &&
|
|
git check-mailmap --stdin <stdin >actual &&
|
|
test_cmp expect actual &&
|
|
|
|
cat .mailmap >>expect &&
|
|
git check-mailmap --stdin "Another Old Name <$GIT_AUTHOR_EMAIL>" \
|
|
<stdin >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'check-mailmap bogus contact' '
|
|
test_must_fail git check-mailmap bogus
|
|
'
|
|
|
|
test_expect_success 'check-mailmap bogus contact --stdin' '
|
|
test_must_fail git check-mailmap --stdin bogus </dev/null
|
|
'
|
|
|
|
test_expect_success 'No mailmap' '
|
|
cat >expect <<-EOF &&
|
|
$GIT_AUTHOR_NAME (1):
|
|
initial
|
|
|
|
nick1 (1):
|
|
second
|
|
|
|
EOF
|
|
git shortlog HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'setup default .mailmap' '
|
|
cat >default.map <<-EOF
|
|
Repo Guy <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'test default .mailmap' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .mailmap &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
Repo Guy (1):
|
|
initial
|
|
|
|
nick1 (1):
|
|
second
|
|
|
|
EOF
|
|
git shortlog HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'mailmap.file set' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .mailmap &&
|
|
|
|
test_config mailmap.file internal.map &&
|
|
cat >internal.map <<-\EOF &&
|
|
Internal Guy <bugs@company.xx>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
Internal Guy (1):
|
|
second
|
|
|
|
Repo Guy (1):
|
|
initial
|
|
|
|
EOF
|
|
git shortlog HEAD >actual &&
|
|
test_cmp expect actual &&
|
|
|
|
# The internal_mailmap/.mailmap file is an a subdirectory, but
|
|
# as shown here it can also be outside the repository
|
|
test_when_finished "rm -rf sub-repo" &&
|
|
git clone . sub-repo &&
|
|
(
|
|
cd sub-repo &&
|
|
cp ../.mailmap . &&
|
|
git config mailmap.file ../internal.map &&
|
|
git shortlog HEAD >actual &&
|
|
test_cmp ../expect actual
|
|
)
|
|
'
|
|
|
|
test_expect_success 'mailmap.file override' '
|
|
test_config mailmap.file internal.map &&
|
|
cat >internal.map <<-EOF &&
|
|
Internal Guy <bugs@company.xx>
|
|
External Guy <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
External Guy (1):
|
|
initial
|
|
|
|
Internal Guy (1):
|
|
second
|
|
|
|
EOF
|
|
git shortlog HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'mailmap.file non-existent' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .mailmap &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
Repo Guy (1):
|
|
initial
|
|
|
|
nick1 (1):
|
|
second
|
|
|
|
EOF
|
|
git shortlog HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'name entry after email entry' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .mailmap &&
|
|
|
|
test_config mailmap.file internal.map &&
|
|
cat >internal.map <<-\EOF &&
|
|
<bugs@company.xy> <bugs@company.xx>
|
|
Internal Guy <bugs@company.xx>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
Internal Guy (1):
|
|
second
|
|
|
|
Repo Guy (1):
|
|
initial
|
|
|
|
EOF
|
|
|
|
git shortlog HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'name entry after email entry, case-insensitive' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .mailmap &&
|
|
|
|
test_config mailmap.file internal.map &&
|
|
cat >internal.map <<-\EOF &&
|
|
<bugs@company.xy> <bugs@company.xx>
|
|
Internal Guy <BUGS@Company.xx>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
Internal Guy (1):
|
|
second
|
|
|
|
Repo Guy (1):
|
|
initial
|
|
|
|
EOF
|
|
git shortlog HEAD >actual &&
|
|
test_cmp expect actual &&
|
|
|
|
cat >internal.map <<-\EOF &&
|
|
NiCk <BuGs@CoMpAnY.Xy> NICK1 <BUGS@COMPANY.XX>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
NiCk (1):
|
|
second
|
|
|
|
Repo Guy (1):
|
|
initial
|
|
|
|
EOF
|
|
git shortlog HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'No mailmap files, but configured' '
|
|
cat >expect <<-EOF &&
|
|
$GIT_AUTHOR_NAME (1):
|
|
initial
|
|
|
|
nick1 (1):
|
|
second
|
|
|
|
EOF
|
|
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 <$GIT_AUTHOR_EMAIL>
|
|
Blob Guy <bugs@company.xx>
|
|
EOF
|
|
printf "Tricky Guy <$GIT_AUTHOR_EMAIL>" >no-newline &&
|
|
git add just-bugs both no-newline &&
|
|
git commit -m "my mailmaps" &&
|
|
|
|
cat >internal.map <<-EOF
|
|
Internal Guy <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'mailmap.blob set' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .mailmap &&
|
|
|
|
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' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .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.file can be missing' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .mailmap &&
|
|
|
|
test_config mailmap.file nonexistent &&
|
|
cat >expect <<-\EOF &&
|
|
Repo Guy (1):
|
|
initial
|
|
|
|
nick1 (1):
|
|
second
|
|
|
|
EOF
|
|
git shortlog HEAD >actual 2>err &&
|
|
test_must_be_empty err &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'mailmap.blob can be missing' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .mailmap &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
Repo Guy (1):
|
|
initial
|
|
|
|
nick1 (1):
|
|
second
|
|
|
|
EOF
|
|
git -c mailmap.blob=map:nonexistent shortlog HEAD >actual 2>err &&
|
|
test_must_be_empty err &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'mailmap.blob might be the wrong type' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cp default.map .mailmap &&
|
|
|
|
git -c mailmap.blob=HEAD: shortlog HEAD >actual 2>err &&
|
|
test_i18ngrep "mailmap is not a blob" err &&
|
|
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 <$GIT_AUTHOR_EMAIL>" &&
|
|
cat >expect <<-\EOF &&
|
|
1 Fake Name
|
|
EOF
|
|
git shortlog -ns HEAD >actual &&
|
|
test_cmp expect actual &&
|
|
rm .mailmap &&
|
|
cat >expect <<-EOF &&
|
|
1 $GIT_AUTHOR_NAME
|
|
EOF
|
|
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 &&
|
|
cat >expect <<-\EOF &&
|
|
1 Fake Name
|
|
EOF
|
|
git shortlog -ns HEAD >actual &&
|
|
test_cmp expect actual
|
|
)
|
|
'
|
|
|
|
test_expect_success 'mailmap.blob can handle blobs without trailing newline' '
|
|
cat >expect <<-\EOF &&
|
|
Tricky Guy (1):
|
|
initial
|
|
|
|
nick1 (1):
|
|
second
|
|
|
|
EOF
|
|
git -c mailmap.blob=map:no-newline shortlog HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'single-character name' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cat >.mailmap <<-EOF &&
|
|
A <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
|
|
cat >expect <<-EOF &&
|
|
1 A <$GIT_AUTHOR_EMAIL>
|
|
1 nick1 <bugs@company.xx>
|
|
EOF
|
|
git shortlog -es HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'preserve canonical email case' '
|
|
test_when_finished "rm .mailmap" &&
|
|
cat >.mailmap <<-EOF &&
|
|
<AUTHOR@example.com> <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
|
|
cat >expect <<-EOF &&
|
|
1 $GIT_AUTHOR_NAME <AUTHOR@example.com>
|
|
1 nick1 <bugs@company.xx>
|
|
EOF
|
|
git shortlog -es HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'gitmailmap(5) example output: setup' '
|
|
test_create_repo doc &&
|
|
test_commit -C doc --author "Joe Developer <joe@example.com>" A &&
|
|
test_commit -C doc --author "Joe R. Developer <joe@example.com>" B &&
|
|
test_commit -C doc --author "Jane Doe <jane@example.com>" C &&
|
|
test_commit -C doc --author "Jane Doe <jane@laptop.(none)>" D &&
|
|
test_commit -C doc --author "Jane D. <jane@desktop.(none)>" E
|
|
'
|
|
|
|
test_expect_success 'gitmailmap(5) example output: example #1' '
|
|
test_config -C doc mailmap.file ../doc.map &&
|
|
cat >doc.map <<-\EOF &&
|
|
Joe R. Developer <joe@example.com>
|
|
Jane Doe <jane@example.com>
|
|
Jane Doe <jane@desktop.(none)>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
Author Joe Developer <joe@example.com> maps to Joe R. Developer <joe@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author Joe R. Developer <joe@example.com> maps to Joe R. Developer <joe@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author Jane Doe <jane@example.com> maps to Jane Doe <jane@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author Jane Doe <jane@laptop.(none)> maps to Jane Doe <jane@laptop.(none)>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author Jane D <jane@desktop.(none)> maps to Jane Doe <jane@desktop.(none)>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
EOF
|
|
git -C doc log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'gitmailmap(5) example output: example #2' '
|
|
test_config -C doc mailmap.file ../doc.map &&
|
|
cat >doc.map <<-\EOF &&
|
|
Joe R. Developer <joe@example.com>
|
|
Jane Doe <jane@example.com> <jane@laptop.(none)>
|
|
Jane Doe <jane@example.com> <jane@desktop.(none)>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
Author Joe Developer <joe@example.com> maps to Joe R. Developer <joe@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author Joe R. Developer <joe@example.com> maps to Joe R. Developer <joe@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author Jane Doe <jane@example.com> maps to Jane Doe <jane@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author Jane Doe <jane@laptop.(none)> maps to Jane Doe <jane@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author Jane D <jane@desktop.(none)> maps to Jane Doe <jane@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
EOF
|
|
git -C doc log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'gitmailmap(5) example output: example #3' '
|
|
test_config -C doc mailmap.file ../doc.map &&
|
|
cat >>doc.map <<-\EOF &&
|
|
Joe R. Developer <joe@example.com> Joe <bugs@example.com>
|
|
Jane Doe <jane@example.com> Jane <bugs@example.com>
|
|
EOF
|
|
|
|
test_commit -C doc --author "Joe <bugs@example.com>" F &&
|
|
test_commit -C doc --author "Jane <bugs@example.com>" G &&
|
|
|
|
cat >>expect <<-\EOF &&
|
|
|
|
Author Joe <bugs@example.com> maps to Joe R. Developer <joe@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author Jane <bugs@example.com> maps to Jane Doe <jane@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
EOF
|
|
git -C doc log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
|
|
test_expect_success 'Shortlog output (complex mapping)' '
|
|
test_config mailmap.file complex.map &&
|
|
cat >complex.map <<-EOF &&
|
|
Committed <$GIT_COMMITTER_EMAIL>
|
|
<cto@company.xx> <cto@coompany.xx>
|
|
Some Dude <some@dude.xx> nick1 <bugs@company.xx>
|
|
Other Author <other@author.xx> nick2 <bugs@company.xx>
|
|
Other Author <other@author.xx> <nick2@company.xx>
|
|
Santa Claus <santa.claus@northpole.xx> <me@company.xx>
|
|
EOF
|
|
|
|
test_commit --author "nick2 <bugs@company.xx>" --append third one three &&
|
|
test_commit --author "nick2 <nick2@company.xx>" --append fourth one four &&
|
|
test_commit --author "santa <me@company.xx>" --append fifth one five &&
|
|
test_commit --author "claus <me@company.xx>" --append sixth one six &&
|
|
test_commit --author "CTO <cto@coompany.xx>" --append seventh one seven &&
|
|
|
|
cat >expect <<-EOF &&
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> (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
|
|
|
|
git shortlog -e HEAD >actual &&
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
test_expect_success 'Log output (complex mapping)' '
|
|
test_config mailmap.file complex.map &&
|
|
|
|
cat >expect <<-EOF &&
|
|
Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
|
|
|
Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
|
|
|
Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
|
|
|
Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
|
|
|
Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
|
|
|
Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
|
|
|
Author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> maps to $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
|
EOF
|
|
|
|
git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'Log output (local-part email address)' '
|
|
cat >expect <<-EOF &&
|
|
Author email cto@coompany.xx has local-part cto
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
|
|
|
Author email me@company.xx has local-part me
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
|
|
|
Author email me@company.xx has local-part me
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
|
|
|
Author email nick2@company.xx has local-part nick2
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
|
|
|
Author email bugs@company.xx has local-part bugs
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
|
|
|
Author email bugs@company.xx has local-part bugs
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
|
|
|
Author email author@example.com has local-part author
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
|
EOF
|
|
|
|
git log --pretty=format:"Author email %ae has local-part %al%nCommitter email %ce has local-part %cl%n" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'Log output with --use-mailmap' '
|
|
test_config mailmap.file complex.map &&
|
|
|
|
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: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
|
|
git log --use-mailmap >log &&
|
|
grep Author log >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'Log output with log.mailmap' '
|
|
test_config mailmap.file complex.map &&
|
|
|
|
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: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
|
|
git -c log.mailmap=True log >log &&
|
|
grep Author log >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'log.mailmap=false disables mailmap' '
|
|
cat >expect <<-EOF &&
|
|
Author: CTO <cto@coompany.xx>
|
|
Author: claus <me@company.xx>
|
|
Author: santa <me@company.xx>
|
|
Author: nick2 <nick2@company.xx>
|
|
Author: nick2 <bugs@company.xx>
|
|
Author: nick1 <bugs@company.xx>
|
|
Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
git -c log.mailmap=false log >log &&
|
|
grep Author log >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success '--no-use-mailmap disables mailmap' '
|
|
cat >expect <<-EOF &&
|
|
Author: CTO <cto@coompany.xx>
|
|
Author: claus <me@company.xx>
|
|
Author: santa <me@company.xx>
|
|
Author: nick2 <nick2@company.xx>
|
|
Author: nick2 <bugs@company.xx>
|
|
Author: nick1 <bugs@company.xx>
|
|
Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
|
EOF
|
|
git log --no-use-mailmap >log &&
|
|
grep Author log >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'Grep author with --use-mailmap' '
|
|
test_config mailmap.file complex.map &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
Author: Santa Claus <santa.claus@northpole.xx>
|
|
Author: Santa Claus <santa.claus@northpole.xx>
|
|
EOF
|
|
git log --use-mailmap --author Santa >log &&
|
|
grep Author log >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'Grep author with log.mailmap' '
|
|
test_config mailmap.file complex.map &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
Author: Santa Claus <santa.claus@northpole.xx>
|
|
Author: Santa Claus <santa.claus@northpole.xx>
|
|
EOF
|
|
|
|
git -c log.mailmap=True log --author Santa >log &&
|
|
grep Author log >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'log.mailmap is true by default these days' '
|
|
test_config mailmap.file complex.map &&
|
|
git log --author Santa >log &&
|
|
grep Author log >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'Only grep replaced author with --use-mailmap' '
|
|
test_config mailmap.file complex.map &&
|
|
git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
|
|
test_must_be_empty actual
|
|
'
|
|
|
|
test_expect_success 'Blame --porcelain output (complex mapping)' '
|
|
test_config mailmap.file complex.map &&
|
|
|
|
cat >expect <<-EOF &&
|
|
1 1 1
|
|
A U Thor
|
|
2 2 1
|
|
Some Dude
|
|
3 3 1
|
|
Other Author
|
|
4 4 1
|
|
Other Author
|
|
5 5 1
|
|
Santa Claus
|
|
6 6 1
|
|
Santa Claus
|
|
7 7 1
|
|
CTO
|
|
EOF
|
|
|
|
git blame --porcelain one >actual.blame &&
|
|
|
|
NUM="[0-9][0-9]*" &&
|
|
sed -n <actual.blame >actual.fuzz \
|
|
-e "s/^author //p" \
|
|
-e "s/^$OID_REGEX \\($NUM $NUM $NUM\\)$/\\1/p" &&
|
|
test_cmp expect actual.fuzz
|
|
'
|
|
|
|
test_expect_success 'Blame output (complex mapping)' '
|
|
git -c mailmap.file=complex.map blame one >a &&
|
|
git blame one >b &&
|
|
test_file_not_empty a &&
|
|
! cmp a b
|
|
'
|
|
|
|
test_expect_success 'commit --author honors mailmap' '
|
|
test_config mailmap.file complex.map &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
Some Dude <some@dude.xx>
|
|
EOF
|
|
|
|
test_must_fail git commit --author "nick" --allow-empty -meight &&
|
|
git commit --author "Some Dude" --allow-empty -meight &&
|
|
git show --pretty=format:"%an <%ae>%n" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'comment syntax: setup' '
|
|
test_create_repo comm &&
|
|
test_commit -C comm --author "A <a@example.com>" A &&
|
|
test_commit -C comm --author "B <b@example.com>" B &&
|
|
test_commit -C comm --author "C <#@example.com>" C &&
|
|
test_commit -C comm --author "D <d@e#ample.com>" D &&
|
|
|
|
test_config -C comm mailmap.file ../doc.map &&
|
|
cat >>doc.map <<-\EOF &&
|
|
# Ah <a@example.com>
|
|
|
|
; Bee <b@example.com>
|
|
Cee <cee@example.com> <#@example.com>
|
|
Dee <dee@example.com> <d@e#ample.com>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
Author A <a@example.com> maps to A <a@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author B <b@example.com> maps to ; Bee <b@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author C <#@example.com> maps to Cee <cee@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author D <d@e#ample.com> maps to Dee <dee@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
EOF
|
|
git -C comm log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'whitespace syntax: setup' '
|
|
test_create_repo space &&
|
|
test_commit -C space --author "A <a@example.com>" A &&
|
|
test_commit -C space --author "B <b@example.com>" B &&
|
|
test_commit -C space --author " C <c@example.com>" C &&
|
|
test_commit -C space --author " D <d@example.com>" D &&
|
|
test_commit -C space --author "E E <e@example.com>" E &&
|
|
test_commit -C space --author "F F <f@example.com>" F &&
|
|
test_commit -C space --author "G G <g@example.com>" G &&
|
|
test_commit -C space --author "H H <h@example.com>" H &&
|
|
|
|
test_config -C space mailmap.file ../space.map &&
|
|
cat >>space.map <<-\EOF &&
|
|
Ah <ah@example.com> < a@example.com >
|
|
Bee <bee@example.com > < b@example.com >
|
|
Cee <cee@example.com> C <c@example.com>
|
|
dee <dee@example.com> D <d@example.com>
|
|
eee <eee@example.com> E E <e@example.com>
|
|
eff <eff@example.com> F F <f@example.com>
|
|
gee <gee@example.com> G G <g@example.com>
|
|
aitch <aitch@example.com> H H <h@example.com>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
Author A <a@example.com> maps to A <a@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author B <b@example.com> maps to B <b@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author C <c@example.com> maps to Cee <cee@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author D <d@example.com> maps to dee <dee@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author E E <e@example.com> maps to eee <eee@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author F F <f@example.com> maps to eff <eff@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author G G <g@example.com> maps to gee <gee@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author H H <h@example.com> maps to H H <h@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
EOF
|
|
git -C space log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'empty syntax: setup' '
|
|
test_create_repo empty &&
|
|
test_commit -C empty --author "A <>" A &&
|
|
test_commit -C empty --author "B <b@example.com>" B &&
|
|
test_commit -C empty --author "C <c@example.com>" C &&
|
|
|
|
test_config -C empty mailmap.file ../empty.map &&
|
|
cat >>empty.map <<-\EOF &&
|
|
Ah <ah@example.com> <>
|
|
Bee <bee@example.com> <>
|
|
Cee <> <c@example.com>
|
|
EOF
|
|
|
|
cat >expect <<-\EOF &&
|
|
Author A <> maps to Bee <bee@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author B <b@example.com> maps to B <b@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
|
|
Author C <c@example.com> maps to C <c@example.com>
|
|
Committer C O Mitter <committer@example.com> maps to C O Mitter <committer@example.com>
|
|
EOF
|
|
git -C empty log --reverse --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_done
|