#!/bin/bash set -euo pipefail FMT="clang-format" MODE="" DIRS=() # Parse arguments for arg in "$@"; do case "$arg" in --check) MODE="check" ;; --fix) MODE="fix" ;; *) DIRS+=("$arg") ;; esac done if [[ -z "$MODE" ]]; then echo "Usage: $0 --check|--fix [ ...]" exit 1 fi if [[ ${#DIRS[@]} -eq 0 ]]; then echo "Please provide at least one directory." exit 1 fi EXIT_CODE=0 for DIR in "${DIRS[@]}"; do if [[ ! -d "$DIR" ]]; then echo "$DIR is not a valid directory." EXIT_CODE=1 continue fi while IFS= read -r -d '' file; do [[ "$file" == *_generated* ]] && continue if [[ "$MODE" == "fix" ]]; then echo "Formatting $file" $FMT -i "$file" else # Check mode: run clang-format with dry-run and Werror # Capture stdout/stderr for diagnostic if ! $FMT --dry-run --Werror "$file"; then # clang-format will already print: # Bigfoot/Tests/System/Time.cpp:21:46: error: code should be clang-formatted [-Wclang-format-violations] # Now additionally print the diff for clarity diff_output=$(diff -u "$file" <($FMT -style=file "$file") || true) echo "$diff_output" 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