threads / patch / 58778

patchChange git-send-email's sendemail-validate hook to use header information

Subject: [PATCH] Change git-send-email's sendemail-validate hook to use header information

## tl;dr

3 messages between Nov 9, 2022 and Nov 9, 2022. Diffs are folded; open one to read it.

replies: 2people: 3as markdown or json

Strawbridge, Michael· Nov 9, 2022, 18:23 UTC · lore

Since commit-msg and pre-commit git hooks already expose commit contents, switch sendemail-validate to use the header information of the email that git-send-email intends to send.

Cc: Luben Tuikov <luben.tuikov@amd.com>
Cc: brian m. carlson <sandals@crustytoothpaste.net>
---
 git-send-email.perl | 57 +++++++++++++++++++++++++++++----------------
 1 file changed, 37 insertions(+), 20 deletions(-)
Show changes to git-send-email.perl +37 −20
diff --git a/git-send-email.perl b/git-send-email.perl
index 5861e99a6e..3ea6fda48e 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -787,14 +787,6 @@ sub is_format_patch_arg {
 
 @files = handle_backup_files(@files);
 
-if ($validate) {
-	foreach my $f (@files) {
-		unless (-p $f) {
-			validate_patch($f, $target_xfer_encoding);
-		}
-	}
-}
-
 if (@files) {
 	unless ($quiet) {
 		print $_,"\n" for (@files);
@@ -1495,16 +1487,7 @@ sub file_name_is_absolute {
 	return File::Spec::Functions::file_name_is_absolute($path);
 }
 
-# Prepares the email, then asks the user what to do.
-#
-# If the user chooses to send the email, it's sent and 1 is returned.
-# If the user chooses not to send the email, 0 is returned.
-# If the user decides they want to make further edits, -1 is returned and the
-# caller is expected to call send_message again after the edits are performed.
-#
-# If an error occurs sending the email, this just dies.
-
-sub send_message {
+sub gen_header {
 	my @recipients = unique_email_list(@to);
 	@cc = (grep { my $cc = extract_valid_address_or_die($_);
 		      not grep { $cc eq $_ || $_ =~ /<\Q${cc}\E>$/ } @recipients
@@ -1546,6 +1529,22 @@ sub send_message {
 	if (@xh) {
 		$header .= join("\n", @xh) . "\n";
 	}
+	return $header;
+}
+
+# Prepares the email, then asks the user what to do.
+#
+# If the user chooses to send the email, it's sent and 1 is returned.
+# If the user chooses not to send the email, 0 is returned.
+# If the user decides they want to make further edits, -1 is returned and the
+# caller is expected to call send_message again after the edits are performed.
+#
+# If an error occurs sending the email, this just dies.
+
+sub send_message {
+	my @recipients = unique_email_list(@to);
+
+        my $header = gen_header();
 
 	my @sendmail_parameters = ('-i', @recipients);
 	my $raw_from = $sender;
@@ -1955,6 +1954,15 @@ sub process_file {
 		}
 	}
 
+
+	if ($validate) {
+		foreach my $f (@files) {
+			unless (-p $f) {
+				validate_patch($f, $target_xfer_encoding);
+			}
+		}
+	}
+
 	my $message_was_sent = send_message();
 	if ($message_was_sent == -1) {
 		do_edit($t);
@@ -2088,11 +2096,20 @@ sub validate_patch {
 			chdir($repo->wc_path() or $repo->repo_path())
 				or die("chdir: $!");
 			local $ENV{"GIT_DIR"} = $repo->repo_path();
+
+			my $header = gen_header();
+
+			require File::Temp;
+			my ($header_filehandle, $header_filename) = File::Temp::tempfile(
+                            ".gitsendemail.header.XXXXXX", DIR => $repo->repo_path());
+			print $header_filehandle $header;
+
 			my @cmd = ("git", "hook", "run", "--ignore-missing",
 				    $hook_name, "--");
-			my @cmd_msg = (@cmd, "<patch>");
-			my @cmd_run = (@cmd, $target);
+			my @cmd_msg = (@cmd, "<header>");
+			my @cmd_run = (@cmd, $header_filename);
 			$hook_error = system_or_msg(\@cmd_run, undef, "@cmd_msg");
+			unlink($header_filehandle);
 			chdir($cwd_save) or die("chdir: $!");
 		}
 		if ($hook_error) {
-- 
2.34.1
Taylor Blau· Nov 9, 2022, 23:13 UTC · re: Strawbridge, Michael · lore

Re: [PATCH] Change git-send-email's sendemail-validate hook to use header information

Hi Michael,
On Wed, Nov 09, 2022 at 06:23:06PM +0000, Strawbridge, Michael wrote:
Show 6 quoted lines
> Since commit-msg and pre-commit git hooks already expose commit
> contents, switch sendemail-validate to use the header information
> of the email that git-send-email intends to send.
>
> Cc: Luben Tuikov <luben.tuikov@amd.com>
> Cc: brian m. carlson <sandals@crustytoothpaste.net>

Without having looked at the patch below, would you mind re-submitting it with your Signed-off-by? Please see Documentation/SubmittingPatches for more.

Thanks, Taylor

brian m. carlson· Nov 9, 2022, 23:16 UTC · re: Strawbridge, Michael · lore

Re: [PATCH] Change git-send-email's sendemail-validate hook to use header information

On 2022-11-09 at 18:23:06, Strawbridge, Michael wrote:
> Since commit-msg and pre-commit git hooks already expose commit
> contents, switch sendemail-validate to use the header information
> of the email that git-send-email intends to send.

I have a couple of thoughts here, and maybe you can explain them a bit better in the commit message for v2. First, I'm not sure why this is valuable. What do we gain from this that we don't have now? Why is the current state inadequate?

Also, how does this handle encoded headers? I'd like to see some tests before and after here, especially some including non-ASCII user.name values so that we can test that we do the right thing here. If there's some beneficial improvement here that results in a behaviour change, then of course we'd want to test that as well.

Finally, since we move the validation code farther down instead of first thing, is there any place that this would result in a different behaviour? For example, --dry-run mode? Is there any way we could send data that isn't validated but should be?

-- 
brian m. carlson (he/him or they/them)
Toronto, Ontario, CA

← back to recent threads