diff mbox series

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

Message ID 20221109182254.71967-1-michael.strawbridge@amd.com (mailing list archive)
State New, archived
Headers show
Series Change git-send-email's sendemail-validate hook to use header information | expand

Commit Message

Michael Strawbridge Nov. 9, 2022, 6:23 p.m. UTC
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(-)

Comments

Taylor Blau Nov. 9, 2022, 11:13 p.m. UTC | #1
Hi Michael,

On Wed, Nov 09, 2022 at 06:23:06PM +0000, 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.
>
> 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, 11:16 p.m. UTC | #2
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?
diff mbox series

Patch

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) {