On Tue, Feb 16, 2021 at 09:44:37AM -0500, Jeff King wrote: > @@ -225,10 +235,12 @@ int read_mailmap(struct string_list *map) > if (!git_mailmap_blob && is_bare_repository()) > git_mailmap_blob = "HEAD:.mailmap"; > > - err |= read_mailmap_file(map, ".mailmap"); > + err |= read_mailmap_file(map, ".mailmap", > + startup_info->have_repository ? > + MAILMAP_NOFOLLOW : 0); This conflicts with my jk/mailmap-only-at-root topic currently in "next", of course. Ditto for the new tests. The resolution is pretty straight-forward, though: diff --cc mailmap.c index 9bb9cf8b30,7ac966107e..0000000000 --- a/mailmap.c +++ b/mailmap.c @@@ -225,11 -235,12 +235,13 @@@ int read_mailmap(struct string_list *ma if (!git_mailmap_blob && is_bare_repository()) git_mailmap_blob = "HEAD:.mailmap"; - err |= read_mailmap_file(map, ".mailmap", - startup_info->have_repository ? - MAILMAP_NOFOLLOW : 0); + if (!startup_info->have_repository || !is_bare_repository()) - err |= read_mailmap_file(map, ".mailmap"); ++ err |= read_mailmap_file(map, ".mailmap", ++ startup_info->have_repository ? ++ MAILMAP_NOFOLLOW : 0); if (startup_info->have_repository) err |= read_mailmap_blob(map, git_mailmap_blob); - err |= read_mailmap_file(map, git_mailmap_file); + err |= read_mailmap_file(map, git_mailmap_file, 0); return err; } diff --cc t/t4203-mailmap.sh index 93caf9a46d,96a4e6132f..0000000000 --- a/t/t4203-mailmap.sh +++ b/t/t4203-mailmap.sh @@@ -889,47 -889,35 +889,78 @@@ test_expect_success 'empty syntax: setu test_cmp expect actual ' +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@xxxxxxxxxxx>" && + echo "New <new@xxxxxxxxxxx> <orig@xxxxxxxxxxx>" >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@xxxxxxxxxxx >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@xxxxxxxxxxx >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@xxxxxxxxxxx >expect && + test_cmp expect actual +' + + test_expect_success SYMLINKS 'set up symlink tests' ' + git commit --allow-empty -m foo --author="Orig <orig@xxxxxxxxxxx>" && + echo "New <new@xxxxxxxxxxx> <orig@xxxxxxxxxxx>" >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@xxxxxxxxxxx" >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 && + echo "orig@xxxxxxxxxxx" >expect&& + test_cmp expect actual + ' + test_done