]> git.ipfire.org Git - thirdparty/git.git/commitdiff
hook API: support passing stdin to hooks, convert am's 'post-rewrite'
authorEmily Shaffer <emilyshaffer@google.com>
Wed, 8 Feb 2023 19:21:13 +0000 (20:21 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 Feb 2023 20:50:03 +0000 (12:50 -0800)
Convert the invocation of the 'post-rewrite' hook run by 'git am' to
use the hook.h library. To do this we need to add a "path_to_stdin"
member to "struct run_hooks_opt".

In our API this is supported by asking for a file path, rather
than by reading stdin. Reading directly from stdin would involve caching
the entire stdin (to memory or to disk) once the hook API is made to
support "jobs" larger than 1, along with support for executing N hooks
at a time (i.e. the upcoming config-based hooks).

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/am.c
hook.c
hook.h

index 82a41cbfc4e9ce2538644b9247dfc3a3bbe60888..8be91617fefb362405ff1b0959c194b38d439605 100644 (file)
@@ -495,24 +495,12 @@ static int run_applypatch_msg_hook(struct am_state *state)
  */
 static int run_post_rewrite_hook(const struct am_state *state)
 {
-       struct child_process cp = CHILD_PROCESS_INIT;
-       const char *hook = find_hook("post-rewrite");
-       int ret;
-
-       if (!hook)
-               return 0;
+       struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
 
-       strvec_push(&cp.args, hook);
-       strvec_push(&cp.args, "rebase");
+       strvec_push(&opt.args, "rebase");
+       opt.path_to_stdin = am_path(state, "rewritten");
 
-       cp.in = xopen(am_path(state, "rewritten"), O_RDONLY);
-       cp.stdout_to_stderr = 1;
-       cp.trace2_hook_name = "post-rewrite";
-
-       ret = run_command(&cp);
-
-       close(cp.in);
-       return ret;
+       return run_hooks_opt("post-rewrite", &opt);
 }
 
 /**
diff --git a/hook.c b/hook.c
index a4fa1031f287652eb734b276d9d6c98df40d9a08..1a8483186349b00608d40bc3d8702aa39ffb79c8 100644 (file)
--- a/hook.c
+++ b/hook.c
@@ -55,6 +55,11 @@ static int pick_next_hook(struct child_process *cp,
 
        cp->no_stdin = 1;
        strvec_pushv(&cp->env, hook_cb->options->env.v);
+       /* reopen the file for stdin; run_command closes it. */
+       if (hook_cb->options->path_to_stdin) {
+               cp->no_stdin = 0;
+               cp->in = xopen(hook_cb->options->path_to_stdin, O_RDONLY);
+       }
        cp->stdout_to_stderr = 1;
        cp->trace2_hook_name = hook_cb->hook_name;
        cp->dir = hook_cb->options->dir;
diff --git a/hook.h b/hook.h
index 4258b13da0d7c3c88a81b79eb25e8cc6a29dc6b6..19ab9a5806e1c1de11f7b300471c957fa5e6b4d4 100644 (file)
--- a/hook.h
+++ b/hook.h
@@ -30,6 +30,11 @@ struct run_hooks_opt
         * was invoked.
         */
        int *invoked_hook;
+
+       /**
+        * Path to file which should be piped to stdin for each hook.
+        */
+       const char *path_to_stdin;
 };
 
 #define RUN_HOOKS_OPT_INIT { \