get_repo_path: refactor path-allocation
[gitweb.git] / git-send-email.perl
index 09ecad830f3075b3b0dfe3f9ce7db396c9adeb2c..b660cc238223b101762017c7effda67de6f70113 100755 (executable)
@@ -460,25 +460,11 @@ sub read_config {
 ($repoauthor) = Git::ident_person(@repo, 'author');
 ($repocommitter) = Git::ident_person(@repo, 'committer');
 
-# Verify the user input
-
-foreach my $entry (@initial_to) {
-       die "Comma in --to entry: $entry'\n" unless $entry !~ m/,/;
-}
-
-foreach my $entry (@initial_cc) {
-       die "Comma in --cc entry: $entry'\n" unless $entry !~ m/,/;
-}
-
-foreach my $entry (@bcclist) {
-       die "Comma in --bcclist entry: $entry'\n" unless $entry !~ m/,/;
-}
-
 sub parse_address_line {
        if ($have_mail_address) {
                return map { $_->format } Mail::Address->parse($_[0]);
        } else {
-               return split_addrs($_[0]);
+               return Git::parse_mailboxes($_[0]);
        }
 }
 
@@ -487,6 +473,37 @@ sub split_addrs {
 }
 
 my %aliases;
+
+sub parse_sendmail_alias {
+       local $_ = shift;
+       if (/"/) {
+               print STDERR "warning: sendmail alias with quotes is not supported: $_\n";
+       } elsif (/:include:/) {
+               print STDERR "warning: `:include:` not supported: $_\n";
+       } elsif (/[\/|]/) {
+               print STDERR "warning: `/file` or `|pipe` redirection not supported: $_\n";
+       } elsif (/^(\S+?)\s*:\s*(.+)$/) {
+               my ($alias, $addr) = ($1, $2);
+               $aliases{$alias} = [ split_addrs($addr) ];
+       } else {
+               print STDERR "warning: sendmail line is not recognized: $_\n";
+       }
+}
+
+sub parse_sendmail_aliases {
+       my $fh = shift;
+       my $s = '';
+       while (<$fh>) {
+               chomp;
+               next if /^\s*$/ || /^\s*#/;
+               $s .= $_, next if $s =~ s/\\$// || s/^\s+//;
+               parse_sendmail_alias($s) if $s;
+               $s = $_;
+       }
+       $s =~ s/\\$//; # silently tolerate stray '\' on last line
+       parse_sendmail_alias($s) if $s;
+}
+
 my %parse_alias = (
        # multiline formats can be supported in the future
        mutt => sub { my $fh = shift; while (<$fh>) {
@@ -515,7 +532,7 @@ sub split_addrs {
                               $aliases{$alias} = [ split_addrs($addr) ];
                          }
                      } },
-
+       sendmail => \&parse_sendmail_aliases,
        gnus => sub { my $fh = shift; while (<$fh>) {
                if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) {
                        $aliases{$1} = [ $2 ];
@@ -775,6 +792,7 @@ sub file_declares_8bit_cte {
 }
 
 if (defined $sender) {
+       $sender =~ s/^\s+|\s+$//g;
        ($sender) = expand_aliases($sender);
 } else {
        $sender = $repoauthor || $repocommitter || '';
@@ -1003,15 +1021,17 @@ sub sanitize_address {
                return $recipient;
        }
 
+       # remove non-escaped quotes
+       $recipient_name =~ s/(^|[^\\])"/$1/g;
+
        # rfc2047 is needed if a non-ascii char is included
        if ($recipient_name =~ /[^[:ascii:]]/) {
-               $recipient_name =~ s/^"(.*)"$/$1/;
                $recipient_name = quote_rfc2047($recipient_name);
        }
 
        # double quotes are needed if specials or CTLs are included
        elsif ($recipient_name =~ /[][()<>@,;:\\".\000-\037\177]/) {
-               $recipient_name =~ s/(["\\\r])/\\$1/g;
+               $recipient_name =~ s/([\\\r])/\\$1/g;
                $recipient_name = qq["$recipient_name"];
        }
 
@@ -1024,7 +1044,8 @@ sub sanitize_address_list {
 }
 
 sub process_address_list {
-       my @addr_list = expand_aliases(@_);
+       my @addr_list = map { parse_address_line($_) } @_;
+       @addr_list = expand_aliases(@addr_list);
        @addr_list = sanitize_address_list(@addr_list);
        @addr_list = validate_address_list(@addr_list);
        return @addr_list;