In preparation to fix <https://issues.guix.gnu.org/58813>.
* gnu/packages/patches/git-header-cmd.patch: New file. * gnu/local.mk (dist_patch_DATA): Register it. * gnu/packages/version-control.scm (git) [source]: Apply patch. --- gnu/local.mk | 1 + gnu/packages/patches/git-header-cmd.patch | 180 ++++++++++++++++++++++ gnu/packages/version-control.scm | 3 +- 3 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/git-header-cmd.patch diff --git a/gnu/local.mk b/gnu/local.mk index b631fa6d5a..d7c7ca48e7 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1209,6 +1209,7 @@ dist_patch_DATA = \ %D%/packages/patches/gemmi-fix-sajson-types.patch \ %D%/packages/patches/genimage-mke2fs-test.patch \ %D%/packages/patches/geoclue-config.patch \ + %D%/packages/patches/git-header-cmd.patch \ %D%/packages/patches/ghc-8.0-fall-back-to-madv_dontneed.patch \ %D%/packages/patches/ghc-9.2-glibc-2.33-link-order.patch \ %D%/packages/patches/ghc-testsuite-dlopen-pie.patch \ diff --git a/gnu/packages/patches/git-header-cmd.patch b/gnu/packages/patches/git-header-cmd.patch new file mode 100644 index 0000000000..fdd34fe4a4 --- /dev/null +++ b/gnu/packages/patches/git-header-cmd.patch @@ -0,0 +1,180 @@ +Add a '--header-cmd' to git send-email. + +Upstream status can be tracked at: +https://lore.kernel.org/git/20230423122744.4865-1-maxim.courno...@gmail.com/T/#t + +diff --git a/Documentation/config/sendemail.txt b/Documentation/config/sendemail.txt +index 51da7088a8..3d0f516520 100644 +--- a/Documentation/config/sendemail.txt ++++ b/Documentation/config/sendemail.txt +@@ -58,6 +58,7 @@ sendemail.annotate:: + sendemail.bcc:: + sendemail.cc:: + sendemail.ccCmd:: ++sendemail.headerCmd:: + sendemail.chainReplyTo:: + sendemail.envelopeSender:: + sendemail.from:: +diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt +index b0f438ec99..354c0d06db 100644 +--- a/Documentation/git-send-email.txt ++++ b/Documentation/git-send-email.txt +@@ -320,6 +320,11 @@ Automating + Output of this command must be single email address per line. + Default is the value of `sendemail.ccCmd` configuration value. + ++--header-cmd=<command>:: ++ Specify a command to execute once per patch file which should ++ generate arbitrary, patch file specific header entries. ++ Default is the value of `sendemail.headerCmd` configuration value. ++ + --[no-]chain-reply-to:: + If this is set, each email will be sent as a reply to the previous + email sent. If disabled with "--no-chain-reply-to", all emails after +diff --git a/git-send-email.perl b/git-send-email.perl +index fd8cd0d46f..676dd83d89 100755 +--- a/git-send-email.perl ++++ b/git-send-email.perl +@@ -2,6 +2,7 @@ + # + # Copyright 2002,2005 Greg Kroah-Hartman <g...@kroah.com> + # Copyright 2005 Ryan Anderson <r...@michonline.com> ++# Copyright 2023 Maxim Cournoyer <maxim.courno...@gmail.com> + # + # GPL v2 (See COPYING) + # +@@ -87,8 +88,9 @@ sub usage { + + 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` ++ --to-cmd <str> * Email To: via `<str> \$patch_path`. ++ --cc-cmd <str> * Email Cc: via `<str> \$patch_path`. ++ --header-cmd <str> * Add headers via `<str> \$patch_path`. + --suppress-cc <str> * author, self, sob, cc, cccmd, body, bodycc, misc-by, all. + --[no-]cc-cover * Email Cc: addresses in the cover letter. + --[no-]to-cover * Email To: addresses in the cover letter. +@@ -269,7 +271,7 @@ sub do_edit { + # Variables with corresponding config settings + my ($suppress_from, $signed_off_by_cc); + my ($cover_cc, $cover_to); +-my ($to_cmd, $cc_cmd); ++my ($to_cmd, $cc_cmd, $header_cmd); + my ($smtp_server, $smtp_server_port, @smtp_server_options); + my ($smtp_authuser, $smtp_encryption, $smtp_ssl_cert_path); + my ($batch_size, $relogin_delay); +@@ -318,6 +320,7 @@ sub do_edit { + "tocmd" => \$to_cmd, + "cc" => \@config_cc, + "cccmd" => \$cc_cmd, ++ "headercmd" => \$header_cmd, + "aliasfiletype" => \$aliasfiletype, + "bcc" => \@config_bcc, + "suppresscc" => \@suppress_cc, +@@ -519,6 +522,7 @@ sub config_regexp { + "compose" => \$compose, + "quiet" => \$quiet, + "cc-cmd=s" => \$cc_cmd, ++ "header-cmd=s" => \$header_cmd, + "suppress-from!" => \$suppress_from, + "no-suppress-from" => sub {$suppress_from = 0}, + "suppress-cc=s" => \@suppress_cc, +@@ -1776,6 +1780,9 @@ sub process_file { + push(@header, $_); + } + } ++ # Add computed headers, if applicable. ++ push @header, execute_cmd("header-cmd", $header_cmd, $t) ++ if defined $header_cmd; + # Now parse the header + foreach(@header) { + if (/^From /) { +@@ -2006,15 +2013,30 @@ sub process_file { + } + } + ++# Execute a command (e.g., $x_cmd) and return its output lines as an ++# array. ++sub execute_cmd { ++ my ($prefix, $cmd, $file) = @_; ++ my @lines = (); ++ open my $fh, "-|", "$cmd \Q$file\E" ++ or die sprintf(__("(%s) Could not execute '%s'"), $prefix, $cmd); ++ while (my $line = <$fh>) { ++ last if $line =~ /^$/; ++ push @lines, $line; ++ } ++ close $fh ++ or die sprintf(__("(%s) failed to close pipe to '%s'"), $prefix, $cmd); ++ return @lines; ++} ++ + # 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 @lines = (); + my @addresses = (); +- open my $fh, "-|", "$cmd \Q$file\E" +- or die sprintf(__("(%s) Could not execute '%s'"), $prefix, $cmd); +- while (my $address = <$fh>) { ++ @lines = execute_cmd($prefix, $cmd, $file); ++ for my $address (@lines) { + $address =~ s/^\s*//g; + $address =~ s/\s*$//g; + $address = sanitize_address($address); +@@ -2023,8 +2045,6 @@ sub recipients_cmd { + printf(__("(%s) Adding %s: %s from: '%s'\n"), + $prefix, $what, $address, $cmd) unless $quiet; + } +- close $fh +- or die sprintf(__("(%s) failed to close pipe to '%s'"), $prefix, $cmd); + return @addresses; + } + +diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh +index 0de83b5d2b..3393725107 100755 +--- a/t/t9001-send-email.sh ++++ b/t/t9001-send-email.sh +@@ -374,13 +374,16 @@ test_expect_success $PREREQ,!AUTOIDENT 'broken implicit ident aborts send-email' + ) + ' + +-test_expect_success $PREREQ 'setup tocmd and cccmd scripts' ' ++test_expect_success $PREREQ 'setup cmd scripts' ' + write_script tocmd-sed <<-\EOF && + sed -n -e "s/^tocmd--//p" "$1" + EOF +- write_script cccmd-sed <<-\EOF ++ write_script cccmd-sed <<-\EOF && + sed -n -e "s/^cccmd--//p" "$1" + EOF ++ write_script headercmd-sed <<-\EOF ++ sed -n -e "s/^headercmd--//p" "$1" ++ EOF + ' + + test_expect_success $PREREQ 'tocmd works' ' +@@ -410,6 +413,20 @@ test_expect_success $PREREQ 'cccmd works' ' + grep "^ cc...@example.com" msgtxt1 + ' + ++test_expect_success $PREREQ 'headercmd works' ' ++ clean_fake_sendmail && ++ cp $patches headercmd.patch && ++ echo "headercmd--X-Debbugs-CC: du...@example.com" >>headercmd.patch && ++ git send-email \ ++ --from="Example <nob...@example.com>" \ ++ --to=nob...@example.com \ ++ --header-cmd=./headercmd-sed \ ++ --smtp-server="$(pwd)/fake.sendmail" \ ++ headercmd.patch \ ++ && ++ grep "^X-Debbugs-CC: du...@example.com" msgtxt1 ++' ++ + test_expect_success $PREREQ 'reject long lines' ' + z8=zzzzzzzz && + z64=$z8$z8$z8$z8$z8$z8$z8$z8 && diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm index 302f7c90ad..d5d88b99ed 100644 --- a/gnu/packages/version-control.scm +++ b/gnu/packages/version-control.scm @@ -232,7 +232,8 @@ (define-public git version ".tar.xz")) (sha256 (base32 - "1mpjvhyw8mv2q941xny4d0gw3mb6b4bqaqbh73jd8b1v6zqpaps7")))) + "1mpjvhyw8mv2q941xny4d0gw3mb6b4bqaqbh73jd8b1v6zqpaps7")) + (patches (search-patches "git-header-cmd.patch")))) (build-system gnu-build-system) (native-inputs `(("native-perl" ,perl) -- 2.39.2