diff options
-rw-r--r-- | Documentation/git-send-email.txt | 4 | ||||
-rwxr-xr-x | git-send-email.perl | 59 | ||||
-rwxr-xr-x | t/t9001-send-email.sh | 64 |
3 files changed, 108 insertions, 19 deletions
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 01fd9d4b59..cf4e3d99bc 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -277,6 +277,10 @@ Automating Clears any list of "To:", "Cc:", "Bcc:" addresses previously set via config. +--no-identity:: + Clears the previously read value of `sendemail.identity` set + via config, if any. + --to-cmd=<command>:: Specify a command to execute once per patch file which should generate patch file specific "To:" entries. diff --git a/git-send-email.perl b/git-send-email.perl index 46a5242d25..474598339e 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -174,7 +174,7 @@ my (@to,@cc,@xh,$envelope_sender, $author,$sender,$smtp_authpass,$annotate,$compose,$time); # Things we either get from config, *or* are overridden on the # command-line. -my ($no_cc, $no_to, $no_bcc); +my ($no_cc, $no_to, $no_bcc, $no_identity); my (@config_to, @getopt_to); my (@config_cc, @getopt_cc); my (@config_bcc, @getopt_bcc); @@ -317,44 +317,53 @@ $SIG{INT} = \&signal_handler; # Read our sendemail.* config sub read_config { - my ($prefix) = @_; + my ($configured, $prefix) = @_; foreach my $setting (keys %config_bool_settings) { my $target = $config_bool_settings{$setting}; my $v = Git::config_bool(@repo, "$prefix.$setting"); - $$target = $v if defined $v; + next unless defined $v; + next if $configured->{$setting}++; + $$target = $v; } foreach my $setting (keys %config_path_settings) { my $target = $config_path_settings{$setting}; if (ref($target) eq "ARRAY") { - unless (@$target) { - my @values = Git::config_path(@repo, "$prefix.$setting"); - @$target = @values if (@values && defined $values[0]); - } + my @values = Git::config_path(@repo, "$prefix.$setting"); + next unless @values; + next if $configured->{$setting}++; + @$target = @values; } else { my $v = Git::config_path(@repo, "$prefix.$setting"); - $$target = $v if defined $v; + next unless defined $v; + next if $configured->{$setting}++; + $$target = $v; } } foreach my $setting (keys %config_settings) { my $target = $config_settings{$setting}; if (ref($target) eq "ARRAY") { - unless (@$target) { - my @values = Git::config(@repo, "$prefix.$setting"); - @$target = @values if (@values && defined $values[0]); - } + my @values = Git::config(@repo, "$prefix.$setting"); + next unless @values; + next if $configured->{$setting}++; + @$target = @values; } else { my $v = Git::config(@repo, "$prefix.$setting"); - $$target = $v if defined $v; + next unless defined $v; + next if $configured->{$setting}++; + $$target = $v; } } if (!defined $smtp_encryption) { - my $enc = Git::config(@repo, "$prefix.smtpencryption"); + my $setting = "$prefix.smtpencryption"; + my $enc = Git::config(@repo, $setting); + return unless defined $enc; + return if $configured->{$setting}++; if (defined $enc) { $smtp_encryption = $enc; } elsif (Git::config_bool(@repo, "$prefix.smtpssl")) { @@ -363,16 +372,29 @@ sub read_config { } } +# sendemail.identity yields to --identity. We must parse this +# special-case first before the rest of the config is read. $identity = Git::config(@repo, "sendemail.identity"); -read_config("sendemail.$identity") if defined $identity; -read_config("sendemail"); +my $rc = GetOptions( + "identity=s" => \$identity, + "no-identity" => \$no_identity, +); +usage() unless $rc; +undef $identity if $no_identity; + +# Now we know enough to read the config +{ + my %configured; + read_config(\%configured, "sendemail.$identity") if defined $identity; + read_config(\%configured, "sendemail"); +} # Begin by accumulating all the variables (defined above), that we will end up # needing, first, from the command line: my $help; -my $rc = GetOptions("h" => \$help, - "dump-aliases" => \$dump_aliases); +$rc = GetOptions("h" => \$help, + "dump-aliases" => \$dump_aliases); usage() unless $rc; die __("--dump-aliases incompatible with other options\n") if !$help and $dump_aliases and @ARGV; @@ -401,7 +423,6 @@ $rc = GetOptions( "smtp-debug:i" => \$debug_net_smtp, "smtp-domain:s" => \$smtp_domain, "smtp-auth=s" => \$smtp_auth, - "identity=s" => \$identity, "annotate!" => \$annotate, "no-annotate" => sub {$annotate = 0}, "compose" => \$compose, diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 98858e5e4a..4be4b50ff9 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -1200,6 +1200,61 @@ test_expect_success $PREREQ 'sendemail.to works' ' grep "To: Somebody <somebody@ex.com>" stdout ' +test_expect_success $PREREQ 'setup sendemail.identity' ' + git config --replace-all sendemail.to "default@example.com" && + git config --replace-all sendemail.isp.to "isp@example.com" && + git config --replace-all sendemail.cloud.to "cloud@example.com" +' + +test_expect_success $PREREQ 'sendemail.identity: reads the correct identity config' ' + git -c sendemail.identity=cloud send-email \ + --dry-run \ + --from="nobody@example.com" \ + $patches >stdout && + grep "To: cloud@example.com" stdout +' + +test_expect_success $PREREQ 'sendemail.identity: identity overrides sendemail.identity' ' + git -c sendemail.identity=cloud send-email \ + --identity=isp \ + --dry-run \ + --from="nobody@example.com" \ + $patches >stdout && + grep "To: isp@example.com" stdout +' + +test_expect_success $PREREQ 'sendemail.identity: --no-identity clears previous identity' ' + git -c sendemail.identity=cloud send-email \ + --no-identity \ + --dry-run \ + --from="nobody@example.com" \ + $patches >stdout && + grep "To: default@example.com" stdout +' + +test_expect_success $PREREQ 'sendemail.identity: bool identity variable existance overrides' ' + git -c sendemail.identity=cloud \ + -c sendemail.xmailer=true \ + -c sendemail.cloud.xmailer=false \ + send-email \ + --dry-run \ + --from="nobody@example.com" \ + $patches >stdout && + grep "To: cloud@example.com" stdout && + ! grep "X-Mailer" stdout +' + +test_expect_success $PREREQ 'sendemail.identity: bool variable fallback' ' + git -c sendemail.identity=cloud \ + -c sendemail.xmailer=false \ + send-email \ + --dry-run \ + --from="nobody@example.com" \ + $patches >stdout && + grep "To: cloud@example.com" stdout && + ! grep "X-Mailer" stdout +' + test_expect_success $PREREQ '--no-to overrides sendemail.to' ' git send-email \ --dry-run \ @@ -1757,6 +1812,15 @@ test_expect_success '--dump-aliases must be used alone' ' test_must_fail git send-email --dump-aliases --to=janice@example.com -1 refs/heads/accounting ' +test_expect_success $PREREQ 'aliases and sendemail.identity' ' + test_must_fail git \ + -c sendemail.identity=cloud \ + -c sendemail.aliasesfile=default-aliases \ + -c sendemail.cloud.aliasesfile=cloud-aliases \ + send-email -1 2>stderr && + test_i18ngrep "cloud-aliases" stderr +' + test_sendmail_aliases () { msg="$1" && shift && expect="$@" && |