Toggle diff (214 lines)
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.cournoyer@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 <greg@kroah.com>
+ # Copyright 2005 Ryan Anderson <ryan@michonline.com>
++# Copyright 2023 Maxim Cournoyer <maxim.cournoyer@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 "^ cccmd@example.com" msgtxt1
+ '
+
++test_expect_success $PREREQ 'headercmd works' '
++ clean_fake_sendmail &&
++ cp $patches headercmd.patch &&
++ echo "headercmd--X-Debbugs-CC: dummy@example.com" >>headercmd.patch &&
++ git send-email \
++ --from="Example <nobody@example.com>" \
++ --to=nobody@example.com \
++ --header-cmd=./headercmd-sed \
++ --smtp-server="$(pwd)/fake.sendmail" \
++ headercmd.patch \
++ &&
++ grep "^X-Debbugs-CC: dummy@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