@@ -530,6 +530,9 @@ The exit status of the hook is ignored for any state except for the
cause the transaction to be aborted. The hook will not be called with
"aborted" state in that case.
+Hooks run during 'reference-transaction' will be run in parallel, unless
+hook.jobs is configured to 1.
+
push-to-checkout
~~~~~~~~~~~~~~~~
@@ -18,6 +18,7 @@
#include "strvec.h"
#include "repository.h"
#include "sigchain.h"
+#include "hook.h"
/*
* List of all available backends
@@ -2061,47 +2062,37 @@ 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;
+ 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)
- return ret;
-
- strvec_pushl(&proc.args, hook, state, NULL);
- proc.in = -1;
- proc.stdout_to_stderr = 1;
- proc.trace2_hook_name = "reference-transaction";
+ run_hooks_opt_init_async(&opt);
- ret = start_command(&proc);
- if (ret)
+ if (!hook_exists("reference-transaction", HOOKDIR_USE_CONFIG))
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;
}
@@ -125,11 +125,11 @@ test_expect_success 'interleaving hook calls succeed' '
cat >expect <<-EOF &&
hooks/update refs/tags/PRE $ZERO_OID $PRE_OID
- hooks/reference-transaction prepared
- hooks/reference-transaction committed
+ $(pwd)/target-repo.git/hooks/reference-transaction prepared
+ $(pwd)/target-repo.git/hooks/reference-transaction committed
hooks/update refs/tags/POST $ZERO_OID $POST_OID
- hooks/reference-transaction prepared
- hooks/reference-transaction committed
+ $(pwd)/target-repo.git/hooks/reference-transaction prepared
+ $(pwd)/target-repo.git/hooks/reference-transaction committed
EOF
git push ./target-repo.git PRE POST &&
By using the hook.h library, reference-transaction hooks can be specified in the config instead. The expected output of the test is not fully updated to reflect the absolute path of the hook called because the 'update' hook has not yet been converted to use hook.h. Signed-off-by: Emily Shaffer <emilyshaffer@google.com> --- Documentation/githooks.txt | 3 +++ refs.c | 43 +++++++++++++------------------- t/t1416-ref-transaction-hooks.sh | 8 +++--- 3 files changed, 24 insertions(+), 30 deletions(-)