@@ -2062,47 +2062,35 @@ 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_DUP;
int ret = 0, i;
+ char o[GIT_MAX_HEXSZ + 1], n[GIT_MAX_HEXSZ + 1];
- hook = find_hook("reference-transaction");
- if (!hook)
+ if (!hook_exists("reference-transaction"))
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)
- 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];
+ oid_to_hex_r(o, &update->old_oid);
+ oid_to_hex_r(n, &update->new_oid);
strbuf_reset(&buf);
- strbuf_addf(&buf, "%s %s %s\n",
- 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;
- }
+ strbuf_addf(&buf, "%s %s %s", o, n, update->refname);
+ string_list_append(&to_stdin, buf.buf);
}
- close(proc.in);
- sigchain_pop(SIGPIPE);
+ opt.feed_pipe = pipe_from_string_list;
+ opt.feed_pipe_ctx = &to_stdin;
+
+ ret = run_hooks("reference-transaction", &opt);
+ run_hooks_opt_clear(&opt);
strbuf_release(&buf);
+ string_list_clear(&to_stdin, 0);
- ret |= finish_command(&proc);
return ret;
}