{"thread":{"id":"52150","subject":"[PATCH v4] pretty: add \"%aL\" etc. to show local-part of email addresses","startedAt":"2019-10-29T12:09:31Z","lastAt":"2019-11-06T02:01:20Z","messageCount":5,"participants":["Prarit Bhargava","Junio C Hamano"],"isPatch":true,"patchVersion":4,"patchTotal":null},"messages":[{"id":"385069","messageId":"20191029120914.14756-1-prarit@redhat.com","threadId":"52150","inReplyTo":null,"subject":"[PATCH v4] pretty: add \"%aL\" etc. to show local-part of email addresses","fromName":"Prarit Bhargava","fromEmail":"prarit@redhat.com","sentAt":"2019-10-29T12:09:14Z","receivedAt":"2019-10-29T12:09:31Z","isPatch":true,"sender":{"key":"prarit@redhat.com","avatar":"https://avatars.githubusercontent.com/u/11943259?v=4"},"body":"In many projects the number of contributors is low enough that users know\neach other and the full email address doesn't need to be displayed.\nDisplaying only the author's username saves a lot of columns on the screen.\n\nExisting 'e/E' (as in \"%ae\" and \"%aE\") placeholders would show the\nauthor's address as \"prarit@redhat.com\", which would waste columns to show\nthe same domain-part for all contributors when used in redhat-only\nproject.  Introduce 'l/L' placeholders that strip '@' and domain part from\nthe e-mail address.\n\nSigned-off-by: Prarit Bhargava <prarit@redhat.com>\n---\nChanges in v2:\n- Changed option to 'L' based on https://www.ietf.org/rfc/rfc2822.txt\n  definition of 'local-part' of email addresses.\n- added additional information to documentation for %cL and %cl\n- added mailmap output test\n- modified code to use mailmap output for \"L\" option\n- modified code to check if email address field has '@' symbol\n- modified tests based on input from Peff\n\nChanges in v3:\n- Adjust Documentation descriptions for %aL and %cL\n- remove exports of TEST* variables from test-lib.sh\n- move testing to t6006 and t4203\n\nChanges in v4:\n- Change subject and patch description\n- Update Documentation descriptions for %aL and %cL\n\n Documentation/pretty-formats.txt |  6 ++++++\n pretty.c                         |  9 ++++++++-\n t/t4203-mailmap.sh               | 28 ++++++++++++++++++++++++++++\n t/t6006-rev-list-format.sh       |  8 ++++++--\n t/test-lib.sh                    |  8 ++++++--\n 5 files changed, 54 insertions(+), 5 deletions(-)\n\ndiff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt\nindex b87e2e83e6d0..31c6e8d2b86a 100644\n--- a/Documentation/pretty-formats.txt\n+++ b/Documentation/pretty-formats.txt\n@@ -163,6 +163,9 @@ The placeholders are:\n '%ae':: author email\n '%aE':: author email (respecting .mailmap, see linkgit:git-shortlog[1]\n \tor linkgit:git-blame[1])\n+'%al':: author email local-part (the part before the '@' sign)\n+'%aL':: author local-part (see '%al') respecting .mailmap, see\n+\tlinkgit:git-shortlog[1] or linkgit:git-blame[1])\n '%ad':: author date (format respects --date= option)\n '%aD':: author date, RFC2822 style\n '%ar':: author date, relative\n@@ -175,6 +178,9 @@ The placeholders are:\n '%ce':: committer email\n '%cE':: committer email (respecting .mailmap, see\n \tlinkgit:git-shortlog[1] or linkgit:git-blame[1])\n+'%cl':: author email local-part (the part before the '@' sign)\n+'%cL':: author local-part (see '%cl') respecting .mailmap, see\n+\tlinkgit:git-shortlog[1] or linkgit:git-blame[1])\n '%cd':: committer date (format respects --date= option)\n '%cD':: committer date, RFC2822 style\n '%cr':: committer date, relative\ndiff --git a/pretty.c b/pretty.c\nindex b32f0369531c..93eb6e837071 100644\n--- a/pretty.c\n+++ b/pretty.c\n@@ -696,7 +696,7 @@ static size_t format_person_part(struct strbuf *sb, char part,\n \tmail = s.mail_begin;\n \tmaillen = s.mail_end - s.mail_begin;\n \n-\tif (part == 'N' || part == 'E') /* mailmap lookup */\n+\tif (part == 'N' || part == 'E' || part == 'L') /* mailmap lookup */\n \t\tmailmap_name(&mail, &maillen, &name, &namelen);\n \tif (part == 'n' || part == 'N') {\t/* name */\n \t\tstrbuf_add(sb, name, namelen);\n@@ -706,6 +706,13 @@ static size_t format_person_part(struct strbuf *sb, char part,\n \t\tstrbuf_add(sb, mail, maillen);\n \t\treturn placeholder_len;\n \t}\n+\tif (part == 'l' || part == 'L') {\t/* local-part */\n+\t\tconst char *at = memchr(mail, '@', maillen);\n+\t\tif (at)\n+\t\t\tmaillen = at - mail;\n+\t\tstrbuf_add(sb, mail, maillen);\n+\t\treturn placeholder_len;\n+\t}\n \n \tif (!s.date_begin)\n \t\tgoto skip;\ndiff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh\nindex e8f9c0f5bc8c..586c3a86b1d2 100755\n--- a/t/t4203-mailmap.sh\n+++ b/t/t4203-mailmap.sh\n@@ -412,6 +412,34 @@ test_expect_success 'Log output (complex mapping)' '\n \ttest_cmp expect actual\n '\n \n+cat >expect << EOF\n+Author email cto@coompany.xx has local-part cto\n+Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n+\n+Author email me@company.xx has local-part me\n+Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n+\n+Author email me@company.xx has local-part me\n+Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n+\n+Author email nick2@company.xx has local-part nick2\n+Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n+\n+Author email bugs@company.xx has local-part bugs\n+Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n+\n+Author email bugs@company.xx has local-part bugs\n+Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n+\n+Author email author@example.com has local-part author\n+Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n+EOF\n+\n+test_expect_success 'Log output (local-part email address)' '\n+\tgit log --pretty=format:\"Author email %ae has local-part %al%nCommitter email %ce has local-part %cl%n\" >actual &&\n+\ttest_cmp expect actual\n+'\n+\n cat >expect << EOF\n Author: CTO <cto@company.xx>\n Author: Santa Claus <santa.claus@northpole.xx>\ndiff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh\nindex 1f7d3f7acc9c..ebdc49c4965e 100755\n--- a/t/t6006-rev-list-format.sh\n+++ b/t/t6006-rev-list-format.sh\n@@ -109,31 +109,35 @@ commit $head1\n EOF\n \n # we don't test relative here\n-test_format author %an%n%ae%n%ad%n%aD%n%at <<EOF\n+test_format author %an%n%ae%n%al%n%ad%n%aD%n%at <<EOF\n commit $head2\n $GIT_AUTHOR_NAME\n $GIT_AUTHOR_EMAIL\n+$TEST_AUTHOR_LOCALNAME\n Thu Apr 7 15:13:13 2005 -0700\n Thu, 7 Apr 2005 15:13:13 -0700\n 1112911993\n commit $head1\n $GIT_AUTHOR_NAME\n $GIT_AUTHOR_EMAIL\n+$TEST_AUTHOR_LOCALNAME\n Thu Apr 7 15:13:13 2005 -0700\n Thu, 7 Apr 2005 15:13:13 -0700\n 1112911993\n EOF\n \n-test_format committer %cn%n%ce%n%cd%n%cD%n%ct <<EOF\n+test_format committer %cn%n%ce%n%cl%n%cd%n%cD%n%ct <<EOF\n commit $head2\n $GIT_COMMITTER_NAME\n $GIT_COMMITTER_EMAIL\n+$TEST_COMMITTER_LOCALNAME\n Thu Apr 7 15:13:13 2005 -0700\n Thu, 7 Apr 2005 15:13:13 -0700\n 1112911993\n commit $head1\n $GIT_COMMITTER_NAME\n $GIT_COMMITTER_EMAIL\n+$TEST_COMMITTER_LOCALNAME\n Thu Apr 7 15:13:13 2005 -0700\n Thu, 7 Apr 2005 15:13:13 -0700\n 1112911993\ndiff --git a/t/test-lib.sh b/t/test-lib.sh\nindex e06fa02a0eec..46c44408432e 100644\n--- a/t/test-lib.sh\n+++ b/t/test-lib.sh\n@@ -404,9 +404,13 @@ unset VISUAL EMAIL LANGUAGE COLUMNS $(\"$PERL_PATH\" -e '\n unset XDG_CACHE_HOME\n unset XDG_CONFIG_HOME\n unset GITPERLLIB\n-GIT_AUTHOR_EMAIL=author@example.com\n+TEST_AUTHOR_LOCALNAME=author\n+TEST_AUTHOR_DOMAIN=example.com\n+GIT_AUTHOR_EMAIL=${TEST_AUTHOR_LOCALNAME}@${TEST_AUTHOR_DOMAIN}\n GIT_AUTHOR_NAME='A U Thor'\n-GIT_COMMITTER_EMAIL=committer@example.com\n+TEST_COMMITTER_LOCALNAME=committer\n+TEST_COMMITTER_DOMAIN=example.com\n+GIT_COMMITTER_EMAIL=${TEST_COMMITTER_LOCALNAME}@${TEST_COMMITTER_DOMAIN}\n GIT_COMMITTER_NAME='C O Mitter'\n GIT_MERGE_VERBOSITY=5\n GIT_MERGE_AUTOEDIT=no\n-- \n2.21.0\n\n"},{"id":"385342","messageId":"b9516269-3c17-1e7d-27f8-83558b56d1bd@redhat.com","threadId":"52150","inReplyTo":"20191029120914.14756-1-prarit@redhat.com","subject":"Re: [PATCH v4] pretty: add \"%aL\" etc. to show local-part of email addresses","fromName":"Prarit Bhargava","fromEmail":"prarit@redhat.com","sentAt":"2019-11-03T13:28:46Z","receivedAt":"2019-11-03T13:28:54Z","isPatch":true,"sender":{"key":"prarit@redhat.com","avatar":"https://avatars.githubusercontent.com/u/11943259?v=4"},"body":"Just re-pinging to make sure this didn't get lost.\n\nThanks,\n\nP.\n\nOn 10/29/19 8:09 AM, Prarit Bhargava wrote:\n> In many projects the number of contributors is low enough that users know\n> each other and the full email address doesn't need to be displayed.\n> Displaying only the author's username saves a lot of columns on the screen.\n> \n> Existing 'e/E' (as in \"%ae\" and \"%aE\") placeholders would show the\n> author's address as \"prarit@redhat.com\", which would waste columns to show\n> the same domain-part for all contributors when used in redhat-only\n> project.  Introduce 'l/L' placeholders that strip '@' and domain part from\n> the e-mail address.\n> \n> Signed-off-by: Prarit Bhargava <prarit@redhat.com>\n> ---\n> Changes in v2:\n> - Changed option to 'L' based on https://www.ietf.org/rfc/rfc2822.txt\n>   definition of 'local-part' of email addresses.\n> - added additional information to documentation for %cL and %cl\n> - added mailmap output test\n> - modified code to use mailmap output for \"L\" option\n> - modified code to check if email address field has '@' symbol\n> - modified tests based on input from Peff\n> \n> Changes in v3:\n> - Adjust Documentation descriptions for %aL and %cL\n> - remove exports of TEST* variables from test-lib.sh\n> - move testing to t6006 and t4203\n> \n> Changes in v4:\n> - Change subject and patch description\n> - Update Documentation descriptions for %aL and %cL\n> \n>  Documentation/pretty-formats.txt |  6 ++++++\n>  pretty.c                         |  9 ++++++++-\n>  t/t4203-mailmap.sh               | 28 ++++++++++++++++++++++++++++\n>  t/t6006-rev-list-format.sh       |  8 ++++++--\n>  t/test-lib.sh                    |  8 ++++++--\n>  5 files changed, 54 insertions(+), 5 deletions(-)\n> \n> diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt\n> index b87e2e83e6d0..31c6e8d2b86a 100644\n> --- a/Documentation/pretty-formats.txt\n> +++ b/Documentation/pretty-formats.txt\n> @@ -163,6 +163,9 @@ The placeholders are:\n>  '%ae':: author email\n>  '%aE':: author email (respecting .mailmap, see linkgit:git-shortlog[1]\n>  \tor linkgit:git-blame[1])\n> +'%al':: author email local-part (the part before the '@' sign)\n> +'%aL':: author local-part (see '%al') respecting .mailmap, see\n> +\tlinkgit:git-shortlog[1] or linkgit:git-blame[1])\n>  '%ad':: author date (format respects --date= option)\n>  '%aD':: author date, RFC2822 style\n>  '%ar':: author date, relative\n> @@ -175,6 +178,9 @@ The placeholders are:\n>  '%ce':: committer email\n>  '%cE':: committer email (respecting .mailmap, see\n>  \tlinkgit:git-shortlog[1] or linkgit:git-blame[1])\n> +'%cl':: author email local-part (the part before the '@' sign)\n> +'%cL':: author local-part (see '%cl') respecting .mailmap, see\n> +\tlinkgit:git-shortlog[1] or linkgit:git-blame[1])\n>  '%cd':: committer date (format respects --date= option)\n>  '%cD':: committer date, RFC2822 style\n>  '%cr':: committer date, relative\n> diff --git a/pretty.c b/pretty.c\n> index b32f0369531c..93eb6e837071 100644\n> --- a/pretty.c\n> +++ b/pretty.c\n> @@ -696,7 +696,7 @@ static size_t format_person_part(struct strbuf *sb, char part,\n>  \tmail = s.mail_begin;\n>  \tmaillen = s.mail_end - s.mail_begin;\n>  \n> -\tif (part == 'N' || part == 'E') /* mailmap lookup */\n> +\tif (part == 'N' || part == 'E' || part == 'L') /* mailmap lookup */\n>  \t\tmailmap_name(&mail, &maillen, &name, &namelen);\n>  \tif (part == 'n' || part == 'N') {\t/* name */\n>  \t\tstrbuf_add(sb, name, namelen);\n> @@ -706,6 +706,13 @@ static size_t format_person_part(struct strbuf *sb, char part,\n>  \t\tstrbuf_add(sb, mail, maillen);\n>  \t\treturn placeholder_len;\n>  \t}\n> +\tif (part == 'l' || part == 'L') {\t/* local-part */\n> +\t\tconst char *at = memchr(mail, '@', maillen);\n> +\t\tif (at)\n> +\t\t\tmaillen = at - mail;\n> +\t\tstrbuf_add(sb, mail, maillen);\n> +\t\treturn placeholder_len;\n> +\t}\n>  \n>  \tif (!s.date_begin)\n>  \t\tgoto skip;\n> diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh\n> index e8f9c0f5bc8c..586c3a86b1d2 100755\n> --- a/t/t4203-mailmap.sh\n> +++ b/t/t4203-mailmap.sh\n> @@ -412,6 +412,34 @@ test_expect_success 'Log output (complex mapping)' '\n>  \ttest_cmp expect actual\n>  '\n>  \n> +cat >expect << EOF\n> +Author email cto@coompany.xx has local-part cto\n> +Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n> +\n> +Author email me@company.xx has local-part me\n> +Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n> +\n> +Author email me@company.xx has local-part me\n> +Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n> +\n> +Author email nick2@company.xx has local-part nick2\n> +Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n> +\n> +Author email bugs@company.xx has local-part bugs\n> +Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n> +\n> +Author email bugs@company.xx has local-part bugs\n> +Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n> +\n> +Author email author@example.com has local-part author\n> +Committer email $GIT_COMMITTER_EMAIL has local-part $TEST_COMMITTER_LOCALNAME\n> +EOF\n> +\n> +test_expect_success 'Log output (local-part email address)' '\n> +\tgit log --pretty=format:\"Author email %ae has local-part %al%nCommitter email %ce has local-part %cl%n\" >actual &&\n> +\ttest_cmp expect actual\n> +'\n> +\n>  cat >expect << EOF\n>  Author: CTO <cto@company.xx>\n>  Author: Santa Claus <santa.claus@northpole.xx>\n> diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh\n> index 1f7d3f7acc9c..ebdc49c4965e 100755\n> --- a/t/t6006-rev-list-format.sh\n> +++ b/t/t6006-rev-list-format.sh\n> @@ -109,31 +109,35 @@ commit $head1\n>  EOF\n>  \n>  # we don't test relative here\n> -test_format author %an%n%ae%n%ad%n%aD%n%at <<EOF\n> +test_format author %an%n%ae%n%al%n%ad%n%aD%n%at <<EOF\n>  commit $head2\n>  $GIT_AUTHOR_NAME\n>  $GIT_AUTHOR_EMAIL\n> +$TEST_AUTHOR_LOCALNAME\n>  Thu Apr 7 15:13:13 2005 -0700\n>  Thu, 7 Apr 2005 15:13:13 -0700\n>  1112911993\n>  commit $head1\n>  $GIT_AUTHOR_NAME\n>  $GIT_AUTHOR_EMAIL\n> +$TEST_AUTHOR_LOCALNAME\n>  Thu Apr 7 15:13:13 2005 -0700\n>  Thu, 7 Apr 2005 15:13:13 -0700\n>  1112911993\n>  EOF\n>  \n> -test_format committer %cn%n%ce%n%cd%n%cD%n%ct <<EOF\n> +test_format committer %cn%n%ce%n%cl%n%cd%n%cD%n%ct <<EOF\n>  commit $head2\n>  $GIT_COMMITTER_NAME\n>  $GIT_COMMITTER_EMAIL\n> +$TEST_COMMITTER_LOCALNAME\n>  Thu Apr 7 15:13:13 2005 -0700\n>  Thu, 7 Apr 2005 15:13:13 -0700\n>  1112911993\n>  commit $head1\n>  $GIT_COMMITTER_NAME\n>  $GIT_COMMITTER_EMAIL\n> +$TEST_COMMITTER_LOCALNAME\n>  Thu Apr 7 15:13:13 2005 -0700\n>  Thu, 7 Apr 2005 15:13:13 -0700\n>  1112911993\n> diff --git a/t/test-lib.sh b/t/test-lib.sh\n> index e06fa02a0eec..46c44408432e 100644\n> --- a/t/test-lib.sh\n> +++ b/t/test-lib.sh\n> @@ -404,9 +404,13 @@ unset VISUAL EMAIL LANGUAGE COLUMNS $(\"$PERL_PATH\" -e '\n>  unset XDG_CACHE_HOME\n>  unset XDG_CONFIG_HOME\n>  unset GITPERLLIB\n> -GIT_AUTHOR_EMAIL=author@example.com\n> +TEST_AUTHOR_LOCALNAME=author\n> +TEST_AUTHOR_DOMAIN=example.com\n> +GIT_AUTHOR_EMAIL=${TEST_AUTHOR_LOCALNAME}@${TEST_AUTHOR_DOMAIN}\n>  GIT_AUTHOR_NAME='A U Thor'\n> -GIT_COMMITTER_EMAIL=committer@example.com\n> +TEST_COMMITTER_LOCALNAME=committer\n> +TEST_COMMITTER_DOMAIN=example.com\n> +GIT_COMMITTER_EMAIL=${TEST_COMMITTER_LOCALNAME}@${TEST_COMMITTER_DOMAIN}\n>  GIT_COMMITTER_NAME='C O Mitter'\n>  GIT_MERGE_VERBOSITY=5\n>  GIT_MERGE_AUTOEDIT=no\n> \n\n"},{"id":"385362","messageId":"xmqqpni8z37z.fsf@gitster-ct.c.googlers.com","threadId":"52150","inReplyTo":"b9516269-3c17-1e7d-27f8-83558b56d1bd@redhat.com","subject":"Re: [PATCH v4] pretty: add \"%aL\" etc. to show local-part of email addresses","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2019-11-04T04:15:44Z","receivedAt":"2019-11-04T04:15:50Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Prarit Bhargava <prarit@redhat.com> writes:\n\n> Just re-pinging to make sure this didn't get lost.\n\nI think it has been on 'next' for several days aleady.\n\n"},{"id":"385390","messageId":"2ad15a2d-63c7-51a5-fe1e-64e9b655adca@redhat.com","threadId":"52150","inReplyTo":"xmqqpni8z37z.fsf@gitster-ct.c.googlers.com","subject":"Re: [PATCH v4] pretty: add \"%aL\" etc. to show local-part of email addresses","fromName":"Prarit Bhargava","fromEmail":"prarit@redhat.com","sentAt":"2019-11-04T12:35:31Z","receivedAt":"2019-11-04T12:35:39Z","isPatch":true,"sender":{"key":"prarit@redhat.com","avatar":"https://avatars.githubusercontent.com/u/11943259?v=4"},"body":"\n\nOn 11/3/19 11:15 PM, Junio C Hamano wrote:\n> Prarit Bhargava <prarit@redhat.com> writes:\n> \n>> Just re-pinging to make sure this didn't get lost.\n> \n> I think it has been on 'next' for several days aleady.\n> \n\nMy apologies Junio.  I didn't realize that.\n\nThanks :)\n\nP.\n\n"},{"id":"385512","messageId":"xmqqk18dwyoo.fsf@gitster-ct.c.googlers.com","threadId":"52150","inReplyTo":"2ad15a2d-63c7-51a5-fe1e-64e9b655adca@redhat.com","subject":"Re: [PATCH v4] pretty: add \"%aL\" etc. to show local-part of email addresses","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2019-11-06T02:01:11Z","receivedAt":"2019-11-06T02:01:20Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Prarit Bhargava <prarit@redhat.com> writes:\n\n> On 11/3/19 11:15 PM, Junio C Hamano wrote:\n>> Prarit Bhargava <prarit@redhat.com> writes:\n>> \n>>> Just re-pinging to make sure this didn't get lost.\n>> \n>> I think it has been on 'next' for several days aleady.\n>> \n>\n> My apologies Junio.  I didn't realize that.\n>\n> Thanks :)\n\nNo apologies needed; we are all human and not perfect, and I do\nappreciate the pinging as I often end up saying \"I didn't realize I\nhaven't picked it up\".\n\nThanks.\n"}]}