From: Emily Shaffer <emilyshaffer@google.com>
To: git@vger.kernel.org
Cc: Emily Shaffer <emilyshaffer@google.com>
Subject: [PATCH 13/17] receive-pack: convert 'update' hook to hook.h
Date: Fri, 4 Dec 2020 17:49:41 -0800 [thread overview]
Message-ID: <20201205014945.1502660-14-emilyshaffer@google.com> (raw)
In-Reply-To: <20201205014945.1502660-1-emilyshaffer@google.com>
By using hook.h to invoke the 'update' hook, now hooks can be specified
in the config in addition to the hookdir.
Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
---
Documentation/githooks.txt | 2 +
builtin/receive-pack.c | 65 +++++++++++++++++++++-----------
t/t1416-ref-transaction-hooks.sh | 4 +-
3 files changed, 48 insertions(+), 23 deletions(-)
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index 3a35500132..2b3a74f249 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -359,6 +359,8 @@ The default 'update' hook, when enabled--and with
`hooks.allowunannotated` config option unset or set to false--prevents
unannotated tags to be pushed.
+Hooks executed during 'update' are run in parallel by default.
+
[[proc-receive]]
proc-receive
~~~~~~~~~~~~
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index d64a3076be..cd79ad6bdc 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -930,33 +930,56 @@ static int run_receive_hook(struct command *commands,
return status;
}
-static int run_update_hook(struct command *cmd)
+static void hook_output_to_sideband(struct strbuf *output, void *cb_data)
{
- const char *argv[5];
- struct child_process proc = CHILD_PROCESS_INIT;
- int code;
+ int keepalive_active = 0;
- argv[0] = find_hook("update");
- if (!argv[0])
- return 0;
+ if (keepalive_in_sec <= 0)
+ use_keepalive = KEEPALIVE_NEVER;
+ if (use_keepalive == KEEPALIVE_ALWAYS)
+ keepalive_active = 1;
- argv[1] = cmd->ref_name;
- argv[2] = oid_to_hex(&cmd->old_oid);
- argv[3] = oid_to_hex(&cmd->new_oid);
- argv[4] = NULL;
+ /* send a keepalive if there is no data to write */
+ if (keepalive_active && !output->len) {
+ static const char buf[] = "0005\1";
+ write_or_die(1, buf, sizeof(buf) - 1);
+ return;
+ }
- proc.no_stdin = 1;
- proc.stdout_to_stderr = 1;
- proc.err = use_sideband ? -1 : 0;
- proc.argv = argv;
- proc.trace2_hook_name = "update";
+ if (use_keepalive == KEEPALIVE_AFTER_NUL && !keepalive_active) {
+ const char *first_null = memchr(output->buf, '\0', output->len);
+ if (first_null) {
+ /* The null bit is excluded. */
+ size_t before_null = first_null - output->buf;
+ size_t after_null = output->len - (before_null + 1);
+ keepalive_active = 1;
+ send_sideband(1, 2, output->buf, before_null, use_sideband);
+ send_sideband(1, 2, first_null + 1, after_null, use_sideband);
+
+ return;
+ }
+ }
+
+ send_sideband(1, 2, output->buf, output->len, use_sideband);
+}
+
+static int run_update_hook(struct command *cmd)
+{
+ struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT_ASYNC;
+ int code;
+
+ strvec_pushl(&opt.args,
+ cmd->ref_name,
+ oid_to_hex(&cmd->old_oid),
+ oid_to_hex(&cmd->new_oid),
+ NULL);
- code = start_command(&proc);
- if (code)
- return code;
if (use_sideband)
- copy_to_sideband(proc.err, -1, NULL);
- return finish_command(&proc);
+ opt.consume_sideband = hook_output_to_sideband;
+
+ code = run_hooks("update", &opt);
+ run_hooks_opt_clear(&opt);
+ return code;
}
static struct command *find_command_by_refname(struct command *list,
diff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh
index 17f11f5cb0..28359f6099 100755
--- a/t/t1416-ref-transaction-hooks.sh
+++ b/t/t1416-ref-transaction-hooks.sh
@@ -121,10 +121,10 @@ test_expect_success 'interleaving hook calls succeed' '
EOF
cat >expect <<-EOF &&
- hooks/update refs/tags/PRE $ZERO_OID $PRE_OID
+ $(pwd)/target-repo.git/hooks/update refs/tags/PRE $ZERO_OID $PRE_OID
$(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
+ $(pwd)/target-repo.git/hooks/update refs/tags/POST $ZERO_OID $POST_OID
$(pwd)/target-repo.git/hooks/reference-transaction prepared
$(pwd)/target-repo.git/hooks/reference-transaction committed
EOF
--
2.28.0.rc0.142.g3c755180ce-goog
next prev parent reply other threads:[~2020-12-05 1:57 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-14 23:25 [PATCH] commit: use config-based hooks (config-based hooks part II) Emily Shaffer
2020-10-16 18:34 ` Junio C Hamano
2020-12-05 1:49 ` [PATCH 00/17] use config-based hooks (config-based hooks part Emily Shaffer
2020-12-05 1:49 ` [PATCH 01/17] commit: use config-based hooks Emily Shaffer
2020-12-05 1:49 ` [PATCH 02/17] am: convert applypatch hooks to use config Emily Shaffer
2020-12-05 1:49 ` [PATCH 03/17] merge: use config-based hooks for post-merge hook Emily Shaffer
2020-12-05 1:49 ` [PATCH 04/17] gc: use hook library for pre-auto-gc hook Emily Shaffer
2020-12-05 1:49 ` [PATCH 05/17] rebase: teach pre-rebase to use hook.h Emily Shaffer
2020-12-05 1:49 ` [PATCH 06/17] read-cache: convert post-index-change hook to use config Emily Shaffer
2020-12-05 1:49 ` [PATCH 07/17] receive-pack: convert push-to-checkout hook to hook.h Emily Shaffer
2020-12-05 1:49 ` [PATCH 08/17] git-p4: use 'git hook' to run hooks Emily Shaffer
2020-12-16 0:27 ` Josh Steadmon
2020-12-16 20:19 ` Emily Shaffer
2020-12-05 1:49 ` [PATCH 09/17] hooks: convert 'post-checkout' hook to hook library Emily Shaffer
2020-12-05 1:49 ` [PATCH 10/17] hook: convert 'post-rewrite' hook to config Emily Shaffer
2020-12-08 23:02 ` Josh Steadmon
2020-12-15 23:42 ` Emily Shaffer
2020-12-05 1:49 ` [PATCH 11/17] transport: convert pre-push hook to use config Emily Shaffer
2020-12-05 1:49 ` [PATCH 12/17] reference-transaction: look for hooks in config Emily Shaffer
2020-12-05 1:49 ` Emily Shaffer [this message]
2020-12-05 1:49 ` [PATCH 14/17] proc-receive: acquire hook list from hook.h Emily Shaffer
2020-12-05 1:49 ` [PATCH 15/17] post-update: use hook.h library Emily Shaffer
2020-12-05 1:49 ` [PATCH 16/17] receive-pack: convert receive hooks to hook.h Emily Shaffer
2020-12-05 1:49 ` [PATCH 17/17] run-command: stop thinking about hooks Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 00/17] use config-based hooks (config-based hooks part II) Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 01/17] commit: use config-based hooks Emily Shaffer
2021-02-01 22:08 ` Junio C Hamano
2021-03-10 19:51 ` Emily Shaffer
2021-03-10 22:36 ` Junio C Hamano
2021-02-01 23:02 ` Junio C Hamano
2021-03-10 19:39 ` Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 02/17] am: convert applypatch hooks to use config Emily Shaffer
2021-02-01 22:05 ` Junio C Hamano
2020-12-22 0:04 ` [PATCH v3 03/17] merge: use config-based hooks for post-merge hook Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 04/17] gc: use hook library for pre-auto-gc hook Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 05/17] rebase: teach pre-rebase to use hook.h Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 06/17] read-cache: convert post-index-change hook to use config Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 07/17] receive-pack: convert push-to-checkout hook to hook.h Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 08/17] git-p4: use 'git hook' to run hooks Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 09/17] hooks: convert 'post-checkout' hook to hook library Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 10/17] hook: convert 'post-rewrite' hook to config Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 11/17] transport: convert pre-push hook to use config Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 12/17] reference-transaction: look for hooks in config Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 13/17] receive-pack: convert 'update' hook to hook.h Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 14/17] proc-receive: acquire hook list from hook.h Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 15/17] post-update: use hook.h library Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 16/17] receive-pack: convert receive hooks to hook.h Emily Shaffer
2020-12-22 0:04 ` [PATCH v3 17/17] run-command: stop thinking about hooks Emily Shaffer
2020-12-28 19:59 ` [PATCH v3 00/17] use config-based hooks (config-based hooks part II) Emily Shaffer
2020-12-28 22:40 ` [PATCH v3 18/17] doc: make git-hook.txt point of truth Emily Shaffer
2020-12-28 23:15 ` Emily Shaffer
2021-02-18 22:32 ` [PATCH v3 00/17] use config-based hooks (config-based hooks part II) Josh Steadmon
2020-12-16 0:31 ` [PATCH] commit: " Josh Steadmon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201205014945.1502660-14-emilyshaffer@google.com \
--to=emilyshaffer@google.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).