From e78d648178d571ca90e8f74b9099c526fd5bfe7b Mon Sep 17 00:00:00 2001 From: Romain BOULLARD Date: Wed, 28 Jan 2026 16:41:08 +0000 Subject: [PATCH] FormatChecks (#2) Reviewed-on: https://git.romainboullard.com/BigfootDev/Bigfoot/pulls/2 Co-authored-by: Romain BOULLARD Co-committed-by: Romain BOULLARD --- .gitea/workflows/ci.yml | 20 ++++- Bigfoot/Sources/Engine/touch.cpp | 2 +- .../System/Include/System/UUID/UUID.hpp | 3 - .../Sources/Utils/Include/Utils/Version.hpp | 3 +- Bigfoot/Tests/Engine/touch.cpp | 2 +- format.bat | 87 ++++++++++++++----- format.sh | 87 +++++++++++++------ 7 files changed, 148 insertions(+), 56 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 47d0701..8c52204 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -44,4 +44,22 @@ jobs: - name: Unit Tests run: | cd ./build/${{ matrix.build_type }} - xvfb-run ctest . --output-on-failure \ No newline at end of file + xvfb-run ctest . --output-on-failure + + clang-format: + runs-on: ubuntu-latest + timeout-minutes: 120 + container: + image: git.romainboullard.com/bigfootdev/linuxbigfootbuilder:main + name: "Clang Format Checks" + steps: + - name: Install Node.js + run: apt-get update && apt-get install -y nodejs + + - name: Checkout repository + uses: actions/checkout@v6 + with: + submodules: recursive + + - name: Clang Format Checks + run: chmod +x format.sh && ./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/Sources/System/Include/System/UUID/UUID.hpp b/Bigfoot/Sources/System/Include/System/UUID/UUID.hpp index cd20fca..21ff3b1 100644 --- a/Bigfoot/Sources/System/Include/System/UUID/UUID.hpp +++ b/Bigfoot/Sources/System/Include/System/UUID/UUID.hpp @@ -37,11 +37,8 @@ class UUID ~UUID() = default; - [[nodiscard]] operator std::span() const; - [[nodiscard]] operator std::string() const; - [[nodiscard]] operator bool() const; UUID& operator=(const UUID& p_uuid) = default; diff --git a/Bigfoot/Sources/Utils/Include/Utils/Version.hpp b/Bigfoot/Sources/Utils/Include/Utils/Version.hpp index be7b058..2751ec9 100644 --- a/Bigfoot/Sources/Utils/Include/Utils/Version.hpp +++ b/Bigfoot/Sources/Utils/Include/Utils/Version.hpp @@ -92,8 +92,7 @@ class Version return m_combined; } - [[nodiscard]] - operator std::string() const; + [[nodiscard]] operator std::string() const; constexpr Version& operator=(const Version& p_version) = default; 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..54d904f 100644 --- a/format.bat +++ b/format.bat @@ -1,30 +1,71 @@ @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 ( + REM Accumulate directories + 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 ( + ECHO Checking !FILE! + %FMT% --dry-run --Werror "!FILE!" 2>nul + IF ERRORLEVEL 1 ( + REM clang-format will already print diagnostics + 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..eb8f665 100644 --- a/format.sh +++ b/format.sh @@ -1,31 +1,68 @@ #!/bin/bash +set -euo pipefail -# Variable that will hold the name of the clang-format command FMT="clang-format" +MODE="" +DIRS=() +EXIT_CODE=0 -# 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 + +# 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 - 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