On Sun, May 14, 2006 at 07:13:44PM -0700, Eric Wong wrote: > 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@xxxxxxxx> Acked-by: Ryan Anderson <ryan@xxxxxxxxxxxxxx> > --- > > Looks like this patch got forgotten a while ago, and I never noticed > because I forgot to set WITH_SEND_EMAIL when doing make install. > Of course, WITH_SEND_EMAIL should no longer be needed... > > git-send-email.perl | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 48 insertions(+), 0 deletions(-) > > ff6593287dc500853c1cf05bdb0f32f970f10c9d > diff --git a/git-send-email.perl b/git-send-email.perl > index 703dd1f..d8c4b1f 100755 > --- a/git-send-email.perl > +++ b/git-send-email.perl > @@ -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? ", > -- > 1.3.2.g1c9b > > - : 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