The sendemail.smtpServer configuration option and the '--smtp-server' command line option can name a program to use by providing an absolute path to the program. However, an absolute path is not always portable and it is often preferable to simply specify a program name and have 'git-send-email' find that program on $PATH. For example, if a user wishes to use msmtp to send emails, they might be able to simply use [sendemail] smtpServer = !msmtp instead of using the full path. This is particularly useful when a common git config file is used across multiple systems where the absolute path to a given program may differ. To that end, this patch allows both the configuration and command line options to be prefixed with a '!' character to indicate that the specified command should be found on $PATH, as if the user had entered it directly on the command line. Signed-off-by: Gregory Anders <greg@xxxxxxxxxxxx> --- Diff from v4: * Update the test with suggestions from Jeff King (this should fix erroneous test failures caused by patch files being deleted by earlier tests) * Reword the commit message with feedback from Jeff King and Junio Hamano Documentation/git-send-email.txt | 13 +++++++------ git-send-email.perl | 7 +++++-- t/t9001-send-email.sh | 12 ++++++++++++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 93708aefea..418e66c703 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -212,12 +212,13 @@ a password is obtained using 'git-credential'. --smtp-server=<host>:: If set, specifies the outgoing SMTP server to use (e.g. `smtp.example.com` or a raw IP address). Alternatively it can - specify a full pathname of a sendmail-like program instead; - the program must support the `-i` option. Default value can - be specified by the `sendemail.smtpServer` configuration - option; the built-in default is to search for `sendmail` in - `/usr/sbin`, `/usr/lib` and $PATH if such program is - available, falling back to `localhost` otherwise. + specify a sendmail-like program instead, either by a full + path-name or by prefixing the program name with `!`. The + program must support the `-i` option. Default value can be + specified by the `sendemail.smtpServer` configuration option; + the built-in default is to search for `sendmail` in `/usr/sbin`, + `/usr/lib` and $PATH if such program is available, falling back + to `localhost` otherwise. --smtp-server-port=<port>:: Specifies a port different from the default port (SMTP diff --git a/git-send-email.perl b/git-send-email.perl index 175da07d94..022dcf0999 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -1492,11 +1492,14 @@ sub send_message { if ($dry_run) { # We don't want to send the email. - } elsif (file_name_is_absolute($smtp_server)) { + } elsif (file_name_is_absolute($smtp_server) || $smtp_server =~ /^!/) { + my $prog = $smtp_server; + $prog =~ s/^!//; + my $pid = open my $sm, '|-'; defined $pid or die $!; if (!$pid) { - exec($smtp_server, @sendmail_parameters) or die $!; + exec($prog, @sendmail_parameters) or die $!; } print $sm "$header\n$message"; close $sm or die $!; diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 65b3035371..31d25b32b5 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -2148,6 +2148,18 @@ test_expect_success $PREREQ 'leading and trailing whitespaces are removed' ' test_cmp expected-list actual-list ' +test_expect_success $PREREQ 'test using a command for smtpServer with !' ' + clean_fake_sendmail && + PATH="$(pwd):$PATH" \ + git send-email \ + --from="Example <nobody@xxxxxxxxxxx>" \ + --to=nobody@xxxxxxxxxxx \ + --smtp-server="!fake.sendmail" \ + HEAD~2 2>errors && + test_path_is_file commandline1 && + test_path_is_file commandline2 +' + test_expect_success $PREREQ 'invoke hook' ' mkdir -p .git/hooks && -- 2.31.1