git-send-email.perl: Add --to-cmd
Add the ability to use a command line --to-cmd=cmd to create the list of "To:" addresses. Used a shared routine for --cc-cmd and --to-cmd. Did not use IPC::Open2, leaving that for Ævar if ever he decides to fix the other bugs he might find. Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
9027fa9eb7
commit
6e74e075d2
@ -97,7 +97,7 @@ See the CONFIGURATION section for 'sendemail.multiedit'.
|
|||||||
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,
|
||||||
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.
|
The --to option must be repeated for each user you want on the to list.
|
||||||
|
|
||||||
@ -177,6 +177,12 @@ user is prompted for a password while the input is masked for privacy.
|
|||||||
Automating
|
Automating
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
--to-cmd=<command>::
|
||||||
|
Specify a command to execute once per patch file which
|
||||||
|
should generate patch file specific "To:" entries.
|
||||||
|
Output of this command must be single email address per line.
|
||||||
|
Default is the value of 'sendemail.tocmd' configuration value.
|
||||||
|
|
||||||
--cc-cmd=<command>::
|
--cc-cmd=<command>::
|
||||||
Specify a command to execute once per patch file which
|
Specify a command to execute once per patch file which
|
||||||
should generate patch file specific "Cc:" entries.
|
should generate patch file specific "Cc:" entries.
|
||||||
|
@ -70,6 +70,7 @@ git send-email [options] <file | directory | rev-list options >
|
|||||||
|
|
||||||
Automating:
|
Automating:
|
||||||
--identity <str> * Use the sendemail.<id> options.
|
--identity <str> * Use the sendemail.<id> options.
|
||||||
|
--to-cmd <str> * Email To: via `<str> \$patch_path`
|
||||||
--cc-cmd <str> * Email Cc: via `<str> \$patch_path`
|
--cc-cmd <str> * Email Cc: via `<str> \$patch_path`
|
||||||
--suppress-cc <str> * author, self, sob, cc, cccmd, body, bodycc, all.
|
--suppress-cc <str> * author, self, sob, cc, cccmd, body, bodycc, all.
|
||||||
--[no-]signed-off-by-cc * Send to Signed-off-by: addresses. Default on.
|
--[no-]signed-off-by-cc * Send to Signed-off-by: addresses. Default on.
|
||||||
@ -187,7 +188,8 @@ sub do_edit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Variables with corresponding config settings
|
# Variables with corresponding config settings
|
||||||
my ($thread, $chain_reply_to, $suppress_from, $signed_off_by_cc, $cc_cmd);
|
my ($thread, $chain_reply_to, $suppress_from, $signed_off_by_cc);
|
||||||
|
my ($to_cmd, $cc_cmd);
|
||||||
my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_encryption);
|
my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_encryption);
|
||||||
my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts, $smtp_domain);
|
my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts, $smtp_domain);
|
||||||
my ($validate, $confirm);
|
my ($validate, $confirm);
|
||||||
@ -214,6 +216,7 @@ my %config_settings = (
|
|||||||
"smtppass" => \$smtp_authpass,
|
"smtppass" => \$smtp_authpass,
|
||||||
"smtpdomain" => \$smtp_domain,
|
"smtpdomain" => \$smtp_domain,
|
||||||
"to" => \@to,
|
"to" => \@to,
|
||||||
|
"tocmd" => \$to_cmd,
|
||||||
"cc" => \@initial_cc,
|
"cc" => \@initial_cc,
|
||||||
"cccmd" => \$cc_cmd,
|
"cccmd" => \$cc_cmd,
|
||||||
"aliasfiletype" => \$aliasfiletype,
|
"aliasfiletype" => \$aliasfiletype,
|
||||||
@ -272,6 +275,7 @@ my $rc = GetOptions("sender|from=s" => \$sender,
|
|||||||
"in-reply-to=s" => \$initial_reply_to,
|
"in-reply-to=s" => \$initial_reply_to,
|
||||||
"subject=s" => \$initial_subject,
|
"subject=s" => \$initial_subject,
|
||||||
"to=s" => \@to,
|
"to=s" => \@to,
|
||||||
|
"to-cmd=s" => \$to_cmd,
|
||||||
"no-to" => \$no_to,
|
"no-to" => \$no_to,
|
||||||
"cc=s" => \@initial_cc,
|
"cc=s" => \@initial_cc,
|
||||||
"no-cc" => \$no_cc,
|
"no-cc" => \$no_cc,
|
||||||
@ -711,7 +715,7 @@ if (!defined $sender) {
|
|||||||
$prompting++;
|
$prompting++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!@to) {
|
if (!@to && !defined $to_cmd) {
|
||||||
my $to = ask("Who should the emails be sent to? ");
|
my $to = ask("Who should the emails be sent to? ");
|
||||||
push @to, parse_address_line($to) if defined $to; # sanitized/validated later
|
push @to, parse_address_line($to) if defined $to; # sanitized/validated later
|
||||||
$prompting++;
|
$prompting++;
|
||||||
@ -1238,21 +1242,10 @@ foreach my $t (@files) {
|
|||||||
}
|
}
|
||||||
close F;
|
close F;
|
||||||
|
|
||||||
if (defined $cc_cmd && !$suppress_cc{'cccmd'}) {
|
push @to, recipients_cmd("to-cmd", "to", $to_cmd, $t)
|
||||||
open(F, "$cc_cmd \Q$t\E |")
|
if defined $to_cmd;
|
||||||
or die "(cc-cmd) Could not execute '$cc_cmd'";
|
push @cc, recipients_cmd("cc-cmd", "cc", $cc_cmd, $t)
|
||||||
while(<F>) {
|
if defined $cc_cmd && !$suppress_cc{'cccmd'};
|
||||||
my $c = $_;
|
|
||||||
$c =~ s/^\s*//g;
|
|
||||||
$c =~ s/\n$//g;
|
|
||||||
next if ($c eq $sender and $suppress_from);
|
|
||||||
push @cc, $c;
|
|
||||||
printf("(cc-cmd) Adding cc: %s from: '%s'\n",
|
|
||||||
$c, $cc_cmd) unless $quiet;
|
|
||||||
}
|
|
||||||
close F
|
|
||||||
or die "(cc-cmd) failed to close pipe to '$cc_cmd'";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($broken_encoding{$t} && !$has_content_type) {
|
if ($broken_encoding{$t} && !$has_content_type) {
|
||||||
$has_content_type = 1;
|
$has_content_type = 1;
|
||||||
@ -1310,6 +1303,30 @@ foreach my $t (@files) {
|
|||||||
$message_id = undef;
|
$message_id = undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Execute a command (e.g. $to_cmd) to get a list of email addresses
|
||||||
|
# and return a results array
|
||||||
|
sub recipients_cmd {
|
||||||
|
my ($prefix, $what, $cmd, $file) = @_;
|
||||||
|
|
||||||
|
my $sanitized_sender = sanitize_address($sender);
|
||||||
|
my @addresses = ();
|
||||||
|
open(F, "$cmd \Q$file\E |")
|
||||||
|
or die "($prefix) Could not execute '$cmd'";
|
||||||
|
while(<F>) {
|
||||||
|
my $address = $_;
|
||||||
|
$address =~ s/^\s*//g;
|
||||||
|
$address =~ s/\s*$//g;
|
||||||
|
$address = sanitize_address($address);
|
||||||
|
next if ($address eq $sanitized_sender and $suppress_from);
|
||||||
|
push @addresses, $address;
|
||||||
|
printf("($prefix) Adding %s: %s from: '%s'\n",
|
||||||
|
$what, $address, $cmd) unless $quiet;
|
||||||
|
}
|
||||||
|
close F
|
||||||
|
or die "($prefix) failed to close pipe to '$cmd'";
|
||||||
|
return @addresses;
|
||||||
|
}
|
||||||
|
|
||||||
cleanup_compose_files();
|
cleanup_compose_files();
|
||||||
|
|
||||||
sub cleanup_compose_files() {
|
sub cleanup_compose_files() {
|
||||||
|
@ -201,6 +201,24 @@ test_expect_success $PREREQ 'Prompting works' '
|
|||||||
grep "^To: to@example.com\$" msgtxt1
|
grep "^To: to@example.com\$" msgtxt1
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success $PREREQ 'tocmd works' '
|
||||||
|
clean_fake_sendmail &&
|
||||||
|
cp $patches tocmd.patch &&
|
||||||
|
echo tocmd--tocmd@example.com >>tocmd.patch &&
|
||||||
|
{
|
||||||
|
echo "#!$SHELL_PATH"
|
||||||
|
echo sed -n -e s/^tocmd--//p \"\$1\"
|
||||||
|
} > tocmd-sed &&
|
||||||
|
chmod +x tocmd-sed &&
|
||||||
|
git send-email \
|
||||||
|
--from="Example <nobody@example.com>" \
|
||||||
|
--to-cmd=./tocmd-sed \
|
||||||
|
--smtp-server="$(pwd)/fake.sendmail" \
|
||||||
|
tocmd.patch \
|
||||||
|
&&
|
||||||
|
grep "^To: tocmd@example.com" msgtxt1
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success $PREREQ 'cccmd works' '
|
test_expect_success $PREREQ 'cccmd works' '
|
||||||
clean_fake_sendmail &&
|
clean_fake_sendmail &&
|
||||||
cp $patches cccmd.patch &&
|
cp $patches cccmd.patch &&
|
||||||
|
Loading…
Reference in New Issue
Block a user