1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-10-28 04:49:43 +01:00

hooks: remove implicit dependency on the_repository

We implicitly depend on `the_repository` in our hook subsystem because
we use `strbuf_git_path()` to compute hook paths. Remove this dependency
by accepting a `struct repository` as parameter instead.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt 2024-08-13 11:13:28 +02:00 committed by Junio C Hamano
parent 419dbb29d8
commit 169c979771
18 changed files with 47 additions and 42 deletions

View file

@ -490,7 +490,8 @@ static int run_applypatch_msg_hook(struct am_state *state)
assert(state->msg); assert(state->msg);
if (!state->no_verify) if (!state->no_verify)
ret = run_hooks_l("applypatch-msg", am_path(state, "final-commit"), NULL); ret = run_hooks_l(the_repository, "applypatch-msg",
am_path(state, "final-commit"), NULL);
if (!ret) { if (!ret) {
FREE_AND_NULL(state->msg); FREE_AND_NULL(state->msg);
@ -512,7 +513,7 @@ static int run_post_rewrite_hook(const struct am_state *state)
strvec_push(&opt.args, "rebase"); strvec_push(&opt.args, "rebase");
opt.path_to_stdin = am_path(state, "rewritten"); opt.path_to_stdin = am_path(state, "rewritten");
return run_hooks_opt("post-rewrite", &opt); return run_hooks_opt(the_repository, "post-rewrite", &opt);
} }
/** /**
@ -1663,7 +1664,7 @@ static void do_commit(const struct am_state *state)
const char *reflog_msg, *author, *committer = NULL; const char *reflog_msg, *author, *committer = NULL;
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
if (!state->no_verify && run_hooks("pre-applypatch")) if (!state->no_verify && run_hooks(the_repository, "pre-applypatch"))
exit(1); exit(1);
if (write_index_as_tree(&tree, the_repository->index, get_index_file(), 0, NULL)) if (write_index_as_tree(&tree, the_repository->index, get_index_file(), 0, NULL))
@ -1716,7 +1717,7 @@ static void do_commit(const struct am_state *state)
fclose(fp); fclose(fp);
} }
run_hooks("post-applypatch"); run_hooks(the_repository, "post-applypatch");
free_commit_list(parents); free_commit_list(parents);
strbuf_release(&sb); strbuf_release(&sb);

View file

@ -58,7 +58,7 @@ static void get_populated_hooks(struct strbuf *hook_info, int nongit)
for (p = hook_name_list; *p; p++) { for (p = hook_name_list; *p; p++) {
const char *hook = *p; const char *hook = *p;
if (hook_exists(hook)) if (hook_exists(the_repository, hook))
strbuf_addf(hook_info, "%s\n", hook); strbuf_addf(hook_info, "%s\n", hook);
} }
} }

View file

@ -125,7 +125,7 @@ static void branch_info_release(struct branch_info *info)
static int post_checkout_hook(struct commit *old_commit, struct commit *new_commit, static int post_checkout_hook(struct commit *old_commit, struct commit *new_commit,
int changed) int changed)
{ {
return run_hooks_l("post-checkout", return run_hooks_l(the_repository, "post-checkout",
oid_to_hex(old_commit ? &old_commit->object.oid : null_oid()), oid_to_hex(old_commit ? &old_commit->object.oid : null_oid()),
oid_to_hex(new_commit ? &new_commit->object.oid : null_oid()), oid_to_hex(new_commit ? &new_commit->object.oid : null_oid()),
changed ? "1" : "0", NULL); changed ? "1" : "0", NULL);

View file

@ -788,7 +788,7 @@ static int checkout(int submodule_progress, int filter_submodules)
if (write_locked_index(the_repository->index, &lock_file, COMMIT_LOCK)) if (write_locked_index(the_repository->index, &lock_file, COMMIT_LOCK))
die(_("unable to write new index file")); die(_("unable to write new index file"));
err |= run_hooks_l("post-checkout", oid_to_hex(null_oid()), err |= run_hooks_l(the_repository, "post-checkout", oid_to_hex(null_oid()),
oid_to_hex(&oid), "1", NULL); oid_to_hex(&oid), "1", NULL);
if (!err && (option_recurse_submodules.nr > 0)) { if (!err && (option_recurse_submodules.nr > 0)) {

View file

@ -463,7 +463,7 @@ static int need_to_gc(void)
else else
return 0; return 0;
if (run_hooks("pre-auto-gc")) if (run_hooks(the_repository, "pre-auto-gc"))
return 0; return 0;
return 1; return 1;
} }

View file

@ -58,7 +58,7 @@ static int run(int argc, const char **argv, const char *prefix)
hook_name = argv[0]; hook_name = argv[0];
if (!ignore_missing) if (!ignore_missing)
opt.error_if_missing = 1; opt.error_if_missing = 1;
ret = run_hooks_opt(hook_name, &opt); ret = run_hooks_opt(the_repository, hook_name, &opt);
if (ret < 0) /* error() return */ if (ret < 0) /* error() return */
ret = 1; ret = 1;
return ret; return ret;

