diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml new file mode 100644 index 00000000..97ab11e4 --- /dev/null +++ b/.github/workflows/format.yml @@ -0,0 +1,34 @@ +name: Code formatting + +on: + pull_request: + branches: [ master, develop ] + +jobs: + test-format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 1000 + + - name: Configure git + run: | + git config --global user.email "-" + git config --global user.name "Autoformatter" + git fetch origin "$GITHUB_BASE_REF":"$GITHUB_BASE_REF" --depth=1000 + + - name: Install clang-format + run: | + sudo apt-get update + sudo apt-get -y install clang-format-12 + + - name: Check formatting + run: tests/test-format.sh "$GITHUB_BASE_REF" + + - name: Upload patches + uses: actions/upload-artifact@v3 + if: failure() + with: + name: Patches + path: ./*.patch diff --git a/tests/test-format.sh b/tests/test-format.sh new file mode 100755 index 00000000..9caf6de5 --- /dev/null +++ b/tests/test-format.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +set -e + +[ -z "$1" ] && exit + +basebranch=$1 + +CHANGED_FILES=$(git diff --name-only "$basebranch"...HEAD) + +CHANGED=0 + +for file in $CHANGED_FILES +do + case "$file" in + *.cpp|*.h) + echo Checking "$file" + clang-format -i "$file" + if ! git diff --quiet "$basebranch"...HEAD + then + printf "\033[31mError:\033[0m Formatting error in %s\n" "$file" + CHANGED=1 + git add "$file" + git commit -q -m "Apply clang-format to $(basename "$file")" + printf "Creating patch " + git format-patch HEAD~ + fi + esac +done + +if [ $CHANGED = 1 ] +then + printf "\033[31mError:\033[0m Issues found. You may use the patches provided as artifacts to format the code." + exit 1 +fi + +exit 0