Skip to content

Commit

Permalink
Merge branch 'db/send-email-omit-cc'
Browse files Browse the repository at this point in the history
* db/send-email-omit-cc:
  git-send-email: Generalize auto-cc recipient mechanism.
  • Loading branch information
Junio C Hamano committed Feb 12, 2008
2 parents c21fdf3 + 6564828 commit e935626
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 7 deletions.
11 changes: 11 additions & 0 deletions Documentation/git-send-email.txt
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,17 @@ The --cc option must be repeated for each user you want on the cc list.
Default is the value of 'sendemail.suppressfrom' configuration value;
if that is unspecified, default to --no-suppress-from.

--suppress-cc::
Specify an additional category of recipients to suppress the
auto-cc of. 'self' will avoid including the sender, 'author' will
avoid including the patch author, 'cc' will avoid including anyone
mentioned in Cc lines in the patch, 'sob' will avoid including
anyone mentioned in Signed-off-by lines, and 'cccmd' will avoid
running the --cc-cmd. 'all' will suppress all auto cc values.
Default is the value of 'sendemail.suppresscc' configuration value;
if that is unspecified, default to 'self' if --suppress-from is
specified, as well as 'sob' if --no-signed-off-cc is specified.

--thread, --no-thread::
If this is set, the In-Reply-To header will be set on each email sent.
If disabled with "--no-thread", no emails will have the In-Reply-To
Expand Down
56 changes: 49 additions & 7 deletions git-send-email.perl
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@ sub usage {
--smtp-ssl If set, connects to the SMTP server using SSL.
--suppress-cc Suppress the specified category of auto-CC. The category
can be one of 'author' for the patch author, 'self' to
avoid copying yourself, 'sob' for Signed-off-by lines,
'cccmd' for the output of the cccmd, or 'all' to suppress
all of these.
--suppress-from Suppress sending emails to yourself. Defaults to off.
--thread Specify that the "In-Reply-To:" header should be set on all
Expand Down Expand Up @@ -180,12 +186,13 @@ sub format_2822_time {
my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_authpass, $smtp_ssl);
my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts);
my ($no_validate);
my (@suppress_cc);

my %config_bool_settings = (
"thread" => [\$thread, 1],
"chainreplyto" => [\$chain_reply_to, 1],
"suppressfrom" => [\$suppress_from, 0],
"signedoffcc" => [\$signed_off_cc, 1],
"suppressfrom" => [\$suppress_from, undef],
"signedoffcc" => [\$signed_off_cc, undef],
"smtpssl" => [\$smtp_ssl, 0],
);

Expand All @@ -199,6 +206,7 @@ sub format_2822_time {
"aliasfiletype" => \$aliasfiletype,
"bcc" => \@bcclist,
"aliasesfile" => \@alias_files,
"suppresscc" => \@suppress_cc,
);

# Begin by accumulating all the variables (defined above), that we will end up
Expand All @@ -221,6 +229,7 @@ sub format_2822_time {
"quiet" => \$quiet,
"cc-cmd=s" => \$cc_cmd,
"suppress-from!" => \$suppress_from,
"suppress-cc=s" => \@suppress_cc,
"signed-off-cc|signed-off-by-cc!" => \$signed_off_cc,
"dry-run" => \$dry_run,
"envelope-sender=s" => \$envelope_sender,
Expand Down Expand Up @@ -266,6 +275,35 @@ sub read_config {
${$setting->[0]} = $setting->[1] unless (defined (${$setting->[0]}));
}

# Set CC suppressions
my(%suppress_cc);
if (@suppress_cc) {
foreach my $entry (@suppress_cc) {
die "Unknown --suppress-cc field: '$entry'\n"
unless $entry =~ /^(all|cccmd|cc|author|self|sob)$/;
$suppress_cc{$entry} = 1;
}
}

if ($suppress_cc{'all'}) {
foreach my $entry (qw (ccmd cc author self sob)) {
$suppress_cc{$entry} = 1;
}
delete $suppress_cc{'all'};
}

# If explicit old-style ones are specified, they trump --suppress-cc.
$suppress_cc{'self'} = $suppress_from if defined $suppress_from;
$suppress_cc{'sob'} = $signed_off_cc if defined $signed_off_cc;

# Debugging, print out the suppressions.
if (0) {
print "suppressions:\n";
foreach my $entry (keys %suppress_cc) {
printf " %-5s -> $suppress_cc{$entry}\n", $entry;
}
}

my ($repoauthor) = $repo->ident_person('author');
my ($repocommitter) = $repo->ident_person('committer');

Expand Down Expand Up @@ -711,11 +749,14 @@ sub send_message

} elsif (/^(Cc|From):\s+(.*)$/) {
if (unquote_rfc2047($2) eq $sender) {
next if ($suppress_from);
next if ($suppress_cc{'self'});
}
elsif ($1 eq 'From') {
($author, $author_encoding)
= unquote_rfc2047($2);
next if ($suppress_cc{'author'});
} else {
next if ($suppress_cc{'cc'});
}
printf("(mbox) Adding cc: %s from line '%s'\n",
$2, $_) unless $quiet;
Expand All @@ -742,7 +783,7 @@ sub send_message
# line 2 = subject
# So let's support that, too.
$input_format = 'lots';
if (@cc == 0) {
if (@cc == 0 && !$suppress_cc{'cc'}) {
printf("(non-mbox) Adding cc: %s from line '%s'\n",
$_, $_) unless $quiet;

Expand All @@ -759,10 +800,11 @@ sub send_message
}
} else {
$message .= $_;
if (/^(Signed-off-by|Cc): (.*)$/i && $signed_off_cc) {
if (/^(Signed-off-by|Cc): (.*)$/i) {
next if ($suppress_cc{'sob'});
my $c = $2;
chomp $c;
next if ($c eq $sender and $suppress_from);
next if ($c eq $sender and $suppress_cc{'self'});
push @cc, $c;
printf("(sob) Adding cc: %s from line '%s'\n",
$c, $_) unless $quiet;
Expand All @@ -771,7 +813,7 @@ sub send_message
}
close F;

if (defined $cc_cmd) {
if (defined $cc_cmd && !$suppress_cc{'cccmd'}) {
open(F, "$cc_cmd $t |")
or die "(cc-cmd) Could not execute '$cc_cmd'";
while(<F>) {
Expand Down

0 comments on commit e935626

Please sign in to comment.