summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/format.yml34
-rwxr-xr-xtests/test-format.sh37
2 files changed, 71 insertions, 0 deletions
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