From: Liam Beguin Date: Thu, 26 Oct 2023 23:16:05 GMT Subject: [PATCH 2/2] pretty: add '%aA' to show domain-part of email addresses Message-ID: <20231026-pretty-email-domain-v1-2-5d6bfa6615c0@gmail.com> In-Reply-To: <20231026-pretty-email-domain-v1-0-5d6bfa6615c0@gmail.com> Many reports use the email domain to keep track of organizations contributing to projects. Add support for formatting the domain-part of a contributor's address so that this can be done using git itself, with something like: git shortlog -sn --group=format:%aA v2.41.0..v2.42.0 Signed-off-by: Liam Beguin --- Documentation/pretty-formats.txt | 6 ++++++ pretty.c | 13 ++++++++++++- t/t4203-mailmap.sh | 28 ++++++++++++++++++++++++++++ t/t6006-rev-list-format.sh | 6 ++++-- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index a22f6fceecdd..72102a681c3a 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -195,6 +195,9 @@ The placeholders are: '%al':: author email local-part (the part before the '@' sign) '%aL':: author email local-part (see '%al') respecting .mailmap, see linkgit:git-shortlog[1] or linkgit:git-blame[1]) +'%aa':: author email domain-part (the part after the '@' sign) +'%aA':: author email domain-part (see '%al') respecting .mailmap, see + linkgit:git-shortlog[1] or linkgit:git-blame[1]) '%ad':: author date (format respects --date= option) '%aD':: author date, RFC2822 style '%ar':: author date, relative @@ -213,6 +216,9 @@ The placeholders are: '%cl':: committer email local-part (the part before the '@' sign) '%cL':: committer email local-part (see '%cl') respecting .mailmap, see linkgit:git-shortlog[1] or linkgit:git-blame[1]) +'%ca':: committer email domain-part (the part before the '@' sign) +'%cA':: committer email domain-part (see '%cl') respecting .mailmap, see + linkgit:git-shortlog[1] or linkgit:git-blame[1]) '%cd':: committer date (format respects --date= option) '%cD':: committer date, RFC2822 style '%cr':: committer date, relative diff --git a/pretty.c b/pretty.c index cf964b060cd1..4f5d081589ea 100644 --- a/pretty.c +++ b/pretty.c @@ -791,7 +791,7 @@ static size_t format_person_part(struct strbuf *sb, char part, mail = s.mail_begin; maillen = s.mail_end - s.mail_begin; - if (part == 'N' || part == 'E' || part == 'L') /* mailmap lookup */ + if (part == 'N' || part == 'E' || part == 'L' || part == 'A') /* mailmap lookup */ mailmap_name(&mail, &maillen, &name, &namelen); if (part == 'n' || part == 'N') { /* name */ strbuf_add(sb, name, namelen); @@ -808,6 +808,17 @@ static size_t format_person_part(struct strbuf *sb, char part, strbuf_add(sb, mail, maillen); return placeholder_len; } + if (part == 'a' || part == 'A') { /* domain-part */ + const char *at = memchr(mail, '@', maillen); + if (at) { + at += 1; + maillen -= at - mail; + strbuf_add(sb, at, maillen); + } else { + strbuf_add(sb, mail, maillen); + } + return placeholder_len; + } if (!s.date_begin) goto skip; diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh index 2016132f5161..35bf7bb05bea 100755 --- a/t/t4203-mailmap.sh +++ b/t/t4203-mailmap.sh @@ -624,6 +624,34 @@ test_expect_success 'Log output (local-part email address)' ' test_cmp expect actual ' +test_expect_success 'Log output (domain-part email address)' ' + cat >expect <<-EOF && + Author email cto@coompany.xx has domain-part coompany.xx + Committer email $GIT_COMMITTER_EMAIL has domain-part $TEST_COMMITTER_DOMAIN + + Author email me@company.xx has domain-part company.xx + Committer email $GIT_COMMITTER_EMAIL has domain-part $TEST_COMMITTER_DOMAIN + + Author email me@company.xx has domain-part company.xx + Committer email $GIT_COMMITTER_EMAIL has domain-part $TEST_COMMITTER_DOMAIN + + Author email nick2@company.xx has domain-part company.xx + Committer email $GIT_COMMITTER_EMAIL has domain-part $TEST_COMMITTER_DOMAIN + + Author email bugs@company.xx has domain-part company.xx + Committer email $GIT_COMMITTER_EMAIL has domain-part $TEST_COMMITTER_DOMAIN + + Author email bugs@company.xx has domain-part company.xx + Committer email $GIT_COMMITTER_EMAIL has domain-part $TEST_COMMITTER_DOMAIN + + Author email author@example.com has domain-part example.com + Committer email $GIT_COMMITTER_EMAIL has domain-part $TEST_COMMITTER_DOMAIN + EOF + + git log --pretty=format:"Author email %ae has domain-part %aa%nCommitter email %ce has domain-part %ca%n" >actual && + test_cmp expect actual +' + test_expect_success 'Log output with --use-mailmap' ' test_config mailmap.file complex.map && diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh index 573eb97a0f7f..34c686becf2d 100755 --- a/t/t6006-rev-list-format.sh +++ b/t/t6006-rev-list-format.sh @@ -163,11 +163,12 @@ commit $head1 EOF # we don't test relative here -test_format author %an%n%ae%n%al%n%ad%n%aD%n%at <