send-email: address expansion for common mailers
mutt, gnus, pine, mailrc formats should be supported. Testing and feedback for correctness and completeness of all formats and support for additional formats would be good. Nested expansions are also supported. More than one alias file to be used. All alias file formats must still of be the same type, though. Two git repo-config keys are required for this (as suggested by Ryan Anderson): sendemail.aliasesfile = <filename of aliases file> sendemail.aliasfiletype = (mutt|gnus|pine|mailrc) Signed-off-by: Eric Wong <normalperson@yhbt.net> Acked-by: Ryan Anderson <ryan@michonline.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
cc908b82a4
commit
994d6c66d3
@ -89,6 +89,41 @@ sub gitvar_ident {
|
||||
my ($author) = gitvar_ident('GIT_AUTHOR_IDENT');
|
||||
my ($committer) = gitvar_ident('GIT_COMMITTER_IDENT');
|
||||
|
||||
my %aliases;
|
||||
chomp(my @alias_files = `git-repo-config --get-all sendemail.aliasesfile`);
|
||||
chomp(my $aliasfiletype = `git-repo-config sendemail.aliasfiletype`);
|
||||
my %parse_alias = (
|
||||
# multiline formats can be supported in the future
|
||||
mutt => sub { my $fh = shift; while (<$fh>) {
|
||||
if (/^alias\s+(\S+)\s+(.*)$/) {
|
||||
my ($alias, $addr) = ($1, $2);
|
||||
$addr =~ s/#.*$//; # mutt allows # comments
|
||||
# commas delimit multiple addresses
|
||||
$aliases{$alias} = [ split(/\s*,\s*/, $addr) ];
|
||||
}}},
|
||||
mailrc => sub { my $fh = shift; while (<$fh>) {
|
||||
if (/^alias\s+(\S+)\s+(.*)$/) {
|
||||
# spaces delimit multiple addresses
|
||||
$aliases{$1} = [ split(/\s+/, $2) ];
|
||||
}}},
|
||||
pine => sub { my $fh = shift; while (<$fh>) {
|
||||
if (/^(\S+)\s+(.*)$/) {
|
||||
$aliases{$1} = [ split(/\s*,\s*/, $2) ];
|
||||
}}},
|
||||
gnus => sub { my $fh = shift; while (<$fh>) {
|
||||
if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) {
|
||||
$aliases{$1} = [ $2 ];
|
||||
}}}
|
||||
);
|
||||
|
||||
if (@alias_files && defined $parse_alias{$aliasfiletype}) {
|
||||
foreach my $file (@alias_files) {
|
||||
open my $fh, '<', $file or die "opening $file: $!\n";
|
||||
$parse_alias{$aliasfiletype}->($fh);
|
||||
close $fh;
|
||||
}
|
||||
}
|
||||
|
||||
my $prompting = 0;
|
||||
if (!defined $from) {
|
||||
$from = $author || $committer;
|
||||
@ -112,6 +147,19 @@ if (!@to) {
|
||||
$prompting++;
|
||||
}
|
||||
|
||||
sub expand_aliases {
|
||||
my @cur = @_;
|
||||
my @last;
|
||||
do {
|
||||
@last = @cur;
|
||||
@cur = map { $aliases{$_} ? @{$aliases{$_}} : $_ } @last;
|
||||
} while (join(',',@cur) ne join(',',@last));
|
||||
return @cur;
|
||||
}
|
||||
|
||||
@to = expand_aliases(@to);
|
||||
@initial_cc = expand_aliases(@initial_cc);
|
||||
|
||||
if (!defined $initial_subject && $compose) {
|
||||
do {
|
||||
$_ = $term->readline("What subject should the emails start with? ",
|
||||
|
Loading…
Reference in New Issue
Block a user