2009-02-08 15:34:27 +01:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='.mailmap configurations'
|
|
|
|
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
2010-10-15 19:12:19 +02:00
|
|
|
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
|
|
|
|
" "$@"
|
|
|
|
}
|
|
|
|
|
2009-02-08 15:34:27 +01:00
|
|
|
test_expect_success setup '
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >contacts <<- EOF &&
|
|
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2013-07-13 02:53:11 +02:00
|
|
|
nick1 <bugs@company.xx>
|
|
|
|
EOF
|
|
|
|
|
2009-02-08 15:34:27 +01:00
|
|
|
echo one >one &&
|
|
|
|
git add one &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m initial &&
|
|
|
|
echo two >>one &&
|
|
|
|
git add one &&
|
2010-10-11 17:41:16 +02:00
|
|
|
test_tick &&
|
2009-02-08 15:34:27 +01:00
|
|
|
git commit --author "nick1 <bugs@company.xx>" -m second
|
|
|
|
'
|
|
|
|
|
2013-07-13 02:53:11 +02:00
|
|
|
test_expect_success 'check-mailmap no arguments' '
|
|
|
|
test_must_fail git check-mailmap
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check-mailmap arguments' '
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect <<- EOF &&
|
|
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2013-07-13 02:53:11 +02:00
|
|
|
nick1 <bugs@company.xx>
|
|
|
|
EOF
|
|
|
|
git check-mailmap \
|
2019-10-25 01:36:16 +02:00
|
|
|
"$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>" \
|
2013-07-13 02:53:11 +02:00
|
|
|
"nick1 <bugs@company.xx>" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check-mailmap --stdin' '
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect <<- EOF &&
|
|
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2013-07-13 02:53:11 +02:00
|
|
|
nick1 <bugs@company.xx>
|
|
|
|
EOF
|
|
|
|
git check-mailmap --stdin <contacts >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check-mailmap --stdin arguments' '
|
|
|
|
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 bogus contact' '
|
|
|
|
test_must_fail git check-mailmap bogus
|
|
|
|
'
|
|
|
|
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect << EOF
|
|
|
|
$GIT_AUTHOR_NAME (1):
|
2009-02-08 15:34:27 +01:00
|
|
|
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' '
|
2019-10-25 01:36:16 +02:00
|
|
|
echo "Repo Guy <$GIT_AUTHOR_EMAIL>" > .mailmap &&
|
2009-02-08 15:34:27 +01:00
|
|
|
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' '
|
2010-10-11 17:41:16 +02:00
|
|
|
mkdir -p internal_mailmap &&
|
2009-02-08 15:34:27 +01:00
|
|
|
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' '
|
2019-10-25 01:36:16 +02:00
|
|
|
echo "External Guy <$GIT_AUTHOR_EMAIL>" >> internal_mailmap/.mailmap &&
|
2009-02-08 15:34:27 +01:00
|
|
|
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
|
|
|
|
|
2011-06-16 15:42:48 +02:00
|
|
|
test_expect_success 'mailmap.file non-existent' '
|
2009-02-08 15:34:27 +01:00
|
|
|
rm internal_mailmap/.mailmap &&
|
|
|
|
rmdir internal_mailmap &&
|
|
|
|
git shortlog HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2010-10-11 17:41:16 +02:00
|
|
|
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 &&
|
2010-10-20 08:32:06 +02:00
|
|
|
git shortlog HEAD >actual &&
|
2010-10-11 17:41:16 +02:00
|
|
|
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 &&
|
2010-10-20 08:32:06 +02:00
|
|
|
git shortlog HEAD >actual &&
|
2010-10-11 17:41:16 +02:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect << EOF
|
|
|
|
$GIT_AUTHOR_NAME (1):
|
2009-02-08 15:34:27 +01:00
|
|
|
initial
|
|
|
|
|
|
|
|
nick1 (1):
|
|
|
|
second
|
|
|
|
|
|
|
|
EOF
|
|
|
|
test_expect_success 'No mailmap files, but configured' '
|
2010-10-11 17:41:16 +02:00
|
|
|
rm -f .mailmap internal_mailmap/.mailmap &&
|
2009-02-08 15:34:27 +01:00
|
|
|
git shortlog HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2012-12-12 12:04:04 +01:00
|
|
|
test_expect_success 'setup mailmap blob tests' '
|
|
|
|
git checkout -b map &&
|
|
|
|
test_when_finished "git checkout master" &&
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >just-bugs <<- EOF &&
|
2012-12-12 12:04:04 +01:00
|
|
|
Blob Guy <bugs@company.xx>
|
|
|
|
EOF
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >both <<- EOF &&
|
|
|
|
Blob Guy <$GIT_AUTHOR_EMAIL>
|
2012-12-12 12:04:04 +01:00
|
|
|
Blob Guy <bugs@company.xx>
|
|
|
|
EOF
|
2019-10-25 01:36:16 +02:00
|
|
|
printf "Tricky Guy <$GIT_AUTHOR_EMAIL>" >no-newline &&
|
mailmap: handle mailmap blobs without trailing newlines
The read_mailmap_buf function reads each line of the mailmap
using strchrnul, like:
const char *end = strchrnul(buf, '\n');
unsigned long linelen = end - buf + 1;
But that's off-by-one when we actually hit the NUL byte; our
line does not have a terminator, and so is only "end - buf"
bytes long. As a result, when we subtract the linelen from
the total len, we end up with (unsigned long)-1 bytes left
in the buffer, and we start reading random junk from memory.
We could fix it with:
unsigned long linelen = end - buf + !!*end;
but let's take a step back for a moment. It's questionable
in the first place for a function that takes a buffer and
length to be using strchrnul. But it works because we only
have one caller (and are only likely to ever have this one),
which is handing us data from read_sha1_file. Which means
that it's always NUL-terminated.
Instead of tightening the assumptions to make the
buffer/length pair work for a caller that doesn't actually
exist, let's let loosen the assumptions to what the real
caller has: a modifiable, NUL-terminated string.
This makes the code simpler and shorter (because we don't
have to correlate strchrnul with the length calculation),
correct (because the code with the off-by-one just goes
away), and more efficient (we can drop the extra allocation
we needed to create NUL-terminated strings for each line,
and just terminate in place).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-08-28 03:41:39 +02:00
|
|
|
git add just-bugs both no-newline &&
|
2012-12-12 12:04:04 +01:00
|
|
|
git commit -m "my mailmaps" &&
|
2019-10-25 01:36:16 +02:00
|
|
|
echo "Repo Guy <$GIT_AUTHOR_EMAIL>" >.mailmap &&
|
|
|
|
echo "Internal Guy <$GIT_AUTHOR_EMAIL>" >internal.map
|
2012-12-12 12:04:04 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
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
|
|
|
|
'
|
|
|
|
|
mailmap: default mailmap.blob in bare repositories
The motivation for mailmap.blob is to let users of bare
repositories use the mailmap feature, as they would not have
a checkout containing the .mailmap file. We can make it even
easier for them by just looking in HEAD:.mailmap by default.
We can't know for sure that this is where they would keep a
mailmap, of course, but it is the best guess (and it matches
the non-bare behavior, which reads from HEAD:.mailmap in the
working tree). If it's missing, git will silently ignore the
setting.
We do not do the same magic in the non-bare case, because:
1. In the common case, HEAD:.mailmap will be the same as
the .mailmap in the working tree, which is a no-op.
2. In the uncommon case, the user has modified .mailmap
but not yet committed it, and would expect the working
tree version to take precedence.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-12-13 14:04:47 +01:00
|
|
|
test_expect_success 'mailmap.blob defaults to off in non-bare repo' '
|
|
|
|
git init non-bare &&
|
|
|
|
(
|
|
|
|
cd non-bare &&
|
2019-10-25 01:36:16 +02:00
|
|
|
test_commit one .mailmap "Fake Name <$GIT_AUTHOR_EMAIL>" &&
|
mailmap: default mailmap.blob in bare repositories
The motivation for mailmap.blob is to let users of bare
repositories use the mailmap feature, as they would not have
a checkout containing the .mailmap file. We can make it even
easier for them by just looking in HEAD:.mailmap by default.
We can't know for sure that this is where they would keep a
mailmap, of course, but it is the best guess (and it matches
the non-bare behavior, which reads from HEAD:.mailmap in the
working tree). If it's missing, git will silently ignore the
setting.
We do not do the same magic in the non-bare case, because:
1. In the common case, HEAD:.mailmap will be the same as
the .mailmap in the working tree, which is a no-op.
2. In the uncommon case, the user has modified .mailmap
but not yet committed it, and would expect the working
tree version to take precedence.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-12-13 14:04:47 +01:00
|
|
|
echo " 1 Fake Name" >expect &&
|
|
|
|
git shortlog -ns HEAD >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
rm .mailmap &&
|
2019-10-25 01:36:16 +02:00
|
|
|
echo " 1 $GIT_AUTHOR_NAME" >expect &&
|
mailmap: default mailmap.blob in bare repositories
The motivation for mailmap.blob is to let users of bare
repositories use the mailmap feature, as they would not have
a checkout containing the .mailmap file. We can make it even
easier for them by just looking in HEAD:.mailmap by default.
We can't know for sure that this is where they would keep a
mailmap, of course, but it is the best guess (and it matches
the non-bare behavior, which reads from HEAD:.mailmap in the
working tree). If it's missing, git will silently ignore the
setting.
We do not do the same magic in the non-bare case, because:
1. In the common case, HEAD:.mailmap will be the same as
the .mailmap in the working tree, which is a no-op.
2. In the uncommon case, the user has modified .mailmap
but not yet committed it, and would expect the working
tree version to take precedence.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-12-13 14:04:47 +01:00
|
|
|
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
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
mailmap: handle mailmap blobs without trailing newlines
The read_mailmap_buf function reads each line of the mailmap
using strchrnul, like:
const char *end = strchrnul(buf, '\n');
unsigned long linelen = end - buf + 1;
But that's off-by-one when we actually hit the NUL byte; our
line does not have a terminator, and so is only "end - buf"
bytes long. As a result, when we subtract the linelen from
the total len, we end up with (unsigned long)-1 bytes left
in the buffer, and we start reading random junk from memory.
We could fix it with:
unsigned long linelen = end - buf + !!*end;
but let's take a step back for a moment. It's questionable
in the first place for a function that takes a buffer and
length to be using strchrnul. But it works because we only
have one caller (and are only likely to ever have this one),
which is handing us data from read_sha1_file. Which means
that it's always NUL-terminated.
Instead of tightening the assumptions to make the
buffer/length pair work for a caller that doesn't actually
exist, let's let loosen the assumptions to what the real
caller has: a modifiable, NUL-terminated string.
This makes the code simpler and shorter (because we don't
have to correlate strchrnul with the length calculation),
correct (because the code with the off-by-one just goes
away), and more efficient (we can drop the extra allocation
we needed to create NUL-terminated strings for each line,
and just terminate in place).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-08-28 03:41:39 +02:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2012-12-12 12:04:04 +01:00
|
|
|
test_expect_success 'cleanup after mailmap.blob tests' '
|
|
|
|
rm -f .mailmap
|
|
|
|
'
|
|
|
|
|
2013-07-15 08:54:06 +02:00
|
|
|
test_expect_success 'single-character name' '
|
2019-10-25 01:36:16 +02:00
|
|
|
echo " 1 A <$GIT_AUTHOR_EMAIL>" >expect &&
|
2013-07-15 08:54:05 +02:00
|
|
|
echo " 1 nick1 <bugs@company.xx>" >>expect &&
|
2019-10-25 01:36:16 +02:00
|
|
|
echo "A <$GIT_AUTHOR_EMAIL>" >.mailmap &&
|
2013-07-15 08:54:05 +02:00
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
git shortlog -es HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
2013-07-15 08:54:07 +02:00
|
|
|
'
|
|
|
|
|
2013-07-15 08:54:08 +02:00
|
|
|
test_expect_success 'preserve canonical email case' '
|
2019-10-25 01:36:16 +02:00
|
|
|
echo " 1 $GIT_AUTHOR_NAME <AUTHOR@example.com>" >expect &&
|
2013-07-15 08:54:07 +02:00
|
|
|
echo " 1 nick1 <bugs@company.xx>" >>expect &&
|
2019-10-25 01:36:16 +02:00
|
|
|
echo "<AUTHOR@example.com> <$GIT_AUTHOR_EMAIL>" >.mailmap &&
|
2013-07-15 08:54:07 +02:00
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
git shortlog -es HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
2013-07-15 08:54:05 +02:00
|
|
|
'
|
|
|
|
|
2009-02-08 15:34:30 +01:00
|
|
|
# Extended mailmap configurations should give us the following output for shortlog
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect << EOF
|
|
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> (1):
|
2009-02-08 15:34:30 +01:00
|
|
|
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 &&
|
|
|
|
|
2010-10-11 17:41:16 +02:00
|
|
|
mkdir -p internal_mailmap &&
|
2019-10-25 01:36:16 +02:00
|
|
|
echo "Committed <$GIT_COMMITTER_EMAIL>" > internal_mailmap/.mailmap &&
|
2009-02-08 15:34:30 +01:00
|
|
|
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
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect << EOF
|
2009-02-08 15:34:30 +01:00
|
|
|
Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
|
2019-10-25 01:36:16 +02:00
|
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
2009-02-08 15:34:30 +01:00
|
|
|
|
|
|
|
Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
|
2019-10-25 01:36:16 +02:00
|
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
2009-02-08 15:34:30 +01:00
|
|
|
|
|
|
|
Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
|
2019-10-25 01:36:16 +02:00
|
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
2009-02-08 15:34:30 +01:00
|
|
|
|
|
|
|
Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
|
2019-10-25 01:36:16 +02:00
|
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
2009-02-08 15:34:30 +01:00
|
|
|
|
|
|
|
Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
|
2019-10-25 01:36:16 +02:00
|
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
2009-02-08 15:34:30 +01:00
|
|
|
|
|
|
|
Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
|
2019-10-25 01:36:16 +02:00
|
|
|
Committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> maps to Committed <$GIT_COMMITTER_EMAIL>
|
2009-02-08 15:34:30 +01:00
|
|
|
|
2019-10-25 01:36:16 +02:00
|
|
|
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>
|
2009-02-08 15:34:30 +01:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2019-10-29 13:09:14 +01:00
|
|
|
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
|
|
|
|
|
|
|
|
test_expect_success 'Log output (local-part email address)' '
|
|
|
|
git log --pretty=format:"Author email %ae has local-part %al%nCommitter email %ce has local-part %cl%n" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect << EOF
|
2013-01-05 22:26:44 +01:00
|
|
|
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>
|
2019-10-25 01:36:16 +02:00
|
|
|
Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2013-01-05 22:26:44 +01:00
|
|
|
EOF
|
2013-01-05 22:26:45 +01:00
|
|
|
|
2013-01-05 22:26:44 +01:00
|
|
|
test_expect_success 'Log output with --use-mailmap' '
|
|
|
|
git log --use-mailmap | grep Author >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect << EOF
|
2013-01-05 22:26:46 +01:00
|
|
|
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>
|
2019-10-25 01:36:16 +02:00
|
|
|
Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2013-01-05 22:26:46 +01:00
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'Log output with log.mailmap' '
|
|
|
|
git -c log.mailmap=True log | grep Author >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2019-08-01 23:48:34 +02:00
|
|
|
test_expect_success 'log.mailmap=false disables mailmap' '
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect <<- EOF &&
|
2019-08-01 23:48:34 +02:00
|
|
|
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>
|
2019-10-25 01:36:16 +02:00
|
|
|
Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2019-08-01 23:48:34 +02:00
|
|
|
EOF
|
|
|
|
git -c log.mailmap=False log | grep Author > actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--no-use-mailmap disables mailmap' '
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect <<- EOF &&
|
2019-08-01 23:48:34 +02:00
|
|
|
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>
|
2019-10-25 01:36:16 +02:00
|
|
|
Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2019-08-01 23:48:34 +02:00
|
|
|
EOF
|
|
|
|
git log --no-use-mailmap | grep Author > actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2013-01-05 22:26:45 +01:00
|
|
|
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
|
|
|
|
'
|
2013-01-05 22:26:46 +01:00
|
|
|
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
|
|
|
|
'
|
2013-01-05 22:26:45 +01:00
|
|
|
|
2019-08-01 23:48:34 +02:00
|
|
|
test_expect_success 'log.mailmap is true by default these days' '
|
|
|
|
git log --author Santa | grep Author >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2013-01-05 22:26:45 +01:00
|
|
|
test_expect_success 'Only grep replaced author with --use-mailmap' '
|
|
|
|
git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
|
tests: use 'test_must_be_empty' instead of 'test_cmp <empty> <out>'
Using 'test_must_be_empty' is shorter and more idiomatic than
>empty &&
test_cmp empty out
as it saves the creation of an empty file. Furthermore, sometimes the
expected empty file doesn't have such a descriptive name like 'empty',
and its creation is far away from the place where it's finally used
for comparison (e.g. in 't7600-merge.sh', where two expected empty
files are created in the 'setup' test, but are used only about 500
lines later).
These cases were found by instrumenting 'test_cmp' to error out the
test script when it's used to compare empty files, and then converted
manually.
Note that even after this patch there still remain a lot of cases
where we use 'test_cmp' to check empty files:
- Sometimes the expected output is not hard-coded in the test, but
'test_cmp' is used to ensure that two similar git commands produce
the same output, and that output happens to be empty, e.g. the
test 'submodule update --merge - ignores --merge for new
submodules' in 't7406-submodule-update.sh'.
- Repetitive common tasks, including preparing the expected results
and running 'test_cmp', are often extracted into a helper
function, and some of this helper's callsites expect no output.
- For the same reason as above, the whole 'test_expect_success'
block is within a helper function, e.g. in 't3070-wildmatch.sh'.
- Or 'test_cmp' is invoked in a loop, e.g. the test 'cvs update
(-p)' in 't9400-git-cvsserver-server.sh'.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-19 23:57:25 +02:00
|
|
|
test_must_be_empty actual
|
2013-01-05 22:26:45 +01:00
|
|
|
'
|
|
|
|
|
2009-02-08 15:34:30 +01:00
|
|
|
# git blame
|
2019-10-25 01:36:16 +02:00
|
|
|
cat >expect <<EOF
|
|
|
|
^OBJI ($GIT_AUTHOR_NAME DATE 1) one
|
2010-10-15 19:12:19 +02:00
|
|
|
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
|
2009-02-08 15:34:30 +01:00
|
|
|
EOF
|
|
|
|
test_expect_success 'Blame output (complex mapping)' '
|
|
|
|
git blame one >actual &&
|
2010-10-15 19:12:19 +02:00
|
|
|
fuzz_blame actual >actual.fuzz &&
|
|
|
|
test_cmp expect actual.fuzz
|
2009-02-08 15:34:30 +01:00
|
|
|
'
|
|
|
|
|
2013-08-23 15:48:31 +02:00
|
|
|
cat >expect <<\EOF
|
|
|
|
Some Dude <some@dude.xx>
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success 'commit --author honors mailmap' '
|
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2009-02-08 15:34:27 +01:00
|
|
|
test_done
|