@@ -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::
@@ -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;
}
@@ -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());
By using 'hook.h' for 'post-rewrite', we simplify hook invocations by not needing to put together our own 'struct child_process' and we also learn to run hooks specified in the config as well as the hook dir. The signal handling that's being removed by this commit now takes place in run-command.h:run_processes_parallel(), so it is OK to remove them here. Signed-off-by: Emily Shaffer <emilyshaffer@google.com> --- Documentation/githooks.txt | 3 ++ builtin/am.c | 18 +++----- sequencer.c | 85 +++++++++++++++++--------------------- 3 files changed, 47 insertions(+), 59 deletions(-)