#!/bin/bash set -euo pipefail FMT="clang-format" MODE="" DIRS=() EXIT_CODE=0 # ========================= # Parse arguments # ========================= for arg in "$@"; do case "$arg" in --check) MODE="check" ;; --fix) MODE="fix" ;; *) DIRS+=("$arg") ;; esac done # Ensure mode is set if [[ -z "$MODE" ]]; then echo "Usage: $0 --check|--fix [ ...]" exit 1 fi # Ensure at least one directory if [[ ${#DIRS[@]} -eq 0 ]]; then echo "Please provide at least one directory." exit 1 fi # ========================= # Process directories # ========================= for DIR in "${DIRS[@]}"; do if [[ ! -d "$DIR" ]]; then echo "$DIR is not a valid directory." EXIT_CODE=1 continue fi # Find all source files safely (null-separated) while IFS= read -r -d '' FILE; do [[ "$FILE" == *_generated* ]] && continue if [[ "$MODE" == "fix" ]]; then echo "Formatting $FILE" "$FMT" -i "$FILE" else echo "Checking $FILE" # Check mode: clang-format diagnostic only if ! "$FMT" --dry-run --Werror "$FILE"; then # clang-format prints: file:line:col: error ... EXIT_CODE=1 fi fi done < <( find "$DIR" \( -name '*.h' -o -name '*.hpp' -o -name '*.c' -o -name '*.cpp' -o -name '*.m' -o -name '*.mm' \) -print0 ) done exit $EXIT_CODE