aboutsummaryrefslogtreecommitdiff
path: root/hook.c
diff options
context:
space:
mode:
authorAdrian Ratiu <adrian.ratiu@collabora.com>2026-02-19 00:23:49 +0200
committerJunio C Hamano <gitster@pobox.com>2026-02-19 13:23:41 -0800
commit1ecce722cdb9c42dd4c69e45e02cb850cd558ef2 (patch)
tree8bedc56c8f312ef0f22e9c900da0a86e60c0ae03 /hook.c
parent03b4043b9182bd3d36541371fa39f04d6d038286 (diff)
downloadgit-1ecce722cdb9c42dd4c69e45e02cb850cd558ef2.tar.xz
hook: allow disabling config hooks
Hooks specified via configs are always enabled, however users might want to disable them without removing from the config, like locally disabling a global hook. Add a hook.<name>.enabled config which defaults to true and can be optionally set for each configured hook. Suggested-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'hook.c')
-rw-r--r--hook.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/hook.c b/hook.c
index 8a9b405f76..35c24bf33d 100644
--- a/hook.c
+++ b/hook.c
@@ -164,6 +164,21 @@ static int hook_config_lookup_all(const char *key, const char *value,
char *old = strmap_put(&data->commands, hook_name,
xstrdup(value));
free(old);
+ } else if (!strcmp(subkey, "enabled")) {
+ switch (git_parse_maybe_bool(value)) {
+ case 0: /* disabled */
+ if (!unsorted_string_list_lookup(&data->disabled_hooks,
+ hook_name))
+ string_list_append(&data->disabled_hooks,
+ hook_name);
+ break;
+ case 1: /* enabled: undo a prior disabled entry */
+ unsorted_string_list_remove(&data->disabled_hooks,
+ hook_name);
+ break;
+ default:
+ break; /* ignore unrecognised values */
+ }
}
free(hook_name);
@@ -216,6 +231,11 @@ static void build_hook_config_map(struct repository *r, struct strmap *cache)
const char *hname = hook_names->items[i].string;
char *command;
+ /* filter out disabled hooks */
+ if (unsorted_string_list_lookup(&cb_data.disabled_hooks,
+ hname))
+ continue;
+
command = strmap_get(&cb_data.commands, hname);
if (!command)
die(_("'hook.%s.command' must be configured or "