View file

@ -478,7 +478,7 @@ static void finish(struct commit *head_commit,
} }
/* Run a post-merge hook */ /* Run a post-merge hook */
run_hooks_l("post-merge", squash ? "1" : "0", NULL); run_hooks_l(the_repository, "post-merge", squash ? "1" : "0", NULL);
if (new_head) if (new_head)
apply_autostash_ref(the_repository, "MERGE_AUTOSTASH"); apply_autostash_ref(the_repository, "MERGE_AUTOSTASH");

View file

@ -1774,7 +1774,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
/* If a hook exists, give it a chance to interrupt*/ /* If a hook exists, give it a chance to interrupt*/
if (!ok_to_skip_pre_rebase && if (!ok_to_skip_pre_rebase &&
run_hooks_l("pre-rebase", options.upstream_arg, run_hooks_l(the_repository, "pre-rebase", options.upstream_arg,
argc ? argv[0] : NULL, NULL)) argc ? argv[0] : NULL, NULL))
die(_("The pre-rebase hook refused to rebase.")); die(_("The pre-rebase hook refused to rebase."));

View file

@ -792,7 +792,7 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed,
struct child_process proc = CHILD_PROCESS_INIT; struct child_process proc = CHILD_PROCESS_INIT;
struct async muxer; struct async muxer;
int code; int code;
const char *hook_path = find_hook(hook_name); const char *hook_path = find_hook(the_repository, hook_name);
if (!hook_path) if (!hook_path)
return 0; return 0;
@ -922,7 +922,7 @@ static int run_update_hook(struct command *cmd)
{ {
struct child_process proc = CHILD_PROCESS_INIT; struct child_process proc = CHILD_PROCESS_INIT;
int code; int code;
const char *hook_path = find_hook("update"); const char *hook_path = find_hook(the_repository, "update");
if (!hook_path) if (!hook_path)
return 0; return 0;
@ -1098,7 +1098,7 @@ static int run_proc_receive_hook(struct command *commands,
int hook_use_push_options = 0; int hook_use_push_options = 0;
int version = 0; int version = 0;
int code; int code;
const char *hook_path = find_hook("proc-receive"); const char *hook_path = find_hook(the_repository, "proc-receive");
if (!hook_path) { if (!hook_path) {
rp_error("cannot find hook 'proc-receive'"); rp_error("cannot find hook 'proc-receive'");
@ -1409,7 +1409,7 @@ static const char *push_to_checkout(unsigned char *hash,
strvec_pushf(env, "GIT_WORK_TREE=%s", absolute_path(work_tree)); strvec_pushf(env, "GIT_WORK_TREE=%s", absolute_path(work_tree));
strvec_pushv(&opt.env, env->v); strvec_pushv(&opt.env, env->v);
strvec_push(&opt.args, hash_to_hex(hash)); strvec_push(&opt.args, hash_to_hex(hash));
if (run_hooks_opt(push_to_checkout_hook, &opt)) if (run_hooks_opt(the_repository, push_to_checkout_hook, &opt))
return "push-to-checkout hook declined"; return "push-to-checkout hook declined";
else else
return NULL; return NULL;
@ -1618,7 +1618,7 @@ static void run_update_post_hook(struct command *commands)
struct child_process proc = CHILD_PROCESS_INIT; struct child_process proc = CHILD_PROCESS_INIT;
const char *hook; const char *hook;
hook = find_hook("post-update"); hook = find_hook(the_repository, "post-update");
if (!hook) if (!hook)
return; return;

View file

@ -573,7 +573,7 @@ static int add_worktree(const char *path, const char *refname,
NULL); NULL);
opt.dir = path; opt.dir = path;
ret = run_hooks_opt("post-checkout", &opt); ret = run_hooks_opt(the_repository, "post-checkout", &opt);
} }
strvec_clear(&child_env); strvec_clear(&child_env);

View file

@ -1960,5 +1960,5 @@ int run_commit_hook(int editor_is_used, const char *index_file,
va_end(args); va_end(args);
opt.invoked_hook = invoked_hook; opt.invoked_hook = invoked_hook;
return run_hooks_opt(name, &opt); return run_hooks_opt(the_repository, name, &opt);
} }

21
hook.c
View file

@ -10,14 +10,14 @@
#include "environment.h" #include "environment.h"
#include "setup.h" #include "setup.h"
const char *find_hook(const char *name) const char *find_hook(struct repository *r, const char *name)
{ {
static struct strbuf path = STRBUF_INIT; static struct strbuf path = STRBUF_INIT;
int found_hook; int found_hook;
strbuf_reset(&path); strbuf_reset(&path);
strbuf_git_path(&path, "hooks/%s", name); strbuf_repo_git_path(&path, r, "hooks/%s", name);
found_hook = access(path.buf, X_OK) >= 0; found_hook = access(path.buf, X_OK) >= 0;
#ifdef STRIP_EXTENSION #ifdef STRIP_EXTENSION
if (!found_hook) { if (!found_hook) {
@ -48,9 +48,9 @@ const char *find_hook(const char *name)
return path.buf; return path.buf;
} }
int hook_exists(const char *name) int hook_exists(struct repository *r, const char *name)
{ {
return !!find_hook(name); return !!find_hook(r, name);
} }
static int pick_next_hook(struct child_process *cp, static int pick_next_hook(struct child_process *cp,
@ -121,7 +121,8 @@ static void run_hooks_opt_clear(struct run_hooks_opt *options)
strvec_clear(&options->args); strvec_clear(&options->args);
} }
int run_hooks_opt(const char *hook_name, struct run_hooks_opt *options) int run_hooks_opt(struct repository *r, const char *hook_name,
struct run_hooks_opt *options)
{ {
struct strbuf abs_path = STRBUF_INIT; struct strbuf abs_path = STRBUF_INIT;
struct hook_cb_data cb_data = { struct hook_cb_data cb_data = {
@ -129,7 +130,7 @@ int run_hooks_opt(const char *hook_name, struct run_hooks_opt *options)
.hook_name = hook_name, .hook_name = hook_name,
.options = options, .options = options,
}; };
const char *const hook_path = find_hook(hook_name); const char *const hook_path = find_hook(r, hook_name);
int ret = 0; int ret = 0;
const struct run_process_parallel_opts opts = { const struct run_process_parallel_opts opts = {
.tr2_category = "hook", .tr2_category = "hook",
@ -173,14 +174,14 @@ int run_hooks_opt(const char *hook_name, struct run_hooks_opt *options)
return ret; return ret;
} }
int run_hooks(const char *hook_name) int run_hooks(struct repository *r, const char *hook_name)
{ {
struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT; struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
return run_hooks_opt(hook_name, &opt); return run_hooks_opt(r, hook_name, &opt);
} }
int run_hooks_l(const char *hook_name, ...) int run_hooks_l(struct repository *r, const char *hook_name, ...)
{ {
struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT; struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
va_list ap; va_list ap;
@ -191,5 +192,5 @@ int run_hooks_l(const char *hook_name, ...)
strvec_push(&opt.args, arg); strvec_push(&opt.args, arg);
va_end(ap); va_end(ap);
return run_hooks_opt(hook_name, &opt); return run_hooks_opt(r, hook_name, &opt);
} }

13
hook.h
View file

@ -2,6 +2,8 @@
#define HOOK_H #define HOOK_H
#include "strvec.h" #include "strvec.h"
struct repository;
struct run_hooks_opt struct run_hooks_opt
{ {
/* Environment vars to be set for each hook */ /* Environment vars to be set for each hook */
@ -55,12 +57,12 @@ struct hook_cb_data {
* or disabled. Note that this points to static storage that will be * or disabled. Note that this points to static storage that will be
* overwritten by further calls to find_hook and run_hook_*. * overwritten by further calls to find_hook and run_hook_*.
*/ */
const char *find_hook(const char *name); const char *find_hook(struct repository *r, const char *name);
/** /**
* A boolean version of find_hook() * A boolean version of find_hook()
*/ */
int hook_exists(const char *hookname); int hook_exists(struct repository *r, const char *hookname);
/** /**
* Takes a `hook_name`, resolves it to a path with find_hook(), and * Takes a `hook_name`, resolves it to a path with find_hook(), and
@ -70,13 +72,14 @@ int hook_exists(const char *hookname);
* Returns the status code of the run hook, or a negative value on * Returns the status code of the run hook, or a negative value on
* error(). * error().
*/ */
int run_hooks_opt(const char *hook_name, struct run_hooks_opt *options); int run_hooks_opt(struct repository *r, const char *hook_name,
struct run_hooks_opt *options);
/** /**
* A wrapper for run_hooks_opt() which provides a dummy "struct * A wrapper for run_hooks_opt() which provides a dummy "struct
* run_hooks_opt" initialized with "RUN_HOOKS_OPT_INIT". * run_hooks_opt" initialized with "RUN_HOOKS_OPT_INIT".
*/ */
int run_hooks(const char *hook_name); int run_hooks(struct repository *r, const char *hook_name);
/** /**
* Like run_hooks(), a wrapper for run_hooks_opt(). * Like run_hooks(), a wrapper for run_hooks_opt().
@ -87,5 +90,5 @@ int run_hooks(const char *hook_name);
* hook. This function behaves like the old run_hook_le() API. * hook. This function behaves like the old run_hook_le() API.
*/ */
LAST_ARG_MUST_BE_NULL LAST_ARG_MUST_BE_NULL
int run_hooks_l(const char *hook_name, ...); int run_hooks_l(struct repository *r, const char *hook_name, ...);
#endif #endif

View file

@ -3156,9 +3156,9 @@ static int do_write_locked_index(struct index_state *istate,
else else
ret = close_lock_file_gently(lock); ret = close_lock_file_gently(lock);
run_hooks_l("post-index-change", run_hooks_l(the_repository, "post-index-change",
istate->updated_workdir ? "1" : "0", istate->updated_workdir ? "1" : "0",
istate->updated_skipworktree ? "1" : "0", NULL); istate->updated_skipworktree ? "1" : "0", NULL);
istate->updated_workdir = 0; istate->updated_workdir = 0;
istate->updated_skipworktree = 0; istate->updated_skipworktree = 0;

2
refs.c
View file

@ -2132,7 +2132,7 @@ static int run_transaction_hook(struct ref_transaction *transaction,
const char *hook; const char *hook;
int ret = 0, i; int ret = 0, i;
hook = find_hook("reference-transaction"); hook = find_hook(transaction->ref_store->repo, "reference-transaction");
if (!hook) if (!hook)
return ret; return ret;

View file

@ -79,7 +79,7 @@ static int update_refs(const struct reset_head_opts *opts,
reflog_head); reflog_head);
} }
if (!ret && run_hook) if (!ret && run_hook)
run_hooks_l("post-checkout", run_hooks_l(the_repository, "post-checkout",
oid_to_hex(head ? head : null_oid()), oid_to_hex(head ? head : null_oid()),
oid_to_hex(oid), "1", NULL); oid_to_hex(oid), "1", NULL);
strbuf_release(&msg); strbuf_release(&msg);

View file

@ -1316,7 +1316,7 @@ static int run_rewrite_hook(const struct object_id *oldoid,
struct child_process proc = CHILD_PROCESS_INIT; struct child_process proc = CHILD_PROCESS_INIT;
int code; int code;
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
const char *hook_path = find_hook("post-rewrite"); const char *hook_path = find_hook(the_repository, "post-rewrite");
if (!hook_path) if (!hook_path)
return 0; return 0;
@ -1614,7 +1614,7 @@ static int try_to_commit(struct repository *r,
} }
} }
if (hook_exists("prepare-commit-msg")) { if (hook_exists(r, "prepare-commit-msg")) {
res = run_prepare_commit_msg_hook(r, msg, hook_commit); res = run_prepare_commit_msg_hook(r, msg, hook_commit);
if (res) if (res)
goto out; goto out;
@ -5149,7 +5149,7 @@ static int pick_commits(struct repository *r,
hook_opt.path_to_stdin = rebase_path_rewritten_list(); hook_opt.path_to_stdin = rebase_path_rewritten_list();
strvec_push(&hook_opt.args, "rebase"); strvec_push(&hook_opt.args, "rebase");
run_hooks_opt("post-rewrite", &hook_opt); run_hooks_opt(r, "post-rewrite", &hook_opt);
} }
apply_autostash(rebase_path_autostash()); apply_autostash(rebase_path_autostash());

View file

@ -1271,7 +1271,7 @@ static int run_pre_push_hook(struct transport *transport,
struct ref *r; struct ref *r;
struct child_process proc = CHILD_PROCESS_INIT; struct child_process proc = CHILD_PROCESS_INIT;
struct strbuf buf; struct strbuf buf;
const char *hook_path = find_hook("pre-push"); const char *hook_path = find_hook(the_repository, "pre-push");
if (!hook_path) if (!hook_path)
return 0; return 0;