Note that this only adds support for a limited subset of the sendmail format. The format is is as follows. <alias>: <address|alias>[, <address|alias>...] Aliases are specified one per line, and must start on the first column of the line. Blank lines are ignored. If the first non whitespace character on a line is a '#' symbol, then the whole line is considered a comment, and is ignored. Example: alice: Alice W Land <awol@xxxxxxxxxxx> bob: Robert Bobbyton <bob@xxxxxxxxxxx> # this is a comment # this is also a comment chloe: chloe@xxxxxxxxxxx abgroup: alice, bob bcgrp: bob, chloe, Other <o@xxxxxxxxxxx> Unlike the standard sendmail format, this does not support quoted aliases or quoted addresses. Line continuations are not supported. Warnings are printed for explicitly unsupported constructs, and any other lines that are not recognized. Signed-off-by: Allen Hubbe <allenbh@xxxxxxxxx> --- Notes: This v5 renames the parser 'sendmail' again, from 'simple'. Therefore, the subject line is changed again, too. Previous subject line: send-email: Add simple email aliases format The format is restricted to a subset of sendmail. When the subset diverges from sendmail, the parser warns about the line that diverges, and ignores the line. The supported format is described in the documentation, as well as the behavior when an unsupported format construct is detected. A badly constructed sentence was corrected in the documentation. The test case was changed to use a here document, and the unsupported comment after an alias was removed from the test case alias file input. Documentation/git-send-email.txt | 37 ++++++++++++++++++++++++++++++++++++- git-send-email.perl | 29 +++++++++++++++++++++++++++++ t/t9001-send-email.sh | 27 +++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 804554609def..97387fd27a8d 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -383,7 +383,42 @@ sendemail.aliasesFile:: sendemail.aliasFileType:: Format of the file(s) specified in sendemail.aliasesFile. Must be - one of 'mutt', 'mailrc', 'pine', 'elm', or 'gnus'. + one of 'sendmail', 'mutt', 'mailrc', 'pine', 'elm', or 'gnus'. ++ +If the format is 'sendmail', then the alias file format is described below. +Descriptions of the other file formats can be found by searching the +documentation of the email program of the same name. ++ +The 'sendmail' format is is as follows. Note that 'git-send-email' currently +only supports a limited subset of the sendmail format. ++ + <alias>: <address|alias>[, <address|alias>...] ++ +Aliases are specified one per line, and must start on the first column of the +line. Blank lines are ignored. If the first non whitespace character on a +line is a `#` symbol, then the whole line is considered a comment, and is +ignored. ++ +Example of the 'sendmail' format: ++ + alice: Alice W Land <awol@xxxxxxxxxxx> + bob: Robert Bobbyton <bob@xxxxxxxxxxx> + # this is a comment + # this is also a comment + chloe: chloe@xxxxxxxxxxx + abgroup: alice, bob + bcgrp: bob, chloe, Other <o@xxxxxxxxxxx> ++ +Unlike the standard sendmail format, 'git-send-email' currently diverges in the +following ways. ++ +* Quoted aliases and quoted addresses are not supported: lines that + contain a `"` symbol are ignored. +* Line continuations are not supported: any lines that start with + whitespace, or end with a `\` symbol are ignored. +* Warnings are printed on the standard error output for any explicitly + unsupported constructs, and any other lines that are not recognized + by the parser. sendemail.multiEdit:: If true (default), a single editor instance will be spawned to edit diff --git a/git-send-email.perl b/git-send-email.perl index e1e9b1460ced..ffea50094a48 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -487,6 +487,8 @@ sub split_addrs { } my %aliases; + + my %parse_alias = ( # multiline formats can be supported in the future mutt => sub { my $fh = shift; while (<$fh>) { @@ -516,6 +518,33 @@ my %parse_alias = ( } } }, + sendmail => sub { my $fh = shift; while (<$fh>) { + # ignore comment lines + if (/^\s*(?:#.*)?$/) { } + + # warn on lines that contain quotes + elsif (/"/) { + print STDERR "sendmail alias with quotes is not supported: $_\n"; + next; + } + + # warn on lines that continue + elsif (/^\s|\\$/) { + print STDERR "sendmail continuation line is not supported: $_\n"; + next; + } + + # recognize lines that look like an alias + elsif (/^(\S+)\s*:\s*(.+?)$/) { + my ($alias, $addr) = ($1, $2); + $aliases{$alias} = [ split_addrs($addr) ]; + } + + # warn on lines that are not recognized + else { + print STDERR "sendmail line is not recognized: $_\n"; + }}}, + gnus => sub { my $fh = shift; while (<$fh>) { if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) { $aliases{$1} = [ $2 ]; diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 7be14a4e37f7..b04d26364767 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -1549,6 +1549,33 @@ test_expect_success $PREREQ 'sendemail.aliasfile=~/.mailrc' ' grep "^!someone@example\.org!$" commandline1 ' +test_expect_success $PREREQ 'sendemail.aliasfiletype=sendmail' ' + clean_fake_sendmail && rm -fr outdir && + git format-patch -1 -o outdir && + cat >>~/.tmp-email-aliases <<-\EOF && + alice: Alice W Land <awol@xxxxxxxxxxx> + bob: Robert Bobbyton <bob@xxxxxxxxxxx> + # this is a comment + # this is also a comment + chloe: chloe@xxxxxxxxxxx + abgroup: alice, bob + bcgrp: bob, chloe, Other <o@xxxxxxxxxxx> + EOF + git config --replace-all sendemail.aliasesfile \ + "$(pwd)/.tmp-email-aliases" && + git config sendemail.aliasfiletype sendmail && + git send-email \ + --from="Example <nobody@xxxxxxxxxxx>" \ + --to=alice --to=bcgrp \ + --smtp-server="$(pwd)/fake.sendmail" \ + outdir/0001-*.patch \ + 2>errors >out && + grep "^!awol@example\.com!$" commandline1 && + grep "^!bob@example\.com!$" commandline1 && + grep "^!chloe@example\.com!$" commandline1 && + grep "^!o@example\.com!$" commandline1 +' + do_xmailer_test () { expected=$1 params=$2 && git format-patch -1 && -- 2.3.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html