git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Phillip Wood <phillip.wood123@gmail.com>
To: Robin Jarry <robin@jarry.cc>, git@vger.kernel.org
Cc: Tim Culverhouse <tim@timculverhouse.com>,
	Nicolas Dichtel <nicolas.dichtel@6wind.com>,
	Bagas Sanjaya <bagasdotme@gmail.com>,
	Junio C Hamano <gitster@pobox.com>,
	Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [PATCH RESEND] hooks: add sendemail-validate-series
Date: Mon, 3 Apr 2023 15:09:32 +0100	[thread overview]
Message-ID: <66099367-4ea0-7d2a-a089-7a88e27f695e@dunelm.org.uk> (raw)
In-Reply-To: <20230402185635.302653-1-robin@jarry.cc>

Hi Robin

On 02/04/2023 19:56, Robin Jarry wrote:
> When sending patch series (with a cover-letter or not)
> sendemail-validate is called with every email/patch file independently
> from the others. When one of the patches depends on a previous one, it
> may not be possible to use this hook in a meaningful way.
> 
> Changing sendemail-validate to take all patches as arguments would break
> backward compatibility.
> 
> Add a new hook to allow validating patch series instead of patch by
> patch. The patch files are provided in the hook script standard input.
> 
> git hook run cannot be used since it closes the hook standard input. Run
> the hook directly.

I've left some comments about this lower down as "git hook run" now has 
a --to-stdin option.

> Signed-off-by: Robin Jarry <robin@jarry.cc>
> ---

> +sendemail-validate-series
> +~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +This hook is invoked by linkgit:git-send-email[1].  It allows performing
> +validation on a complete patch series at once, instead of patch by patch with
> +`sendemail-validate`.
> +
> +`sendemail-validate-series` takes no arguments, but for each e-mail to be sent
> +it receives on standard input a line of the format:
> +
> +  <patch-file> LF

Usually git commands that produce or consume paths either use quoted 
paths terminated by LF or unquoted paths terminated by NUL. That way 
there is no ambiguity when a path contains LF.

> +where `<patch-file>` is a name of a file that holds an e-mail to be sent,
> +
> +If the hook exits with non-zero status, `git send-email` will abort before
> +sending any e-mails.
> +
>   fsmonitor-watchman
>   ~~~~~~~~~~~~~~~~~~
>   
> diff --git a/git-send-email.perl b/git-send-email.perl
> index 07f2a0cbeaad..bec4d0f4ab47 100755
> --- a/git-send-email.perl
> +++ b/git-send-email.perl
> @@ -800,6 +800,7 @@ sub is_format_patch_arg {
>   			validate_patch($f, $target_xfer_encoding);
>   		}
>   	}
> +	validate_patch_series(@files)

This happens fairly early, before the user has had a chance to edit the 
patches and before we have added all the recipient and in-reply-to 
headers to the patch files. Would it be more useful to validate what 
will actually be sent?

>   }
>   
>   if (@files) {
> @@ -2125,6 +2126,47 @@ sub validate_patch {
>   	return;
>   }
>   
> +sub validate_patch_series {
> +	my @files = @_;
> +
> +	unless ($repo) {
> +		return;
> +	}
> +
> +	my $hook_name = 'sendemail-validate-series';
> +	my $hooks_path = $repo->command_oneline('rev-parse', '--git-path', 'hooks');

$hooks_path maybe a relative path, this is problematic because we change 
directory before executing the hook (using "git hook run" would avoid this).

> +	require File::Spec;
> +	my $validate_hook = File::Spec->catfile($hooks_path, $hook_name);
> +	my $hook_error;
> +	unless (-x $validate_hook) {
> +		return;
> +	}
> +
> +	# The hook needs a correct cwd and GIT_DIR.
> +	require Cwd;
> +	my $cwd_save = Cwd::getcwd();
> +	chdir($repo->wc_path() or $repo->repo_path()) or die("chdir: $!");
> +	local $ENV{"GIT_DIR"} = $repo->repo_path();

This looks like it is copied from the existing code but why do we need 
to do this? I'm struggling to come up with a scenario where "git 
send-email" can find the repository but the hook cannot.

> +	# cannot use git hook run, it closes stdin before forking the hook
> +	open(my $stdin, "|-", $validate_hook) or die("fork: $!");

This passes $validate_hook to the shell to execute which is not what we 
want as it will split the hook path on whitespace etc. I think it would 
be better to use "git hook run --to-stdin" (see 0414b3891c (hook: 
support a --to-stdin=<path> option, 2023-02-08))

Best Wishes

Phillip

> +	chdir($cwd_save) or die("chdir: $!");
> +	for my $fn (@files) {
> +		unless (-p $fn) {
> +			$fn = Cwd::abs_path($fn);
> +			$stdin->print("$fn\n");
> +		}
> +	}
> +	close($stdin); # calls waitpid
> +	if ($? & 0x7f) {
> +		my $sig = $? & 0x7f;
> +		die("fatal: hook $hook_name killed by signal $sig");
> +	} elsif ($? >> 8) {
> +		my $err = $? >> 8;
> +		die("fatal: hook $hook_name rejected patch series (exit code $err)");
> +	}
> +	return;
> +}
> +
>   sub handle_backup {
>   	my ($last, $lastlen, $file, $known_suffix) = @_;
>   	my ($suffix, $skip);

  parent reply	other threads:[~2023-04-03 14:10 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-02 18:56 [PATCH RESEND] hooks: add sendemail-validate-series Robin Jarry
2023-04-03  0:17 ` Eric Sunshine
2023-04-03 14:09 ` Phillip Wood [this message]
2023-04-03 14:32   ` Robin Jarry
2023-04-03 15:20     ` Phillip Wood
2023-04-03 15:42   ` Junio C Hamano
2023-04-03 17:25     ` Robin Jarry
2023-04-03 22:29   ` Robin Jarry
2023-04-03 22:52     ` Junio C Hamano
2023-04-03 22:59       ` Robin Jarry
2023-04-04 20:14         ` Junio C Hamano
2023-04-05  8:31           ` Robin Jarry
2023-04-05 21:49             ` Junio C Hamano
2023-04-05 23:13 ` [PATCH v2] " Robin Jarry
2023-04-06  8:56   ` Ævar Arnfjörð Bjarmason
2023-04-11  9:58     ` Phillip Wood
2023-04-11 10:39       ` Robin Jarry
2023-04-11 15:58       ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=66099367-4ea0-7d2a-a089-7a88e27f695e@dunelm.org.uk \
    --to=phillip.wood123@gmail.com \
    --cc=bagasdotme@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=nicolas.dichtel@6wind.com \
    --cc=phillip.wood@dunelm.org.uk \
    --cc=robin@jarry.cc \
    --cc=sunshine@sunshineco.com \
    --cc=tim@timculverhouse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).