#!/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'