send-email: allow multiple emails using --cc, --to and --bcc

Accept a list of emails separated by commas in flags --cc, --to and
--bcc.  Multiple addresses can already be given by using these options
multiple times, but it is more convenient to allow cutting-and-pasting
a list of addresses from the header of an existing e-mail message,
which already lists them as comma-separated list, as a value to a
single parameter.

The following format can now be used:

    $ git send-email --to='Jane <jdoe@example.com>, mike@example.com'

Remove the limitation imposed by 79ee555b (Check and document the
options to prevent mistakes, 2006-06-21) which rejected every argument
with comma in --cc, --to and --bcc.

Signed-off-by: Mathieu Lienard--Mayor <Mathieu.Lienard--Mayor@ensimag.imag.fr>
Signed-off-by: Jorge Juan Garcia Garcia <Jorge-Juan.Garcia-Garcia@ensimag.imag.fr>
Signed-off-by: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
Signed-off-by: Remi Lespinet <remi.lespinet@ensimag.grenoble-inp.fr>
Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Remi Lespinet 2015-06-30 14:16:50 +02:00 committed by Junio C Hamano
parent 1fe9703f08
commit b1c8a11c80
3 changed files with 52 additions and 21 deletions

View File

@ -49,17 +49,17 @@ Composing
of 'sendemail.annotate'. See the CONFIGURATION section for of 'sendemail.annotate'. See the CONFIGURATION section for
'sendemail.multiEdit'. 'sendemail.multiEdit'.


--bcc=<address>:: --bcc=<address>,...::
Specify a "Bcc:" value for each email. Default is the value of Specify a "Bcc:" value for each email. Default is the value of
'sendemail.bcc'. 'sendemail.bcc'.
+ +
The --bcc option must be repeated for each user you want on the bcc list. This option may be specified multiple times.


--cc=<address>:: --cc=<address>,...::
Specify a starting "Cc:" value for each email. Specify a starting "Cc:" value for each email.
Default is the value of 'sendemail.cc'. Default is the value of 'sendemail.cc'.
+ +
The --cc option must be repeated for each user you want on the cc list. This option may be specified multiple times.


--compose:: --compose::
Invoke a text editor (see GIT_EDITOR in linkgit:git-var[1]) Invoke a text editor (see GIT_EDITOR in linkgit:git-var[1])
@ -110,13 +110,13 @@ is not set, this will be prompted for.
Only necessary if --compose is also set. If --compose Only necessary if --compose is also set. If --compose
is not set, this will be prompted for. is not set, this will be prompted for.


--to=<address>:: --to=<address>,...::
Specify the primary recipient of the emails generated. Generally, this Specify the primary recipient of the emails generated. Generally, this
will be the upstream maintainer of the project involved. Default is the will be the upstream maintainer of the project involved. Default is the
value of the 'sendemail.to' configuration value; if that is unspecified, value of the 'sendemail.to' configuration value; if that is unspecified,
and --to-cmd is not specified, this will be prompted for. and --to-cmd is not specified, this will be prompted for.
+ +
The --to option must be repeated for each user you want on the to list. This option may be specified multiple times.


--8bit-encoding=<encoding>:: --8bit-encoding=<encoding>::
When encountering a non-ASCII message or subject that does not When encountering a non-ASCII message or subject that does not

View File

@ -460,20 +460,6 @@ my ($repoauthor, $repocommitter);
($repoauthor) = Git::ident_person(@repo, 'author'); ($repoauthor) = Git::ident_person(@repo, 'author');
($repocommitter) = Git::ident_person(@repo, 'committer'); ($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 { sub parse_address_line {
if ($have_mail_address) { if ($have_mail_address) {
return map { $_->format } Mail::Address->parse($_[0]); return map { $_->format } Mail::Address->parse($_[0]);
@ -1026,7 +1012,8 @@ sub sanitize_address_list {
} }


sub process_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 = sanitize_address_list(@addr_list);
@addr_list = validate_address_list(@addr_list); @addr_list = validate_address_list(@addr_list);
return @addr_list; return @addr_list;

View File

@ -1648,4 +1648,48 @@ test_expect_success $PREREQ '--[no-]xmailer with sendemail.xmailer=false' '
do_xmailer_test 1 "--xmailer" do_xmailer_test 1 "--xmailer"
' '


test_expect_success $PREREQ 'setup expected-list' '
git send-email \
--dry-run \
--from="Example <from@example.com>" \
--to="To 1 <to1@example.com>" \
--to="to2@example.com" \
--to="to3@example.com" \
--cc="Cc 1 <cc1@example.com>" \
--cc="Cc2 <cc2@example.com>" \
--bcc="bcc1@example.com" \
--bcc="bcc2@example.com" \
0001-add-master.patch | replace_variable_fields \
>expected-list
'

test_expect_success $PREREQ 'use email list in --cc --to and --bcc' '
git send-email \
--dry-run \
--from="Example <from@example.com>" \
--to="To 1 <to1@example.com>, to2@example.com" \
--to="to3@example.com" \
--cc="Cc 1 <cc1@example.com>, Cc2 <cc2@example.com>" \
--bcc="bcc1@example.com, bcc2@example.com" \
0001-add-master.patch | replace_variable_fields \
>actual-list &&
test_cmp expected-list actual-list
'

test_expect_success $PREREQ 'aliases work with email list' '
echo "alias to2 to2@example.com" >.mutt &&
echo "alias cc1 Cc 1 <cc1@example.com>" >>.mutt &&
test_config sendemail.aliasesfile ".mutt" &&
test_config sendemail.aliasfiletype mutt &&
git send-email \
--dry-run \
--from="Example <from@example.com>" \
--to="To 1 <to1@example.com>, to2, to3@example.com" \
--cc="cc1, Cc2 <cc2@example.com>" \
--bcc="bcc1@example.com, bcc2@example.com" \
0001-add-master.patch | replace_variable_fields \
>actual-list &&
test_cmp expected-list actual-list
'

test_done test_done