Since the removal of Mail::Address from git-send-email certain address
patterns returned by common get_maintainer.pl scripts now fail to get
correctly parsed by the built-in Git::parse_mailboxes. Specifically
the patterns with embedded parenthesis fail. For example from the
Linux kernel MAINTAINERS:

  KERNEL VIRTUAL MACHINE FOR ARM (KVM/arm)
  L:    [email protected] (moderated for non-subscribers)
  L:    [email protected]

Which is returned by get_maintainers.pl as:

  [email protected] (moderated list:KERNEL VIRTUAL MACHINE 
FOR ARM (KVM/arm))
  [email protected] (open list:KERNEL VIRTUAL MACHINE FOR ARM 
(KVM/arm))

However Git::parse_mailboxes code mangles the address, appending the
trailing parenthesis to the email address to the address part causing
it to fail validation:

   error: unable to extract a valid address from: 
[email protected]) (moderated list:KERNEL VIRTUAL MACHINE 
FOR ARM (KVM/arm)
   error: unable to extract a valid address from: [email protected]) 
(open list:KERNEL VIRTUAL MACHINE FOR ARM (KVM/arm)

As this is a common pattern which was handled by Mail::Address I've
fixed the regression by explicitly capturing a trailing bracket and
appending it to the comment token.

NB: the t9001.sh test doesn't explicitly wrap the call to the --cc-cmd
in a "$(pwd)/expected-cc-script.sh" which fails due to the space to
the full-path of the test. It is currently ambiguous as to if --cc-cmd
needs to handle this. I suspect it is not an edge case that has come
up in real-world usage as git-send-email is usually run directly from
a git directory with scripts generally in a ./script/get_maintainer.pl
path.

Fixes: cc9075067776ebd34cc08f31bf78bb05f12fd879
Signed-off-by: Alex Bennée <[email protected]>
Cc: Eric Sunshine <[email protected]>
---
 perl/Git.pm           |  3 +++
 t/t9000/test.pl       |  3 ++-
 t/t9001-send-email.sh | 16 ++++++++++++++++
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/perl/Git.pm b/perl/Git.pm
index ffa09ace9..9b17de1cc 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -936,6 +936,9 @@ sub parse_mailboxes {
                        $end_of_addr_seen = 0;
                } elsif ($token =~ /^\(/) {
                        push @comment, $token;
+               } elsif ($token =~ /^\)/) {
+                       my $nested_comment = pop @comment;
+                       push @comment, "$nested_comment$token";
                } elsif ($token eq "<") {
                        push @phrase, (splice @address), (splice @buffer);
                } elsif ($token eq ">") {
diff --git a/t/t9000/test.pl b/t/t9000/test.pl
index dfeaa9c65..b01642a0d 100755
--- a/t/t9000/test.pl
+++ b/t/t9000/test.pl
@@ -35,7 +35,8 @@ my @success_list = (q[Jane],
        q['Jane 'Doe' <[email protected]>],
        q[Jane@:;\.,()<>Doe <[email protected]>],
        q[Jane <[email protected]> Doe],
-       q[<[email protected]> Jane Doe]);
+       q[<[email protected]> Jane Doe],
+       q[[email protected] (open list:for thing (foo/bar))]);
 
 my @known_failure_list = (q[Jane\ Doe <[email protected]>],
        q["Doe, Ja"ne <[email protected]>],
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 4d261c2a9..fa783eb87 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -172,6 +172,22 @@ test_expect_success $PREREQ 'cc trailer with various 
syntax' '
        test_cmp expected-cc commandline1
 '
 
+test_expect_success $PREREQ 'cc trailer with get_maintainer output' '
+        write_script expected-cc-script.sh <<-EOF &&
+echo "One Person <[email protected]> (supporter:THIS (FOO/bar))"
+echo "Two Person <[email protected]> (maintainer:THIS THING)"
+echo "Third List <[email protected]> (moderated list:THIS THING (FOO/bar))"
+echo "<[email protected]> (moderated list:FOR THING)"
+echo "[email protected] (open list:FOR THING (FOO/bar))"
+echo "[email protected] (open list)"
+EOF
+       clean_fake_sendmail &&
+       git send-email -1 [email protected] \
+               --cc-cmd=./expected-cc-script.sh \
+               --smtp-server="$(pwd)/fake.sendmail" &&
+       test_cmp expected-cc commandline1
+'
+
 test_expect_success $PREREQ 'setup expect' "
 cat >expected-show-all-headers <<\EOF
 0001-Second.patch
-- 
2.15.0

Reply via email to