Subject: [PATCH] git-send-email.perl: Add --suppress-to

From: Joe Perches <[email-masked]>
Date: Sat, 05 Feb 2011 15:40:08 -0800

Add an equivalent command line option to suppress-cc.

Signed-off-by: Joe Perches <[email-masked]>
---
 Documentation/git-send-email.txt |   17 +++++++++++++++++
 git-send-email.perl              |   33 +++++++++++++++++++++++++++++++--
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index 7ec9dab..69e03e8 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -232,6 +232,23 @@ Automating
 	cc list. Default is the value of 'sendemail.signedoffbycc' configuration
 	value; if that is unspecified, default to --signed-off-by-cc.
 
+--suppress-to=<category>::
+	Specify an additional category of recipients to suppress the
+	auto-to of:
++
+--
+- 'author' will avoid including the patch author
+- 'self' will avoid including the sender
+- 'tocmd' will avoid running the --to-cmd
+- 'bodyto' will avoid including anyone mentioned in To lines in the
+   patch body (commit message) except for self (use 'self' for that)
+- 'all' will suppress all auto to values.
+--
++
+Default is the value of 'sendemail.suppressto' configuration value; if
+that is unspecified, default to 'self' if --suppress-from is
+specified.
+
 --suppress-cc=<category>::
 	Specify an additional category of recipients to suppress the
 	auto-cc of:
diff --git a/git-send-email.perl b/git-send-email.perl
index 76565de..0365c29 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -74,6 +74,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`
+    --suppress-to           <str>  * author, self, tocmd, bodyto, all.
     --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.
@@ -196,6 +197,7 @@ my ($smtp_server, $smtp_server_port, @smtp_server_options);
 my ($smtp_authuser, $smtp_encryption);
 my ($identity, $aliasfiletype, @alias_files, $smtp_domain);
 my ($validate, $confirm);
+my (@suppress_to);
 my (@suppress_cc);
 my ($auto_8bit_encoding);
 
@@ -226,6 +228,7 @@ my %config_settings = (
     "aliasfiletype" => \$aliasfiletype,
     "bcc" => \@bcclist,
     "aliasesfile" => \@alias_files,
+    "suppressto" => \@suppress_to,
     "suppresscc" => \@suppress_cc,
     "envelopesender" => \$envelope_sender,
     "multiedit" => \$multiedit,
@@ -301,6 +304,7 @@ my $rc = GetOptions("sender|from=s" => \$sender,
 		    "quiet" => \$quiet,
 		    "cc-cmd=s" => \$cc_cmd,
 		    "suppress-from!" => \$suppress_from,
+		    "suppress-to=s" => \@suppress_to,
 		    "suppress-cc=s" => \@suppress_cc,
 		    "signed-off-cc|signed-off-by-cc!" => \$signed_off_by_cc,
 		    "confirm=s" => \$confirm,
@@ -369,6 +373,24 @@ foreach my $setting (values %config_bool_settings) {
 # 'default' encryption is none -- this only prevents a warning
 $smtp_encryption = '' unless (defined $smtp_encryption);
 
+# Set TO suppressions
+my(%suppress_to);
+if (@suppress_to) {
+	foreach my $entry (@suppress_to) {
+		die "Unknown --suppress-to field: '$entry'\n"
+			unless $entry =~ /^(?:all|author|self|tocmd|bodyto)$/;
+		$suppress_to{$entry} = 1;
+	}
+}
+
+if ($suppress_to{'all'}) {
+	foreach my $entry (qw (author self tocmd bodyto)) {
+		$suppress_to{$entry} = 1;
+	}
+	delete $suppress_to{'all'};
+}
+$suppress_to{'self'} = $suppress_from if defined $suppress_from;
+
 # Set CC suppressions
 my(%suppress_cc);
 if (@suppress_cc) {
@@ -407,7 +429,11 @@ die "Unknown --confirm setting: '$confirm'\n"
 
 # Debugging, print out the suppressions.
 if (0) {
-	print "suppressions:\n";
+	print "To suppressions:\n";
+	foreach my $entry (keys %suppress_to) {
+		printf "  %-5s -> $suppress_to{$entry}\n", $entry;
+	}
+	print "Cc suppressions:\n";
 	foreach my $entry (keys %suppress_cc) {
 		printf "  %-5s -> $suppress_cc{$entry}\n", $entry;
 	}
@@ -1201,6 +1227,9 @@ foreach my $t (@files) {
 			}
 			elsif (/^To:\s+(.*)$/) {
 				foreach my $addr (parse_address_line($1)) {
+
+				    next if $suppress_to{'author'};
+				    next if $suppress_to{'self'} and $author eq $sender;
 					printf("(mbox) Adding to: %s from line '%s'\n",
 						$addr, $_) unless $quiet;
 					push @to, sanitize_address($addr);
@@ -1269,7 +1298,7 @@ foreach my $t (@files) {
 	close $fh;
 
 	push @to, recipients_cmd("to-cmd", "to", $to_cmd, $t)
-		if defined $to_cmd;
+		if defined $to_cmd && !$suppress_to{'tocmd'};
 	push @cc, recipients_cmd("cc-cmd", "cc", $cc_cmd, $t)
 		if defined $cc_cmd && !$suppress_cc{'cccmd'};