2009-02-08 14:34:27 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='.mailmap configurations'
|
|
|
|
|
2020-11-18 23:44:27 +00:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
tests: mark tests relying on the current default for `init.defaultBranch`
In addition to the manual adjustment to let the `linux-gcc` CI job run
the test suite with `master` and then with `main`, this patch makes sure
that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts
that currently rely on the initial branch name being `master by default.
To determine which test scripts to mark up, the first step was to
force-set the default branch name to `master` in
- all test scripts that contain the keyword `master`,
- t4211, which expects `t/t4211/history.export` with a hard-coded ref to
initialize the default branch,
- t5560 because it sources `t/t556x_common` which uses `master`,
- t8002 and t8012 because both source `t/annotate-tests.sh` which also
uses `master`)
This trick was performed by this command:
$ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' $(git grep -l master t/t[0-9]*.sh) \
t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh
After that, careful, manual inspection revealed that some of the test
scripts containing the needle `master` do not actually rely on a
specific default branch name: either they mention `master` only in a
comment, or they initialize that branch specificially, or they do not
actually refer to the current default branch. Therefore, the
aforementioned modification was undone in those test scripts thusly:
$ git checkout HEAD -- \
t/t0027-auto-crlf.sh t/t0060-path-utils.sh \
t/t1011-read-tree-sparse-checkout.sh \
t/t1305-config-include.sh t/t1309-early-config.sh \
t/t1402-check-ref-format.sh t/t1450-fsck.sh \
t/t2024-checkout-dwim.sh \
t/t2106-update-index-assume-unchanged.sh \
t/t3040-subprojects-basic.sh t/t3301-notes.sh \
t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \
t/t3436-rebase-more-options.sh \
t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \
t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \
t/t5511-refspec.sh t/t5526-fetch-submodules.sh \
t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \
t/t5548-push-porcelain.sh \
t/t5552-skipping-fetch-negotiator.sh \
t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \
t/t5614-clone-submodules-shallow.sh \
t/t7508-status.sh t/t7606-merge-custom.sh \
t/t9302-fast-import-unpack-limit.sh
We excluded one set of test scripts in these commands, though: the range
of `git p4` tests. The reason? `git p4` stores the (foreign) remote
branch in the branch called `p4/master`, which is obviously not the
default branch. Manual analysis revealed that only five of these tests
actually require a specific default branch name to pass; They were
modified thusly:
$ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' t/t980[0167]*.sh t/t9811*.sh
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-18 23:44:19 +00:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2009-02-08 14:34:27 +00:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'setup commits and contacts file' '
|
2021-01-12 20:17:59 +00:00
|
|
|
test_commit initial one one &&
|
|
|
|
test_commit --author "nick1 <bugs@company.xx>" --append second one two
|
2009-02-08 14:34:27 +00:00
|
|
|
'
|
|
|
|
|
2013-07-13 00:53:11 +00:00
|
|
|
test_expect_success 'check-mailmap no arguments' '
|
|
|
|
test_must_fail git check-mailmap
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check-mailmap arguments' '
|
2021-01-12 20:17:49 +00:00
|
|
|
cat >expect <<-EOF &&
|
2019-10-24 23:36:16 +00:00
|
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2013-07-13 00:53:11 +00:00
|
|
|
nick1 <bugs@company.xx>
|
|
|
|
EOF
|
|
|
|
git check-mailmap \
|
2019-10-24 23:36:16 +00:00
|
|
|
"$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>" \
|
2013-07-13 00:53:11 +00:00
|
|
|
"nick1 <bugs@company.xx>" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check-mailmap --stdin' '
|
2021-01-12 20:17:49 +00:00
|
|
|
cat >expect <<-EOF &&
|
2019-10-24 23:36:16 +00:00
|
|
|
$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2013-07-13 00:53:11 +00:00
|
|
|
nick1 <bugs@company.xx>
|
|
|
|
EOF
|
2021-01-12 20:17:51 +00:00
|
|
|
git check-mailmap --stdin <expect >actual &&
|
2013-07-13 00:53:11 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:51 +00:00
|
|
|
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
|
2013-07-13 00:53:11 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Internal Guy <bugs@company.xy>
|
|
|
|
EOF
|
2021-01-12 20:17:51 +00:00
|
|
|
cat contacts >>expect &&
|
|
|
|
|
2013-07-13 00:53:11 +00:00
|
|
|
git check-mailmap --stdin "Internal Guy <bugs@company.xy>" \
|
|
|
|
<contacts >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:51 +00:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2013-07-13 00:53:11 +00:00
|
|
|
test_expect_success 'check-mailmap bogus contact' '
|
|
|
|
test_must_fail git check-mailmap bogus
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:51 +00:00
|
|
|
test_expect_success 'check-mailmap bogus contact --stdin' '
|
|
|
|
test_must_fail git check-mailmap --stdin bogus </dev/null
|
|
|
|
'
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'No mailmap' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$GIT_AUTHOR_NAME (1):
|
|
|
|
initial
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
nick1 (1):
|
|
|
|
second
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
EOF
|
2009-02-08 14:34:27 +00:00
|
|
|
git shortlog HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'setup default .mailmap' '
|
|
|
|
cat >default.map <<-EOF
|
|
|
|
Repo Guy <$GIT_AUTHOR_EMAIL>
|
|
|
|
EOF
|
|
|
|
'
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'test default .mailmap' '
|
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
cp default.map .mailmap &&
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Repo Guy (1):
|
|
|
|
initial
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
nick1 (1):
|
|
|
|
second
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
EOF
|
2009-02-08 14:34:27 +00:00
|
|
|
git shortlog HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'mailmap.file set' '
|
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
cp default.map .mailmap &&
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_config mailmap.file internal.map &&
|
|
|
|
cat >internal.map <<-\EOF &&
|
|
|
|
Internal Guy <bugs@company.xx>
|
|
|
|
EOF
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Internal Guy (1):
|
|
|
|
second
|
|
|
|
|
|
|
|
Repo Guy (1):
|
|
|
|
initial
|
|
|
|
|
|
|
|
EOF
|
2009-02-08 14:34:27 +00:00
|
|
|
git shortlog HEAD >actual &&
|
2021-01-12 20:17:50 +00:00
|
|
|
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
|
|
|
|
)
|
2009-02-08 14:34:27 +00:00
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
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
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
External Guy (1):
|
|
|
|
initial
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
Internal Guy (1):
|
|
|
|
second
|
|
|
|
|
|
|
|
EOF
|
2009-02-08 14:34:27 +00:00
|
|
|
git shortlog HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'mailmap.file non-existent' '
|
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
cp default.map .mailmap &&
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Repo Guy (1):
|
|
|
|
initial
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
nick1 (1):
|
|
|
|
second
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
EOF
|
2009-02-08 14:34:27 +00:00
|
|
|
git shortlog HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'name entry after email entry' '
|
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
cp default.map .mailmap &&
|
2010-10-11 15:41:16 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_config mailmap.file internal.map &&
|
|
|
|
cat >internal.map <<-\EOF &&
|
|
|
|
<bugs@company.xy> <bugs@company.xx>
|
|
|
|
Internal Guy <bugs@company.xx>
|
|
|
|
EOF
|
2010-10-11 15:41:16 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Internal Guy (1):
|
|
|
|
second
|
2010-10-11 15:41:16 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
Repo Guy (1):
|
|
|
|
initial
|
|
|
|
|
|
|
|
EOF
|
2010-10-11 15:41:16 +00:00
|
|
|
|
2010-10-20 06:32:06 +00:00
|
|
|
git shortlog HEAD >actual &&
|
2010-10-11 15:41:16 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'name entry after email entry, case-insensitive' '
|
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
cp default.map .mailmap &&
|
2010-10-11 15:41:16 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_config mailmap.file internal.map &&
|
|
|
|
cat >internal.map <<-\EOF &&
|
|
|
|
<bugs@company.xy> <bugs@company.xx>
|
|
|
|
Internal Guy <BUGS@Company.xx>
|
|
|
|
EOF
|
2010-10-11 15:41:16 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Internal Guy (1):
|
|
|
|
second
|
2010-10-11 15:41:16 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
Repo Guy (1):
|
|
|
|
initial
|
|
|
|
|
|
|
|
EOF
|
2021-01-12 20:18:05 +00:00
|
|
|
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
|
2010-10-11 15:41:16 +00:00
|
|
|
|
2021-01-12 20:18:05 +00:00
|
|
|
EOF
|
2010-10-20 06:32:06 +00:00
|
|
|
git shortlog HEAD >actual &&
|
2010-10-11 15:41:16 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'No mailmap files, but configured' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$GIT_AUTHOR_NAME (1):
|
|
|
|
initial
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
nick1 (1):
|
|
|
|
second
|
2009-02-08 14:34:27 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
EOF
|
2009-02-08 14:34:27 +00:00
|
|
|
git shortlog HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2012-12-12 11:04:04 +00:00
|
|
|
test_expect_success 'setup mailmap blob tests' '
|
|
|
|
git checkout -b map &&
|
2020-11-18 23:44:27 +00:00
|
|
|
test_when_finished "git checkout main" &&
|
2021-01-12 20:17:49 +00:00
|
|
|
cat >just-bugs <<-\EOF &&
|
2012-12-12 11:04:04 +00:00
|
|
|
Blob Guy <bugs@company.xx>
|
|
|
|
EOF
|
2021-01-12 20:17:49 +00:00
|
|
|
cat >both <<-EOF &&
|
2019-10-24 23:36:16 +00:00
|
|
|
Blob Guy <$GIT_AUTHOR_EMAIL>
|
2012-12-12 11:04:04 +00:00
|
|
|
Blob Guy <bugs@company.xx>
|
|
|
|
EOF
|
2019-10-24 23:36:16 +00: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 01:41:39 +00:00
|
|
|
git add just-bugs both no-newline &&
|
2012-12-12 11:04:04 +00:00
|
|
|
git commit -m "my mailmaps" &&
|
2021-01-12 20:17:50 +00:00
|
|
|
|
|
|
|
cat >internal.map <<-EOF
|
|
|
|
Internal Guy <$GIT_AUTHOR_EMAIL>
|
|
|
|
EOF
|
2012-12-12 11:04:04 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'mailmap.blob set' '
|
2021-01-12 20:17:50 +00:00
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
cp default.map .mailmap &&
|
|
|
|
|
2012-12-12 11:04:04 +00:00
|
|
|
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' '
|
2021-01-12 20:17:50 +00:00
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
cp default.map .mailmap &&
|
|
|
|
|
2012-12-12 11:04:04 +00:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:55 +00:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2012-12-12 11:04:04 +00:00
|
|
|
test_expect_success 'mailmap.blob can be missing' '
|
2021-01-12 20:17:50 +00:00
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
cp default.map .mailmap &&
|
|
|
|
|
2012-12-12 11:04:04 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Repo Guy (1):
|
|
|
|
initial
|
|
|
|
|
|
|
|
nick1 (1):
|
|
|
|
second
|
|
|
|
|
|
|
|
EOF
|
2021-01-12 20:17:55 +00:00
|
|
|
git -c mailmap.blob=map:nonexistent shortlog HEAD >actual 2>err &&
|
|
|
|
test_must_be_empty err &&
|
2012-12-12 11:04:04 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:53 +00:00
|
|
|
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 &&
|
2012-12-12 11:04:04 +00:00
|
|
|
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 13:04:47 +00:00
|
|
|
test_expect_success 'mailmap.blob defaults to off in non-bare repo' '
|
|
|
|
git init non-bare &&
|
|
|
|
(
|
|
|
|
cd non-bare &&
|
2019-10-24 23:36:16 +00:00
|
|
|
test_commit one .mailmap "Fake Name <$GIT_AUTHOR_EMAIL>" &&
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
1 Fake Name
|
|
|
|
EOF
|
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 13:04:47 +00:00
|
|
|
git shortlog -ns HEAD >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
rm .mailmap &&
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
1 $GIT_AUTHOR_NAME
|
|
|
|
EOF
|
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 13:04:47 +00: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 &&
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
1 Fake Name
|
|
|
|
EOF
|
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 13:04:47 +00:00
|
|
|
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 01:41:39 +00: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
|
|
|
|
'
|
|
|
|
|
2013-07-15 06:54:06 +00:00
|
|
|
test_expect_success 'single-character name' '
|
2013-07-15 06:54:05 +00:00
|
|
|
test_when_finished "rm .mailmap" &&
|
2021-01-12 20:17:50 +00:00
|
|
|
cat >.mailmap <<-EOF &&
|
|
|
|
A <$GIT_AUTHOR_EMAIL>
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
1 A <$GIT_AUTHOR_EMAIL>
|
|
|
|
1 nick1 <bugs@company.xx>
|
|
|
|
EOF
|
2013-07-15 06:54:05 +00:00
|
|
|
git shortlog -es HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
2013-07-15 06:54:07 +00:00
|
|
|
'
|
|
|
|
|
2013-07-15 06:54:08 +00:00
|
|
|
test_expect_success 'preserve canonical email case' '
|
2013-07-15 06:54:07 +00:00
|
|
|
test_when_finished "rm .mailmap" &&
|
2021-01-12 20:17:50 +00:00
|
|
|
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
|
2013-07-15 06:54:07 +00:00
|
|
|
git shortlog -es HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
2013-07-15 06:54:05 +00:00
|
|
|
'
|
|
|
|
|
2021-01-12 20:18:01 +00:00
|
|
|
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
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:18:01 +00:00
|
|
|
test_commit -C doc --author "Joe <bugs@example.com>" F &&
|
|
|
|
test_commit -C doc --author "Jane <bugs@example.com>" G &&
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:18:01 +00:00
|
|
|
cat >>expect <<-\EOF &&
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:18:01 +00:00
|
|
|
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>
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:18:01 +00:00
|
|
|
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
|
|
|
|
'
|
2009-02-08 14:34:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
test_expect_success 'Shortlog output (complex mapping)' '
|
2021-01-12 20:17:50 +00:00
|
|
|
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
|
|
|
|
|
2021-01-12 20:17:59 +00:00
|
|
|
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 &&
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
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
|
2009-02-08 14:34:30 +00:00
|
|
|
|
|
|
|
git shortlog -e HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
test_expect_success 'Log output (complex mapping)' '
|
|
|
|
test_config mailmap.file complex.map &&
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
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>
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
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>
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
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>
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
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>
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
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>
|
2009-02-08 14:34:30 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
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
|
2009-02-08 14:34:30 +00:00
|
|
|
|
|
|
|
git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
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
|
2019-10-29 12:09:14 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
Author email me@company.xx has local-part me
|
|
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
2019-10-29 12:09:14 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
Author email me@company.xx has local-part me
|
|
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
2019-10-29 12:09:14 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
Author email nick2@company.xx has local-part nick2
|
|
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
2019-10-29 12:09:14 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
Author email bugs@company.xx has local-part bugs
|
|
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
2019-10-29 12:09:14 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
Author email bugs@company.xx has local-part bugs
|
|
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
2019-10-29 12:09:14 +00:00
|
|
|
|
2021-01-12 20:17:50 +00:00
|
|
|
Author email author@example.com has local-part author
|
|
|
|
Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME
|
|
|
|
EOF
|
2019-10-29 12:09:14 +00:00
|
|
|
|
|
|
|
git log --pretty=format:"Author email %ae has local-part %al%nCommitter email %ce has local-part %cl%n" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2013-01-05 21:26:44 +00:00
|
|
|
test_expect_success 'Log output with --use-mailmap' '
|
2021-01-12 20:17:50 +00:00
|
|
|
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
|
|
|
|
|
2021-01-14 23:02:41 +00:00
|
|
|
git log --use-mailmap >log &&
|
|
|
|
grep Author log >actual &&
|
2013-01-05 21:26:44 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2013-01-05 21:26:46 +00:00
|
|
|
test_expect_success 'Log output with log.mailmap' '
|
2021-01-12 20:17:50 +00:00
|
|
|
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
|
|
|
|
|
2021-01-14 23:02:41 +00:00
|
|
|
git -c log.mailmap=True log >log &&
|
|
|
|
grep Author log >actual &&
|
2013-01-05 21:26:46 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2019-08-01 21:48:34 +00:00
|
|
|
test_expect_success 'log.mailmap=false disables mailmap' '
|
2021-01-12 20:17:49 +00:00
|
|
|
cat >expect <<-EOF &&
|
2019-08-01 21:48:34 +00: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-24 23:36:16 +00:00
|
|
|
Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2019-08-01 21:48:34 +00:00
|
|
|
EOF
|
2021-01-14 23:02:41 +00:00
|
|
|
git -c log.mailmap=false log >log &&
|
|
|
|
grep Author log >actual &&
|
2019-08-01 21:48:34 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--no-use-mailmap disables mailmap' '
|
2021-01-12 20:17:49 +00:00
|
|
|
cat >expect <<-EOF &&
|
2019-08-01 21:48:34 +00: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-24 23:36:16 +00:00
|
|
|
Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
|
2019-08-01 21:48:34 +00:00
|
|
|
EOF
|
2021-01-14 23:02:41 +00:00
|
|
|
git log --no-use-mailmap >log &&
|
|
|
|
grep Author log >actual &&
|
2019-08-01 21:48:34 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2013-01-05 21:26:45 +00:00
|
|
|
test_expect_success 'Grep author with --use-mailmap' '
|
2021-01-12 20:17:50 +00:00
|
|
|
test_config mailmap.file complex.map &&
|
|
|
|
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Author: Santa Claus <santa.claus@northpole.xx>
|
|
|
|
Author: Santa Claus <santa.claus@northpole.xx>
|
|
|
|
EOF
|
2021-01-14 23:02:41 +00:00
|
|
|
git log --use-mailmap --author Santa >log &&
|
|
|
|
grep Author log >actual &&
|
2013-01-05 21:26:45 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
2013-01-05 21:26:46 +00:00
|
|
|
|
|
|
|
test_expect_success 'Grep author with log.mailmap' '
|
2021-01-12 20:17:50 +00:00
|
|
|
test_config mailmap.file complex.map &&
|
|
|
|
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Author: Santa Claus <santa.claus@northpole.xx>
|
|
|
|
Author: Santa Claus <santa.claus@northpole.xx>
|
|
|
|
EOF
|
|
|
|
|
2021-01-14 23:02:41 +00:00
|
|
|
git -c log.mailmap=True log --author Santa >log &&
|
|
|
|
grep Author log >actual &&
|
2013-01-05 21:26:46 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
2013-01-05 21:26:45 +00:00
|
|
|
|
2019-08-01 21:48:34 +00:00
|
|
|
test_expect_success 'log.mailmap is true by default these days' '
|
2021-01-12 20:17:50 +00:00
|
|
|
test_config mailmap.file complex.map &&
|
2021-01-14 23:02:41 +00:00
|
|
|
git log --author Santa >log &&
|
|
|
|
grep Author log >actual &&
|
2019-08-01 21:48:34 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2013-01-05 21:26:45 +00:00
|
|
|
test_expect_success 'Only grep replaced author with --use-mailmap' '
|
2021-01-12 20:17:50 +00:00
|
|
|
test_config mailmap.file complex.map &&
|
2013-01-05 21:26:45 +00:00
|
|
|
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 21:57:25 +00:00
|
|
|
test_must_be_empty actual
|
2013-01-05 21:26:45 +00:00
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:54 +00:00
|
|
|
test_expect_success 'Blame --porcelain output (complex mapping)' '
|
2021-01-12 20:17:50 +00:00
|
|
|
test_config mailmap.file complex.map &&
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
2021-01-12 20:17:54 +00:00
|
|
|
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 &&
|
2021-01-14 20:21:55 +00:00
|
|
|
|
|
|
|
NUM="[0-9][0-9]*" &&
|
|
|
|
sed -n <actual.blame >actual.fuzz \
|
|
|
|
-e "s/^author //p" \
|
|
|
|
-e "s/^$OID_REGEX \\($NUM $NUM $NUM\\)$/\\1/p" &&
|
2010-10-15 17:12:19 +00:00
|
|
|
test_cmp expect actual.fuzz
|
2009-02-08 14:34:30 +00:00
|
|
|
'
|
|
|
|
|
2021-01-12 20:17:54 +00:00
|
|
|
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
|
|
|
|
'
|
2013-08-23 13:48:31 +00:00
|
|
|
|
|
|
|
test_expect_success 'commit --author honors mailmap' '
|
2021-01-12 20:17:50 +00:00
|
|
|
test_config mailmap.file complex.map &&
|
|
|
|
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Some Dude <some@dude.xx>
|
|
|
|
EOF
|
|
|
|
|
2013-08-23 13:48:31 +00:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:18:02 +00:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:18:03 +00:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2021-01-12 20:18:04 +00:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
mailmap: only look for .mailmap in work tree
When trying to find a .mailmap file, we will always look for it in the
current directory. This makes sense in a repository with a working tree,
since we'd always go to the toplevel directory at startup. But for a
bare repository, it can be confusing. With an option like --git-dir (or
$GIT_DIR in the environment), we don't chdir at all, and we'd read
.mailmap from whatever directory you happened to be in before starting
Git.
(Note that --git-dir without specifying a working tree historically
means "the current directory is the root of the working tree", but most
bare repositories will have core.bare set these days, meaning they will
realize there is no working tree at all).
The documentation for gitmailmap(5) says:
If the file `.mailmap` exists at the toplevel of the repository[...]
which likewise reinforces the notion that we are looking in the working
tree.
This patch prevents us from looking for such a file when we're in a bare
repository. This does break something that used to work:
cd bare.git
git cat-file blob HEAD:.mailmap >.mailmap
git shortlog
But that was never advertised in the documentation. And these days we
have mailmap.blob (which defaults to HEAD:.mailmap) to do the same thing
in a much cleaner way.
However, there's one more interesting case: we might not have a
repository at all! The git-shortlog command can be run with git-log
output fed on its stdin, and it will apply the mailmap. In that case, it
probably does make sense to read .mailmap from the current directory.
This patch will continue to do so.
That leads to one even weirder case: if you run git-shortlog to process
stdin, the input _could_ be from a different repository entirely. Should
we respect the in-tree .mailmap then? Probably yes. Whatever the source
of the input, if shortlog is running in a repository, the documentation
claims that we'd read the .mailmap from its top-level (and of course
it's reasonably likely that it _is_ from the same repo, and the user
just preferred to run git-log and git-shortlog separately for whatever
reason).
The included test covers these cases, and we now document the "no repo"
case explicitly.
We also add a test that confirms we find a top-level ".mailmap" even
when we start in a subdirectory of the working tree. This worked both
before and after this commit, but we never tested it explicitly (it
works because we always chdir to the top-level of the working tree if
there is one).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-02-10 20:34:33 +00:00
|
|
|
test_expect_success 'set up mailmap location tests' '
|
|
|
|
git init --bare loc-bare &&
|
|
|
|
git --git-dir=loc-bare --work-tree=. commit \
|
|
|
|
--allow-empty -m foo --author="Orig <orig@example.com>" &&
|
|
|
|
echo "New <new@example.com> <orig@example.com>" >loc-bare/.mailmap
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'bare repo with --work-tree finds mailmap at top-level' '
|
|
|
|
git -C loc-bare --work-tree=. log -1 --format=%aE >actual &&
|
|
|
|
echo new@example.com >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'bare repo does not look in current directory' '
|
|
|
|
git -C loc-bare log -1 --format=%aE >actual &&
|
|
|
|
echo orig@example.com >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'non-git shortlog respects mailmap in current dir' '
|
|
|
|
git --git-dir=loc-bare log -1 >input &&
|
|
|
|
nongit cp "$TRASH_DIRECTORY/loc-bare/.mailmap" . &&
|
|
|
|
nongit git shortlog -s <input >actual &&
|
|
|
|
echo " 1 New" >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'shortlog on stdin respects mailmap from repo' '
|
|
|
|
cp loc-bare/.mailmap . &&
|
|
|
|
git shortlog -s <input >actual &&
|
|
|
|
echo " 1 New" >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'find top-level mailmap from subdir' '
|
|
|
|
git clone loc-bare loc-wt &&
|
|
|
|
cp loc-bare/.mailmap loc-wt &&
|
|
|
|
mkdir loc-wt/subdir &&
|
|
|
|
git -C loc-wt/subdir log -1 --format=%aE >actual &&
|
|
|
|
echo new@example.com >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-02-16 14:44:37 +00:00
|
|
|
test_expect_success SYMLINKS 'set up symlink tests' '
|
|
|
|
git commit --allow-empty -m foo --author="Orig <orig@example.com>" &&
|
|
|
|
echo "New <new@example.com> <orig@example.com>" >map &&
|
|
|
|
rm -f .mailmap
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success SYMLINKS 'symlinks respected in mailmap.file' '
|
|
|
|
test_when_finished "rm symlink" &&
|
|
|
|
ln -s map symlink &&
|
|
|
|
git -c mailmap.file="$(pwd)/symlink" log -1 --format=%aE >actual &&
|
|
|
|
echo "new@example.com" >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success SYMLINKS 'symlinks respected in non-repo shortlog' '
|
|
|
|
git log -1 >input &&
|
|
|
|
test_when_finished "nongit rm .mailmap" &&
|
|
|
|
nongit ln -sf "$TRASH_DIRECTORY/map" .mailmap &&
|
|
|
|
nongit git shortlog -s <input >actual &&
|
|
|
|
echo " 1 New" >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success SYMLINKS 'symlinks not respected in-tree' '
|
|
|
|
test_when_finished "rm .mailmap" &&
|
|
|
|
ln -s map .mailmap &&
|
|
|
|
git log -1 --format=%aE >actual &&
|
2021-06-07 13:13:20 +00:00
|
|
|
echo "orig@example.com" >expect &&
|
2021-02-16 14:44:37 +00:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2009-02-08 14:34:27 +00:00
|
|
|
test_done
|