testsAndMisc/.githooks/pre-commit
Krzysztof kuhy Rudnicki 3768cb6c0e fix: improve pre-commit hook to avoid formatting loop
- Auto-fix with shfmt on staged files
- Run shellcheck validation directly instead of full shell_check.sh
- Avoids shfmt -d validation after auto-formatting (prevents .orig file loop)
- Ensures consistent formatting without blocking commits
2025-11-16 21:20:23 +01:00

55 lines
1.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
repo_root=$(git rev-parse --show-toplevel)
cd "$repo_root"
printf 'Running auto-fixers and shell_check before committing...\n'
# Get list of staged shell files
mapfile -t staged_files < <(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(sh|bash|zsh)$' || true)
if [[ ${#staged_files[@]} -gt 0 ]]; then
printf 'Auto-fixing %d shell file(s)...\n' "${#staged_files[@]}"
# Auto-fix with shfmt if available
if command -v shfmt > /dev/null 2>&1; then
printf ' → Running shfmt...\n'
for file in "${staged_files[@]}"; do
if [[ -f $file ]]; then
shfmt -w "$file" 2> /dev/null || true
fi
done
fi
# Re-stage the auto-fixed files
for file in "${staged_files[@]}"; do
if [[ -f $file ]]; then
git add "$file"
fi
done
printf ' ✓ Auto-fixes applied and staged\n'
fi
printf 'Running shell_check validation...\n'
# Run shell_check to validate all checks
# Note: We only validate the staged files since we just auto-formatted them
# Validate only shellcheck, not shfmt (we already applied formatting)
mapfile -d '' -t staged_shell_files < <(git diff --cached --name-only --diff-filter=ACM -z | grep -zE '\.(sh|bash|zsh)$' || true)
if [[ ${#staged_shell_files[@]} -gt 0 ]]; then
# Run shellcheck on staged files
if command -v shellcheck > /dev/null 2>&1; then
if ! shellcheck -x -S style "${staged_shell_files[@]}" 2>&1; then
printf '\nCommit aborted: shellcheck found issues.\n' >&2
printf 'Fix the remaining problems and retry the commit.\n' >&2
exit 1
fi
fi
fi
printf 'shell_check passed. Proceeding with commit.\n'