]> git.ipfire.org Git - thirdparty/git.git/commitdiff
hooks: remove implicit dependency on `the_repository`
authorPatrick Steinhardt <ps@pks.im>
Tue, 13 Aug 2024 09:13:28 +0000 (11:13 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Aug 2024 17:01:01 +0000 (10:01 -0700)
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>
18 files changed:
builtin/am.c
builtin/bugreport.c
builtin/checkout.c
builtin/clone.c
builtin/gc.c
builtin/hook.c
builtin/merge.c
builtin/rebase.c
builtin/receive-pack.c
builtin/worktree.c
commit.c
hook.c
hook.h
read-cache.c
refs.c
reset.c
sequencer.c
transport.c

index a12be088f7b7e566af6f62cf0d8ba8ac8076b554..d8875ad40229c1e33078f26f7e794d86a00ee741 100644 (file)
@@ -490,7 +490,8 @@ static int run_applypatch_msg_hook(struct am_state *state)
        assert(state->msg);
 
        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) {
                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");
        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;
        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);
 
        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);
        }
 
-       run_hooks("post-applypatch");
+       run_hooks(the_repository, "post-applypatch");
 
        free_commit_list(parents);
        strbuf_release(&sb);
index b3cc77af53793f49a4d10fe9e3257370ef2ea871..bdfed3d8f188c089be10dbdb1fd6b6294114fac3 100644 (file)
@@ -58,7 +58,7 @@ static void get_populated_hooks(struct strbuf *hook_info, int nongit)
        for (p = hook_name_list; *p; p++) {
                const char *hook = *p;
 
-               if (hook_exists(hook))
+               if (hook_exists(the_repository, hook))
                        strbuf_addf(hook_info, "%s\n", hook);
        }
 }
index 0f21ddd2c6a9eab58bb8e22d02291510f633e952..89543b3054a7b101a6999588c6f8171ddfaa18ad 100644 (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,
                              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(new_commit ? &new_commit->object.oid : null_oid()),
                           changed ? "1" : "0", NULL);
index af6017d41a3de8a57a9531d3802ee6f2eb83bd36..29d4b79eb5dc5371c47ef6e971be9805f7a054f8 100644 (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))
                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);
 
        if (!err && (option_recurse_submodules.nr > 0)) {
index 72bac2554fc4b9c26140cdfc10100db6b5dd6774..2ca6288c6bd9150c1c65521ae8670dd3970d6d22 100644 (file)
@@ -463,7 +463,7 @@ static int need_to_gc(void)
        else
                return 0;
 
-       if (run_hooks("pre-auto-gc"))
+       if (run_hooks(the_repository, "pre-auto-gc"))
                return 0;
        return 1;
 }
index 5234693a94b40e2a6dd7aa4a8d724f0ac7b06a3b..cc37438fdee10e0375bd26a931b88db3a852404d 100644 (file)
@@ -58,7 +58,7 @@ static int run(int argc, const char **argv, const char *prefix)
        hook_name = argv[0];
        if (!ignore_missing)
                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 */
                ret = 1;
        return ret;
index c896b18d1a95713d04c6146736b75a669ef713e0..662a49a0e8c303f763012180df75cb6150880f60 100644 (file)
@@ -478,7 +478,7 @@ static void finish(struct commit *head_commit,
        }
 
        /* 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)
                apply_autostash_ref(the_repository, "MERGE_AUTOSTASH");
index e3a8e74cfc25c89243397f62e3b09b8165c3ed6b..fa0ca613e1b6e8504f720e1b26e76513cb3edac7 100644 (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 (!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))
                die(_("The pre-rebase hook refused to rebase."));
 
index 339524ae2a891ccc6d691843062720d95ee2613d..4ff22d8b15c0ab75feb20037d4803a5539db31ba 100644 (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 async muxer;
        int code;
-       const char *hook_path = find_hook(hook_name);
+       const char *hook_path = find_hook(the_repository, hook_name);
 
        if (!hook_path)
                return 0;
@@ -922,7 +922,7 @@ static int run_update_hook(struct command *cmd)
 {
        struct child_process proc = CHILD_PROCESS_INIT;
        int code;
-       const char *hook_path = find_hook("update");
+       const char *hook_path = find_hook(the_repository, "update");
 
        if (!hook_path)
                return 0;
@@ -1098,7 +1098,7 @@ static int run_proc_receive_hook(struct command *commands,
        int hook_use_push_options = 0;
        int version = 0;
        int code;
-       const char *hook_path = find_hook("proc-receive");
+       const char *hook_path = find_hook(the_repository, "proc-receive");
 
        if (!hook_path) {
                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_pushv(&opt.env, env->v);
        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";
        else
                return NULL;
@@ -1618,7 +1618,7 @@ static void run_update_post_hook(struct command *commands)
        struct child_process proc = CHILD_PROCESS_INIT;
        const char *hook;
 
-       hook = find_hook("post-update");
+       hook = find_hook(the_repository, "post-update");
        if (!hook)
                return;
 
index 1d51e54fcdc189ef6457991f8f47016c7e56a9e0..a4b7f24e1ed1f457cfcca2276c5db34d74cf5db0 100644 (file)
@@ -573,7 +573,7 @@ done:
                             NULL);
                opt.dir = path;
 
-               ret = run_hooks_opt("post-checkout", &opt);
+               ret = run_hooks_opt(the_repository, "post-checkout", &opt);
        }
 
        strvec_clear(&child_env);
index 087cb19f4f84f353db26289f97d72f91578fd8c3..24ab5c1b50939c31a9f586f40d475252ebac4565 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -1960,5 +1960,5 @@ int run_commit_hook(int editor_is_used, const char *index_file,
        va_end(args);
 
        opt.invoked_hook = invoked_hook;
-       return run_hooks_opt(name, &opt);
+       return run_hooks_opt(the_repository, name, &opt);
 }
diff --git a/hook.c b/hook.c
index 7e90787bca4f7c527175b69f7f912caa85d744f8..a9320cb0ce95e5fbd688d6b883d0633248092c39 100644 (file)
--- a/hook.c
+++ b/hook.c
 #include "environment.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;
 
        int found_hook;
 
        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;
 #ifdef STRIP_EXTENSION
        if (!found_hook) {
@@ -48,9 +48,9 @@ const char *find_hook(const char *name)
        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,
@@ -121,7 +121,8 @@ static void run_hooks_opt_clear(struct run_hooks_opt *options)
        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 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,
                .options = options,
        };
-       const char *const hook_path = find_hook(hook_name);
+       const char *const hook_path = find_hook(r, hook_name);
        int ret = 0;
        const struct run_process_parallel_opts opts = {
                .tr2_category = "hook",
@@ -173,14 +174,14 @@ cleanup:
        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;
 
-       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;
        va_list ap;
@@ -191,5 +192,5 @@ int run_hooks_l(const char *hook_name, ...)
                strvec_push(&opt.args, arg);
        va_end(ap);
 
-       return run_hooks_opt(hook_name, &opt);
+       return run_hooks_opt(r, hook_name, &opt);
 }
diff --git a/hook.h b/hook.h
index 6511525aebb77bb2cef099077cd0b85091e9ed32..11863fa7347e6f8f819de95aec99d132aea7e62f 100644 (file)
--- a/hook.h
+++ b/hook.h
@@ -2,6 +2,8 @@
 #define HOOK_H
 #include "strvec.h"
 
+struct repository;
+
 struct run_hooks_opt
 {
        /* 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
  * 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()
  */
