diff options
Diffstat (limited to 'dot_config/git/hooks/_dispatch.sh')
| -rw-r--r-- | dot_config/git/hooks/_dispatch.sh | 31 |
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 +} |
