diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 855b47e9..edf03a0c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,11 +11,14 @@ jobs: - name: Update package database run: sudo apt -y update - name: Install deps - run: sudo apt -y install git make gcc-10 g++-10 ccache cmake libyaml-cpp-dev llvm-12 clang-12 libclang-12-dev libclang-cpp12-dev lcov zlib1g-dev + run: sudo apt -y install git make gcc-10 g++-10 ccache cmake libyaml-cpp-dev llvm-12 clang-12 libclang-12-dev libclang-cpp12-dev clang-format-12 lcov zlib1g-dev - name: Select g++ version run: | sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 + - name: Check code formatting + run: | + make check-formatting - name: Build and unit test run: | NUMPROC=2 CMAKE_CXX_FLAGS="--coverage -fno-inline" CMAKE_EXE_LINKER_FLAGS="-lgcov --coverage" LLVM_VERSION=12 make test diff --git a/Makefile b/Makefile index 95400d84..02ed4748 100644 --- a/Makefile +++ b/Makefile @@ -95,6 +95,10 @@ clang-format: format: docker run --rm -v $(CURDIR):/root/sources bkryza/clang-format-check:1.3 +.PHONY: check-formatting +check-formatting: + ./util/check_formatting.sh + .PHONY: iwyu_fixes iwyu_fixes: debug python3 $(shell which iwyu_tool.py) -p debug > debug/iwyu.out diff --git a/util/check_formatting.sh b/util/check_formatting.sh new file mode 100755 index 00000000..78431ad6 --- /dev/null +++ b/util/check_formatting.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +## +## util/check_formatting.sh +## +## Copyright (c) 2021-2022 Bartek Kryza +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## + +shopt -s globstar + +include_file_list() { + cat .clang-format-include | grep "^\+" | awk '{print $2}' \ + | tr [:space:] '\n' | sort | uniq +} + +ignore_file_list() { + echo $(cat .clang-format-include | grep "^\-" | awk '{print $2}') \ + $(git ls-files --others --exclude-standard --ignored) \ + | tr [:space:] '\n' | sort | uniq +} + +valid_ignore_file_list() { + echo $(include_file_list) $(ignore_file_list) \ + | tr [:space:] '\n' | sort | uniq -d +} + +effective_file_list() { + echo $(include_file_list) $(valid_ignore_file_list) \ + | tr [:space:] '\n' | sort | uniq -u +} + +GIT_STATUS=$(git diff-index --quiet HEAD --) + +EFFECTIVE_FILE_LIST=$(effective_file_list) + +if [[ ${#EFFECTIVE_FILE_LIST[@]} -eq 0 ]]; then + echo ".clang-format-include patterns did not match any files." + exit 0 +else + clang-format-12 --dry-run --Werror ${EFFECTIVE_FILE_LIST} +fi \ No newline at end of file