-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
@@ -70,13 +72,14 @@ int hook_exists(const char *hookname);
  * Returns the status code of the run hook, or a negative value on
  * 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
  * 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().
@@ -87,5 +90,5 @@ int run_hooks(const char *hook_name);
  * hook. This function behaves like the old run_hook_le() API.
  */
 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
index 48bf24f87c00c15e5a4b249b26eabc624546f901..742369b295f86c2244a8a2db043ed16fea5686d2 100644 (file)
@@ -3156,9 +3156,9 @@ static int do_write_locked_index(struct index_state *istate,
        else
                ret = close_lock_file_gently(lock);
 
-       run_hooks_l("post-index-change",
-                       istate->updated_workdir ? "1" : "0",
-                       istate->updated_skipworktree ? "1" : "0", NULL);
+       run_hooks_l(the_repository, "post-index-change",
+                   istate->updated_workdir ? "1" : "0",
+                   istate->updated_skipworktree ? "1" : "0", NULL);
        istate->updated_workdir = 0;
        istate->updated_skipworktree = 0;
 
diff --git a/refs.c b/refs.c
index e082fc59b0ef323ec5116d85db1a4452d8efa1f2..0afc70b51b1e80bd8f617b778bacd57f98a840bf 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -2132,7 +2132,7 @@ static int run_transaction_hook(struct ref_transaction *transaction,
        const char *hook;
        int ret = 0, i;
 
-       hook = find_hook("reference-transaction");
+       hook = find_hook(transaction->ref_store->repo, "reference-transaction");
        if (!hook)
                return ret;
 
diff --git a/reset.c b/reset.c
index 9550dea03d9d80f8832f05be7a517babbba5d795..b22b1be792d03104d5f736c5e7e695fb946a61ae 100644 (file)
--- a/reset.c
+++ b/reset.c
@@ -79,7 +79,7 @@ static int update_refs(const struct reset_head_opts *opts,
                                                 reflog_head);
        }
        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(oid), "1", NULL);
        strbuf_release(&msg);
index 0291920f0b753fe30eb6c6e456017d4f9cc43607..edeeec6f15b01a8373d57867d65f8007af81b237 100644 (file)
@@ -1316,7 +1316,7 @@ static int run_rewrite_hook(const struct object_id *oldoid,
        struct child_process proc = CHILD_PROCESS_INIT;
        int code;
        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)
                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);
                if (res)
                        goto out;
@@ -5149,7 +5149,7 @@ cleanup_head_ref:
 
                        hook_opt.path_to_stdin = rebase_path_rewritten_list();
                        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());
 
index 12cc5b4d9676a5b3be166f1d33e5b6616073da93..f8cd2810a56faba23935e5ce37407f5eb71aee67 100644 (file)
@@ -1271,7 +1271,7 @@ static int run_pre_push_hook(struct transport *transport,
        struct ref *r;
        struct child_process proc = CHILD_PROCESS_INIT;
        struct strbuf buf;
-       const char *hook_path = find_hook("pre-push");
+       const char *hook_path = find_hook(the_repository, "pre-push");
 
        if (!hook_path)
                return 0;