diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 16363c9..2e63796 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -62,4 +62,4 @@ jobs: submodules: recursive - name: Clang Format Checks - run: chmod +x format.sh && ./format.sh Bigfoot checker \ No newline at end of file + run: ./format.sh --check Bigfoot \ No newline at end of file diff --git a/Bigfoot/Sources/Engine/touch.cpp b/Bigfoot/Sources/Engine/touch.cpp index 96884b8..cc4afd9 100644 --- a/Bigfoot/Sources/Engine/touch.cpp +++ b/Bigfoot/Sources/Engine/touch.cpp @@ -1 +1 @@ -// to delete when an actual source is in Engine \ No newline at end of file +// to delete when an actual source is in Engine diff --git a/Bigfoot/Tests/Engine/touch.cpp b/Bigfoot/Tests/Engine/touch.cpp index 70d2a47..38a47cf 100644 --- a/Bigfoot/Tests/Engine/touch.cpp +++ b/Bigfoot/Tests/Engine/touch.cpp @@ -1 +1 @@ -// to delete when an actual test is in EngineTests \ No newline at end of file +// to delete when an actual test is in EngineTests diff --git a/format.bat b/format.bat index afc89f1..d9f5f51 100644 --- a/format.bat +++ b/format.bat @@ -1,30 +1,74 @@ @echo off -REM Variable that will hold the name of the clang-format command +SETLOCAL ENABLEDELAYEDEXPANSION + +REM ========================= +REM Variables +REM ========================= SET FMT=clang-format +SET MODE= +SET EXIT_CODE=0 -REM Function to format files -:format -for /r %%f in (*.h *.hpp *.m *.mm *.c *.cpp) do ( - echo %%~nxf | findstr /i "_generated$" >nul - if errorlevel 1 ( - echo format %%f - %FMT% -i "%%f" +REM ========================= +REM Parse arguments +REM ========================= +:parse_args +IF "%~1"=="" GOTO end_parse_args +IF "%~1"=="--check" ( + SET MODE=check +) ELSE IF "%~1"=="--fix" ( + SET MODE=fix +) ELSE ( + SET DIRS=!DIRS! "%~1" +) +SHIFT +GOTO parse_args +:end_parse_args + +IF "%MODE%"=="" ( + ECHO Usage: %~nx0 --check|--fix [ ...] + EXIT /B 1 +) + +IF "%DIRS%"=="" ( + ECHO Please provide at least one directory. + EXIT /B 1 +) + +REM ========================= +REM Iterate over directories +REM ========================= +FOR %%D IN (%DIRS%) DO ( + IF NOT EXIST "%%~D" ( + ECHO %%~D is not a valid directory. + SET EXIT_CODE=1 + GOTO :continue_dirs ) -) -echo ~~~ %1 Done ~~~ -exit /b -REM Check if argument is provided -if "%1"=="" ( - echo Please provide a directory as an argument. - exit /b + REM Recursively find source files + FOR /R "%%~D" %%F IN (*.h *.hpp *.c *.cpp *.m *.mm) DO ( + SET FILE=%%F + REM Skip *_generated* files + ECHO !FILE! | FINDSTR /I "_generated" >nul + IF ERRORLEVEL 1 ( + IF "%MODE%"=="fix" ( + ECHO Formatting !FILE! + %FMT% -i "!FILE!" + ) ELSE ( + REM Check mode: run clang-format --dry-run --Werror + %FMT% --dry-run --Werror "!FILE!" 2>nul + IF ERRORLEVEL 1 ( + REM clang-format will already print diagnostic + ECHO --- Diff for !FILE! --- + REM Generate diff using fc + %FMT% "!FILE!" > "%TEMP%\fmt.tmp" + fc "!FILE!" "%TEMP%\fmt.tmp" + SET EXIT_CODE=1 + ) + ) + ) + ) + + :continue_dirs ) -REM Check if directory exists -if not exist "%1" ( - echo %1 is not a valid directory. - exit /b -) - -cd %1 -call :format +EXIT /B %EXIT_CODE% diff --git a/format.sh b/format.sh index 5023e12..ff50922 100644 --- a/format.sh +++ b/format.sh @@ -1,31 +1,63 @@ #!/bin/bash +set -euo pipefail -# Variable that will hold the name of the clang-format command FMT="clang-format" +MODE="" +DIRS=() -# Function to format files -format() { - for f in $(find "$1" \( -name '*.h' -or -name '*.hpp' -or -name '*.m' -or -name '*.mm' -or -name '*.c' -or -name '*.cpp' \)); do - # Skip *_generated.h files - if [[ "$f" == *_generated* ]]; then - continue +# 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 - echo "format ${f}" - ${FMT} -i "${f}" - done - echo "~~~ $1 Done ~~~" -} + done < <(find "$DIR" \( -name '*.h' -o -name '*.hpp' -o -name '*.c' -o -name '*.cpp' -o -name '*.m' -o -name '*.mm' \) -print0) +done -# Check if argument is provided -if [ -z "$1" ]; then - echo "Please provide a directory as an argument." - exit 1 -fi - -# Check if directory exists -if [ ! -d "$1" ]; then - echo "$1 is not a valid directory." - exit 1 -fi - -format "$1" +exit $EXIT_CODE