aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/dot_config/git/hooks/_dispatch.sh
diff options
context:
space:
mode:
Diffstat (limited to 'dot_config/git/hooks/_dispatch.sh')
-rw-r--r--dot_config/git/hooks/_dispatch.sh31
1 files changed, 31 insertions, 0 deletions
diff --git a/dot_config/git/hooks/_dispatch.sh b/dot_config/git/hooks/_dispatch.sh
new file mode 100644
index 0000000..7dcd89c
--- /dev/null
+++ b/dot_config/git/hooks/_dispatch.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+# Sourced by every hook in this directory. Runs the per-repo hook of the
+# same name from `<repo-top>/.githooks/` if it exists, then returns
+# control so the calling user-level hook can do its own work after.
+#
+# Repos opt in by just dropping `.githooks/<hookname>` (executable) in
+# the working tree — no per-repo `core.hooksPath` setting, no stubs.
+# If the per-repo hook exits non-zero we abort with that status so git
+# sees the failure.
+#
+# GIT_HOOK_DISPATCHED guards against re-entry: if some legacy repo has
+# its own `.githooks/<hook>` that ends with `exec "$HOME/.config/..."`
+# (the old pattern), we won't dispatch back into it a second time.
+
+# shellcheck shell=sh
+dispatch_repo_hook() {
+ hookname=$1
+ shift
+
+ [ -n "${GIT_HOOK_DISPATCHED:-}" ] && return 0
+
+ root=$(git rev-parse --show-toplevel 2>/dev/null) || return 0
+ repo_hook="$root/.githooks/$hookname"
+ [ -x "$repo_hook" ] || return 0
+
+ GIT_HOOK_DISPATCHED=1 "$repo_hook" "$@"
+ rc=$?
+ if [ "$rc" -ne 0 ]; then
+ exit "$rc"
+ fi
+}