@@ -2062,47 +2062,33 @@ int ref_update_reject_duplicates(struct string_list *refnames,
static int run_transaction_hook(struct ref_transaction *transaction,
const char *state)
{
- struct child_process proc = CHILD_PROCESS_INIT;
- struct strbuf buf = STRBUF_INIT;
- const char *hook;
+ struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
+ struct string_list to_stdin = STRING_LIST_INIT_NODUP;
int ret = 0, i;
- hook = find_hook("reference-transaction");
- if (!hook)
- return ret;
-
- strvec_pushl(&proc.args, hook, state, NULL);
- proc.in = -1;
- proc.stdout_to_stderr = 1;
- proc.trace2_hook_name = "reference-transaction";
-
- ret = start_command(&proc);
- if (ret)
+ if (!hook_exists("reference-transaction"))
return ret;
- sigchain_push(SIGPIPE, SIG_IGN);
+ strvec_push(&opt.args, state);
for (i = 0; i < transaction->nr; i++) {
struct ref_update *update = transaction->updates[i];
+ struct strbuf buf = STRBUF_INIT;
- strbuf_reset(&buf);
- strbuf_addf(&buf, "%s %s %s\n",
+ strbuf_addf(&buf, "%s %s %s",
oid_to_hex(&update->old_oid),
oid_to_hex(&update->new_oid),
update->refname);
-
- if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
- if (errno != EPIPE)
- ret = -1;
- break;
- }
+ string_list_append(&to_stdin, strbuf_detach(&buf, NULL));
}
- close(proc.in);
- sigchain_pop(SIGPIPE);
- strbuf_release(&buf);
+ opt.feed_pipe = pipe_from_string_list;
+ opt.feed_pipe_ctx = &to_stdin;
+
+ ret = run_hooks_oneshot("reference-transaction", &opt);
+ to_stdin.strdup_strings = 1;
+ string_list_clear(&to_stdin, 0);
- ret |= finish_command(&proc);
return ret;
}