Add clang format & skip build if no source file modified (#5433)

* [BUILD] Add clang format + build skipping

* Add clang-format tool to check codestyle.
Warning: it check the whole modified file, not the diff part, it's why it's lazy. Please also look if rules are perfect, i take the Linux codestyle from LLVM site

Fix issue #5415

* Skip building project if no file is modified
* Fix a wrong brace to trigger LINT

* Make lint step outside of unix build scope

* Add AccessModifierOffset: -8

* Typo fix & needs compile fix

* Fix header priorities
This commit is contained in:
Loïc Blot 2017-03-25 19:12:18 +01:00 committed by GitHub
parent 5a59ad2307
commit 22567d107f
6 changed files with 68 additions and 3 deletions

12
.clang-format Normal file

@ -0,0 +1,12 @@
BasedOnStyle: LLVM
IndentWidth: 8
UseTab: Always
BreakBeforeBraces: Linux
AllowShortIfStatementsOnASingleLine: false
IndentCaseLabels: false
AccessModifierOffset: -8
IncludeCategories:
- Regex: '^".*'
Priority: 2
- Regex: '^<.*'
Priority: 1

@ -26,6 +26,10 @@ matrix:
compiler: clang compiler: clang
os: linux os: linux
dist: trusty dist: trusty
- env: COMPILER=none LINT=1
compiler: clang
os: linux
dist: trusty
- env: PLATFORM=Unix COMPILER=g++-6 - env: PLATFORM=Unix COMPILER=g++-6
compiler: gcc compiler: gcc
os: linux os: linux

@ -32,10 +32,12 @@ public:
void serialize(std::ostream &os) const; void serialize(std::ostream &os) const;
void deSerialize(std::istream &is); void deSerialize(std::istream &is);
void clear(){ void clear()
{
m_id_to_name.clear(); m_id_to_name.clear();
m_name_to_id.clear(); m_name_to_id.clear();
} }
void set(u16 id, const std::string &name){ void set(u16 id, const std::string &name){
m_id_to_name[id] = name; m_id_to_name[id] = name;
m_name_to_id[name] = id; m_name_to_id[name] = id;

@ -1,7 +1,15 @@
#!/bin/bash -e #!/bin/bash -e
echo "Preparing for $TRAVIS_COMMIT_RANGE" echo "Preparing for $TRAVIS_COMMIT_RANGE"
. util/travis/common.sh
if [[ "$LINT" == "1" ]]; then
curl http://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo add-apt-repository "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.9 main"
sudo apt-get -yq update
sudo apt-get install clang-format-3.9
exit 0
fi
. util/travis/common.sh
needs_compile || exit 0 needs_compile || exit 0
if [[ $TRAVIS_OS_NAME == "linux" ]]; then if [[ $TRAVIS_OS_NAME == "linux" ]]; then
@ -11,6 +19,7 @@ fi
if [[ $PLATFORM == "Unix" ]]; then if [[ $PLATFORM == "Unix" ]]; then
if [[ $TRAVIS_OS_NAME == "linux" ]]; then if [[ $TRAVIS_OS_NAME == "linux" ]]; then
sudo apt-get update
sudo apt-get install libirrlicht-dev cmake libbz2-dev libpng12-dev \ sudo apt-get install libirrlicht-dev cmake libbz2-dev libpng12-dev \
libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev \ libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev \
libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev \ libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev \
@ -21,6 +30,7 @@ if [[ $PLATFORM == "Unix" ]]; then
if [[ "$VALGRIND" == "1" ]]; then if [[ "$VALGRIND" == "1" ]]; then
sudo apt-get install valgrind sudo apt-get install valgrind
fi fi
else else
brew update brew update
brew install freetype gettext hiredis irrlicht jpeg leveldb libogg libvorbis luajit brew install freetype gettext hiredis irrlicht jpeg leveldb libogg libvorbis luajit

@ -1,8 +1,9 @@
#!/bin/bash -e #!/bin/bash -e
# Relative to git-repository root: # Relative to git-repository root:
TRIGGER_COMPILE_PATHS="src/|CMakeLists.txt|cmake/Modules/|util/travis/|util/buildbot/" TRIGGER_COMPILE_PATHS="src/.*\.(c|cpp|h)|CMakeLists.txt|cmake/Modules/|util/travis/|util/buildbot/"
needs_compile() { needs_compile() {
git diff --name-only $TRAVIS_COMMIT_RANGE | egrep -q "^($TRIGGER_COMPILE_PATHS)" git diff --name-only $TRAVIS_COMMIT_RANGE | egrep -q "^($TRIGGER_COMPILE_PATHS)"
} }

@ -3,21 +3,57 @@
needs_compile || exit 0 needs_compile || exit 0
function perform_lint() {
CLANG_FORMAT=clang-format-3.9
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\)$' | egrep -v '^src/(gmp|lua|jsoncpp)/' || true)"
else
# Check everything for branch pushes
files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h' | egrep -v '^src/(gmp|lua|jsoncpp)/')"
fi
local fail=0
for f in ${files_to_lint}; do
d=$(diff -u "$f" <(${CLANG_FORMAT} "$f") || true)
if ! [ -z "$d" ]; then
printf "The file %s is not compliant with the coding style:\n%s\n" "$f" "$d"
# Disable build failure at this moment as we need to have a complete MT source whitelist to check
fail=0
fi
done
if [ "$fail" = 1 ]; then
exit 1
fi
exit 0
}
if [[ "$LINT" == "1" ]]; then
# Lint with exit CI
perform_lint
fi
if [[ $PLATFORM == "Unix" ]]; then if [[ $PLATFORM == "Unix" ]]; then
mkdir -p travisbuild mkdir -p travisbuild
cd travisbuild || exit 1 cd travisbuild || exit 1
CMAKE_FLAGS='' CMAKE_FLAGS=''
if [[ $COMPILER == "g++-6" ]]; then if [[ $COMPILER == "g++-6" ]]; then
export CC=gcc-6 export CC=gcc-6
export CXX=g++-6 export CXX=g++-6
fi fi
# Clang builds with FreeType fail on Travis # Clang builds with FreeType fail on Travis
if [[ $CC == "clang" ]]; then if [[ $CC == "clang" ]]; then
CMAKE_FLAGS+=' -DENABLE_FREETYPE=FALSE' CMAKE_FLAGS+=' -DENABLE_FREETYPE=FALSE'
fi fi
if [[ $TRAVIS_OS_NAME == "osx" ]]; then if [[ $TRAVIS_OS_NAME == "osx" ]]; then
CMAKE_FLAGS+=' -DCUSTOM_GETTEXT_PATH=/usr/local/opt/gettext' CMAKE_FLAGS+=' -DCUSTOM_GETTEXT_PATH=/usr/local/opt/gettext'
fi fi
cmake -DCMAKE_BUILD_TYPE=Debug \ cmake -DCMAKE_BUILD_TYPE=Debug \
-DRUN_IN_PLACE=TRUE \ -DRUN_IN_PLACE=TRUE \
-DENABLE_GETTEXT=TRUE \ -DENABLE_GETTEXT=TRUE \