diff --git a/.travis.yml b/.travis.yml index ca110a3073f..6be9f1f603a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,8 @@ env: - GODOT_TARGET=windows matrix: + include: + - env: STATIC_CHECKS=yes exclude: - os: linux env: GODOT_TARGET=iphone @@ -42,6 +44,9 @@ matrix: addons: apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-3.9 packages: - build-essential - scons @@ -65,6 +70,9 @@ addons: - g++-mingw-w64-x86-64 - mingw-w64 + # For style checks. + - clang-format-3.9 + before_script: - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; brew install scons; fi @@ -75,4 +83,8 @@ before_script: fi script: - - scons platform=$GODOT_TARGET CXX=$CXX openssl=builtin + - if [ "$STATIC_CHECKS" = "yes" ]; then + sh ./misc/travis/clang-format.sh; + else + scons platform=$GODOT_TARGET CXX=$CXX openssl=builtin; + fi diff --git a/misc/travis/clang-format.sh b/misc/travis/clang-format.sh new file mode 100755 index 00000000000..5ecc1b37d8e --- /dev/null +++ b/misc/travis/clang-format.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +CLANG_FORMAT=clang-format-3.9 + +if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then + # Check the whole commit range against $TRAVIS_BRANCH, the base merge branch + # We could use $TRAVIS_COMMIT_RANGE but it doesn't play well with force pushes + RANGE="$(git rev-parse $TRAVIS_BRANCH) HEAD" +else + # Test only the last commit + RANGE=HEAD +fi + +FILES=$(git diff-tree --no-commit-id --name-only -r $RANGE | grep -v thirdparty/ | grep -e "\.cpp$" -e "\.h$" -e "\.inc$") +echo "Checking files:\n$FILES" + +# create a random filename to store our generated patch +prefix="static-check-clang-format" +suffix="$(date +%s)" +patch="/tmp/$prefix-$suffix.patch" + +for file in $FILES; do + "$CLANG_FORMAT" -style=file "$file" | \ + diff -u "$file" - | \ + sed -e "1s|--- |--- a/|" -e "2s|+++ -|+++ b/$file|" >> "$patch" +done + +# if no patch has been generated all is ok, clean up the file stub and exit +if [ ! -s "$patch" ] ; then + printf "Files in this commit comply with the clang-format rules.\n" + rm -f "$patch" + exit 0 +fi + +# a patch has been created, notify the user and exit +printf "\n*** The following differences were found between the code to commit " +printf "and the clang-format rules:\n\n" +cat "$patch" +printf "\n*** Aborting, please fix your commit(s) with 'git commit --amend' or 'git rebase -i '\n" +exit 1