diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index 6a5ff036ff..156e4809f6 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -603,6 +603,9 @@ The hook always runs after the automatic note copying (see
"notes.rewrite.<command>" in linkgit:git-config[1]) has happened, and
thus has access to these notes.
+Hooks run during 'post-rewrite' will be run in parallel, unless hook.jobs is
+configured to 1.
+
The following command-specific comments apply:
rebase::
diff --git a/builtin/am.c b/builtin/am.c
index d84791859c..d2534f9a1f 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -469,23 +469,17 @@ 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");
+ struct run_hooks_opt opt;
int ret;
- if (!hook)
- return 0;
+ run_hooks_opt_init_async(&opt);
- 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_hooks("post-rewrite", &opt);
- ret = run_command(&cp);
-
- close(cp.in);
+ run_hooks_opt_clear(&opt);
return ret;
}
diff --git a/sequencer.c b/sequencer.c
index 72234af8ed..3fa7668763 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -35,6 +35,7 @@
#include "rebase-interactive.h"
#include "reset.h"
#include "hook.h"
+#include "string-list.h"
#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
@@ -1147,33 +1148,30 @@ int update_head_with_reflog(const struct commit *old_head,
static int run_rewrite_hook(const struct object_id *oldoid,
const struct object_id *newoid)
{
- struct child_process proc = CHILD_PROCESS_INIT;
- const char *argv[3];
+ struct run_hooks_opt opt;
+ struct strbuf tmp = STRBUF_INIT;
+ struct string_list to_stdin = STRING_LIST_INIT_DUP;
int code;
- struct strbuf sb = STRBUF_INIT;
- argv[0] = find_hook("post-rewrite");
- if (!argv[0])
- return 0;
+ run_hooks_opt_init_async(&opt);
- argv[1] = "amend";
- argv[2] = NULL;
-
- proc.argv = argv;
- proc.in = -1;
- proc.stdout_to_stderr = 1;
- proc.trace2_hook_name = "post-rewrite";
-
- code = start_command(&proc);
- if (code)
- return code;
- strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
- sigchain_push(SIGPIPE, SIG_IGN);
- write_in_full(proc.in, sb.buf, sb.len);
- close(proc.in);
- strbuf_release(&sb);
- sigchain_pop(SIGPIPE);
- return finish_command(&proc);
+ strvec_push(&opt.args, "amend");
+
+ strbuf_addf(&tmp,
+ "%s %s",
+ oid_to_hex(oldoid),
+ oid_to_hex(newoid));
+ string_list_append(&to_stdin, tmp.buf);
+
+ opt.feed_pipe = pipe_from_string_list;
+ opt.feed_pipe_ctx = &to_stdin;
+
+ code = run_hooks("post-rewrite", &opt);
+
+ run_hooks_opt_clear(&opt);
+ strbuf_release(&tmp);
+ string_list_clear(&to_stdin, 0);
+ return code;
}
void commit_post_rewrite(struct repository *r,@@ -4527,30 +4525,23 @@ static int pick_commits(struct repository *r,
flush_rewritten_pending();
if (!stat(rebase_path_rewritten_list(), &st) &&
st.st_size > 0) {
- struct child_process child = CHILD_PROCESS_INIT;
- const char *post_rewrite_hook =
- find_hook("post-rewrite");
-
- child.in = open(rebase_path_rewritten_list(), O_RDONLY);
- child.git_cmd = 1;
- strvec_push(&child.args, "notes");
- strvec_push(&child.args, "copy");
- strvec_push(&child.args, "--for-rewrite=rebase");
+ struct child_process notes_cp = CHILD_PROCESS_INIT;
+ struct run_hooks_opt hook_opt;
+
+ run_hooks_opt_init_async(&hook_opt);
+
+ notes_cp.in = open(rebase_path_rewritten_list(), O_RDONLY);
+ notes_cp.git_cmd = 1;
+ strvec_push(¬es_cp.args, "notes");
+ strvec_push(¬es_cp.args, "copy");
+ strvec_push(¬es_cp.args, "--for-rewrite=rebase");
/* we don't care if this copying failed */
- run_command(&child);
-
- if (post_rewrite_hook) {
- struct child_process hook = CHILD_PROCESS_INIT;
-
- hook.in = open(rebase_path_rewritten_list(),
- O_RDONLY);
- hook.stdout_to_stderr = 1;
- hook.trace2_hook_name = "post-rewrite";
- strvec_push(&hook.args, post_rewrite_hook);
- strvec_push(&hook.args, "rebase");
- /* we don't care if this hook failed */
- run_command(&hook);
- }
+ run_command(¬es_cp);
+
+ hook_opt.path_to_stdin = rebase_path_rewritten_list();
+ strvec_push(&hook_opt.args, "rebase");
+ run_hooks("post-rewrite", &hook_opt);
+ run_hooks_opt_clear(&hook_opt);
}
apply_autostash(rebase_path_autostash());
--
2.31.1.818.g46aad6cb9e-goog