From 0e3f0120a8ec2996e73bb6b7b6c9d7531f7a7eb1 Mon Sep 17 00:00:00 2001
From: Yuri Kunde Schlesner <yuriks@yuriks.net>
Date: Wed, 21 Sep 2016 00:31:29 -0700
Subject: [PATCH] Fix Travis clang-format check

---
 .travis-build.sh | 46 ++++++++++++++++++++++++++++++----------------
 .travis.yml      |  2 ++
 2 files changed, 32 insertions(+), 16 deletions(-)

diff --git a/.travis-build.sh b/.travis-build.sh
index 407ea3e55..b8562cb02 100755
--- a/.travis-build.sh
+++ b/.travis-build.sh
@@ -9,23 +9,37 @@ if grep -nr '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .travis*
     exit 1
 fi
 
-for f in $(git diff --name-only --diff-filter=ACMRTUXB --cached); do
-    if ! echo "$f" | egrep -q "[.](cpp|h)$"; then
-        continue
-    fi
-    if ! echo "$f" | egrep -q "^src/"; then
-        continue
-    fi
-    d=$(diff -u "$f" <(clang-format "$f"))
-    if ! [ -z "$d" ]; then
-        echo "!!! $f not compliant to coding style, here is the fix:"
-        echo "$d"
-        fail=1
-    fi
-done
+# Only run clang-format on Linux because we don't have 4.0 on OS X images
+if [ "$TRAVIS_OS_NAME" = "linux" ]; then
+    # Default clang-format points to default 3.5 version one
+    CLANG_FORMAT=clang-format-4.0
+    $CLANG_FORMAT --version
 
-if [ "$fail" = 1 ]; then
-    exit 1
+    if [ "$TRAVIS_EVENT_TYPE" = "pull_request" ]; then
+        # Get list of every file modified in this pull request
+        files_to_lint="$(git diff --name-only --diff-filter=ACMRTUXB $TRAVIS_COMMIT_RANGE | grep '^src/[^.]*[.]\(cpp\|h\)$')"
+    else
+        # Check everything for branch pushes
+        files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
+    fi
+
+    # Turn off tracing for this because it's too verbose
+    set +x
+
+    for f in $files_to_lint; do
+        d=$(diff -u "$f" <($CLANG_FORMAT "$f"))
+        if ! [ -z "$d" ]; then
+            echo "!!! $f not compliant to coding style, here is the fix:"
+            echo "$d"
+            fail=1
+        fi
+    done
+
+    set -x
+
+    if [ "$fail" = 1 ]; then
+        exit 1
+    fi
 fi
 
 #if OS is linux or is not set
diff --git a/.travis.yml b/.travis.yml
index 69f9ef273..ea99be2c4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -17,6 +17,7 @@ addons:
   apt:
     sources:
       - ubuntu-toolchain-r-test
+      - llvm-toolchain-precise
     packages:
       - gcc-6
       - g++-6
@@ -25,6 +26,7 @@ addons:
       - xorg-dev
       - lib32stdc++6 # For CMake
       - lftp # To upload builds
+      - clang-format-4.0
 
 cache:
   directories: