#!/bin/sh # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See LICENSE in the project root for license information. # # Pre-commit hook: validates clang-format on staged C/C++ files. # Generated by CMake from tools/hooks/pre-commit.in # Install with: tools\SetupClangFormat.bat # # Mode: @WSL_PRE_COMMIT_MODE@ (set WSL_PRE_COMMIT_MODE in UserConfig.cmake) # warn - report formatting issues without blocking the commit (default) # error - block the commit when formatting issues are found # fix - automatically fix formatting and re-stage files MODE="@WSL_PRE_COMMIT_MODE@" REPO_ROOT="$(git rev-parse --show-toplevel)" CLANG_FORMAT="$REPO_ROOT/tools/clang-format.exe" # --- Collect staged C/C++ source files --- STAGED=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(c|cpp|cxx|h|hpp|hxx)$') if [ -z "$STAGED" ]; then exit 0 fi # --- Verify clang-format is available --- if [ ! -f "$CLANG_FORMAT" ]; then echo "[pre-commit] clang-format not found, skipping. Run 'cmake .' to set up." exit 0 fi # --- fix mode: format in-place and re-stage --- if [ "$MODE" = "fix" ]; then echo "[pre-commit] Fixing formatting..." echo "$STAGED" | while IFS= read -r file; do "$CLANG_FORMAT" --style=file -i "$REPO_ROOT/$file" git add "$REPO_ROOT/$file" done echo "[pre-commit] Formatting applied and files re-staged." exit 0 fi # --- warn / error mode: check formatting --- echo "[pre-commit] Checking formatting (mode: $MODE)..." FILES=$(echo "$STAGED" | sed "s|^|$REPO_ROOT/|") echo "$FILES" | xargs "$CLANG_FORMAT" --style=file -Werror --dry-run 2>&1 RESULT=$? if [ $RESULT -ne 0 ]; then echo "" echo "[pre-commit] Formatting errors found. Run to fix:" echo " powershell FormatSource.ps1 -Staged \$true" if [ "$MODE" = "error" ]; then exit 1 fi echo "[pre-commit] Continuing commit (mode: warn)." else echo "[pre-commit] All checks passed." fi