Files
brain/tools/worktree-precommit-gate.sh

59 lines
2.4 KiB
Bash

#!/usr/bin/env bash
# tools/worktree-precommit-gate.sh — ручной прогон pre-commit гейта в worktree.
#
# Закрывает квирки #86/#97: в worktree git-хук .git/hooks/pre-commit (shared
# через worktree's gitdir pointer) не находит бинарь lefthook в PATH worktree
# и тихо пропускает все гейты (pint + larastan + pest + gitleaks protect
# --staged). Этот скрипт хардкодит абсолютный путь к lefthook.exe и явно гонит
# конфиг lefthook.yml из main checkout.
#
# Использование (из любого worktree):
# bash "/c/моя/проекты/портал crm/Документация/tools/worktree-precommit-gate.sh"
#
# Exit code: 0 если все гейты прошли, иначе ненулевой (lefthook propagate'ит).
# Запускать ДО `git commit` — git commit не вызовет lefthook автоматически в
# worktree, поэтому это явный шаг.
set -euo pipefail
MAIN_REPO="/c/моя/проекты/портал crm/Документация"
LEFTHOOK_BIN="${MAIN_REPO}/node_modules/lefthook-windows-x64/bin/lefthook.exe"
LEFTHOOK_CONFIG="${MAIN_REPO}/lefthook.yml"
if [[ ! -x "${LEFTHOOK_BIN}" ]]; then
echo "ERROR: lefthook.exe not found at: ${LEFTHOOK_BIN}" >&2
echo "Run \`npm install\` in main repo to restore." >&2
exit 2
fi
if [[ ! -f "${LEFTHOOK_CONFIG}" ]]; then
echo "ERROR: lefthook.yml not found at: ${LEFTHOOK_CONFIG}" >&2
exit 2
fi
# Auto-detect: are we in worktree or main repo?
CURRENT_TOPLEVEL="$(git rev-parse --show-toplevel 2>/dev/null || true)"
if [[ -z "${CURRENT_TOPLEVEL}" ]]; then
echo "ERROR: not inside a git work tree" >&2
exit 2
fi
# Normalize MAIN_REPO via git so trailing slashes / casing don't matter.
MAIN_REPO_NORM="$(cd "${MAIN_REPO}" && git rev-parse --show-toplevel)"
if [[ "${CURRENT_TOPLEVEL}" == "${MAIN_REPO_NORM}" ]]; then
CONTEXT="main checkout"
else
CONTEXT="worktree (${CURRENT_TOPLEVEL})"
fi
echo "[worktree-gate] context: ${CONTEXT}"
echo "[worktree-gate] lefthook: ${LEFTHOOK_BIN}"
echo "[worktree-gate] config: ${LEFTHOOK_CONFIG}"
echo "[worktree-gate] running pre-commit..."
echo
# Lefthook reads its config relative to cwd OR via -c. Use -c для надёжности
# в worktree (там lefthook.yml — это файл из main repo, не локальный).
exec "${LEFTHOOK_BIN}" -c "${LEFTHOOK_CONFIG}" run pre-commit