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
|
||||
will be the upstream maintainer of the project involved. Default is the
|
||||
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.
|
||||
|
||||
@ -177,6 +177,12 @@ user is prompted for a password while the input is masked for privacy.
|
||||
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>::
|
||||
Specify a command to execute once per patch file which
|
||||
should generate patch file specific "Cc:" entries.
|
||||
|
@ -70,6 +70,7 @@ git send-email [options] <file | directory | rev-list options >
|
||||
|
||||
Automating:
|
||||
--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`
|
||||
--suppress-cc <str> * author, self, sob, cc, cccmd, body, bodycc, all.
|
||||
--[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
|
||||
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 ($identity, $aliasfiletype, @alias_files, @smtp_host_parts, $smtp_domain);
|
||||
my ($validate, $confirm);
|
||||
@ -214,6 +216,7 @@ my %config_settings = (
|
||||
"smtppass" => \$smtp_authpass,
|
||||
"smtpdomain" => \$smtp_domain,
|
||||
"to" => \@to,
|
||||
"tocmd" => \$to_cmd,
|
||||
"cc" => \@initial_cc,
|
||||
"cccmd" => \$cc_cmd,
|
||||
"aliasfiletype" => \$aliasfiletype,
|
||||
@ -272,6 +275,7 @@ my $rc = GetOptions("sender|from=s" => \$sender,
|
||||
"in-reply-to=s" => \$initial_reply_to,
|
||||
"subject=s" => \$initial_subject,
|
||||
"to=s" => \@to,
|
||||
"to-cmd=s" => \$to_cmd,
|
||||
"no-to" => \$no_to,
|
||||
"cc=s" => \@initial_cc,
|
||||
"no-cc" => \$no_cc,
|
||||
@ -711,7 +715,7 @@ if (!defined $sender) {
|
||||
$prompting++;
|
||||
}
|
||||
|
||||
if (!@to) {
|
||||
if (!@to && !defined $to_cmd) {
|
||||
my $to = ask("Who should the emails be sent to? ");
|
||||
push @to, parse_address_line($to) if defined $to; # sanitized/validated later
|
||||
$prompting++;
|
||||
@ -1238,21 +1242,10 @@ foreach my $t (@files) {
|
||||
}
|
||||
close F;
|
||||
|
||||
if (defined $cc_cmd && !$suppress_cc{'cccmd'}) {
|
||||
open(F, "$cc_cmd \Q$t\E |")
|
||||
or die "(cc-cmd) Could not execute '$cc_cmd'";
|
||||
while(<F>) {
|
||||
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'";
|
||||
}
|
||||
push @to, recipients_cmd("to-cmd", "to", $to_cmd, $t)
|
||||
if defined $to_cmd;
|
||||
push @cc, recipients_cmd("cc-cmd", "cc", $cc_cmd, $t)
|
||||
if defined $cc_cmd && !$suppress_cc{'cccmd'};
|
||||
|
||||
if ($broken_encoding{$t} && !$has_content_type) {
|
||||
$has_content_type = 1;
|
||||
@ -1310,6 +1303,30 @@ foreach my $t (@files) {
|
||||
$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();
|
||||
|
||||
sub cleanup_compose_files() {
|
||||
|
@ -201,6 +201,24 @@ test_expect_success $PREREQ 'Prompting works' '
|
||||
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' '
|
||||
clean_fake_sendmail &&
|
||||
cp $patches cccmd.patch &&
|
||||
|
Loading…
Reference in New Issue
Block a user