Replace travis with github actions (#9641)
authorLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 20 Apr 2020 18:18:40 +0000 (20:18 +0200)
committerGitHub <noreply@github.com>
Mon, 20 Apr 2020 18:18:40 +0000 (20:18 +0200)
* Move outside of travis to Github actions

This will permit to have better integrated CI workflow than the previous
travis one.

22 files changed:
.github/workflows/build.yml [new file with mode: 0644]
.github/workflows/cpp_lint.yml [new file with mode: 0644]
.github/workflows/lua_lint.yml [new file with mode: 0644]
.gitlab-ci.yml
.travis.yml [deleted file]
README.md
util/buildbot/buildwin32.sh
util/buildbot/buildwin64.sh
util/ci/build.sh [new file with mode: 0755]
util/ci/clang-format-whitelist.txt [new file with mode: 0644]
util/ci/clang-tidy.sh [new file with mode: 0755]
util/ci/common.sh [new file with mode: 0644]
util/ci/lint.sh [new file with mode: 0644]
util/ci/run-clang-tidy.py [new file with mode: 0755]
util/travis/before_install.sh [deleted file]
util/travis/clang-format-whitelist.txt [deleted file]
util/travis/clangtidy.sh [deleted file]
util/travis/common.sh [deleted file]
util/travis/lint.sh [deleted file]
util/travis/run-clang-tidy.py [deleted file]
util/travis/script.sh [deleted file]
util/travis/toolchain_mingw.cmake.in [deleted file]

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644 (file)
index 0000000..0d559b1
--- /dev/null
@@ -0,0 +1,171 @@
+name: build
+
+# build on c/cpp changes or workflow changes
+on:
+  push:
+    paths:
+      - 'lib/**.[ch]'
+      - 'lib/**.cpp'
+      - 'src/**.[ch]'
+      - 'src/**.cpp'
+      - '**/CMakeLists.txt'
+      - 'cmake/Modules/**'
+      - 'util/buildbot/**'
+      - 'util/ci/**'
+      - '.github/workflows/**.yml'
+  pull_request:
+    paths:
+      - 'lib/**.[ch]'
+      - 'lib/**.cpp'
+      - 'src/**.[ch]'
+      - 'src/**.cpp'
+      - '**/CMakeLists.txt'
+      - 'cmake/Modules/**'
+      - 'util/buildbot/**'
+      - 'util/ci/**'
+      - '.github/workflows/**.yml'
+
+jobs:
+  # This is our minor gcc compiler
+  gcc_6:
+    runs-on: ubuntu-18.04
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install compiler
+        run: |
+          sudo apt-get install g++-6 gcc-6 -qyy
+          source ./util/ci/common.sh
+          install_linux_deps
+
+      - name: Build
+        run: |
+          ./util/ci/build.sh
+        env:
+          CMAKE_FLAGS: "-DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6"
+
+      - name: Test
+        run: |
+          ./bin/minetest --run-unittests
+
+  # This is the current gcc compiler (available in bionic)
+  gcc_8:
+    runs-on: ubuntu-18.04
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install compiler
+        run: |
+          sudo apt-get install g++-8 gcc-8 -qyy
+          source ./util/ci/common.sh
+          install_linux_deps
+
+      - name: Build
+        run: |
+          ./util/ci/build.sh
+        env:
+          CMAKE_FLAGS: "-DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8"
+
+      - name: Test
+        run: |
+          ./bin/minetest --run-unittests
+
+  # This is our minor clang compiler
+  clang_3_9:
+    runs-on: ubuntu-18.04
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install compiler
+        run: |
+          sudo apt-get install clang-3.9 -qyy
+          source ./util/ci/common.sh
+          install_linux_deps
+
+      - name: Build
+        run: |
+          ./util/ci/build.sh
+        env:
+          CMAKE_FLAGS: "-DCMAKE_C_COMPILER=clang-3.9 -DCMAKE_CXX_COMPILER=clang++-3.9"
+
+      - name: Test
+        run: |
+          ./bin/minetest --run-unittests
+
+  # This is the current clang version
+  clang_9:
+    runs-on: ubuntu-18.04
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install compiler
+        run: |
+          sudo apt-get install clang-9 valgrind -qyy
+          source ./util/ci/common.sh
+          install_linux_deps
+        env:
+          WITH_LUAJIT: 1
+
+      - name: Build
+        run: |
+          ./util/ci/build.sh
+        env:
+          CMAKE_FLAGS: "-DCMAKE_C_COMPILER=clang-9 -DCMAKE_CXX_COMPILER=clang++-9"
+
+      - name: Test
+        run: |
+          ./bin/minetest --run-unittests
+
+      - name: Valgrind
+        run: |
+          valgrind --leak-check=full --leak-check-heuristics=all --undef-value-errors=no --error-exitcode=9 ./bin/minetest --run-unittests
+
+          
+  # Some builds doesn't require freetype, ensure it compiled properly
+  clang_9_no_freetype:
+    runs-on: ubuntu-18.04
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install compiler
+        run: |
+          sudo apt-get install clang-9 -qyy
+          source ./util/ci/common.sh
+          install_linux_deps
+
+      - name: Build
+        run: |
+          ./util/ci/build.sh
+        env:
+          CMAKE_FLAGS: "-DCMAKE_C_COMPILER=clang-9 -DCMAKE_CXX_COMPILER=clang++-9 -DENABLE_FREETYPE=0"
+
+      - name: Test
+        run: |
+          ./bin/minetest --run-unittests
+
+  win32:
+    runs-on: ubuntu-18.04
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install compiler
+        run: |
+          wget http://minetest.kitsunemimi.pw/mingw-w64-i686_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz
+          sudo tar -xaf mingw.tar.xz -C /usr
+
+      - name: Build
+        run: |
+           EXISTING_MINETEST_DIR=$PWD ./util/buildbot/buildwin32.sh winbuild
+        env:
+          NO_MINETEST_GAME: 1
+          NO_PACKAGE: 1
+
+  win64:
+    runs-on: ubuntu-18.04
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install compiler
+        run: |
+          wget http://minetest.kitsunemimi.pw/mingw-w64-x86_64_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz
+          sudo tar -xaf mingw.tar.xz -C /usr
+          
+      - name: Build
+        run: |
+          EXISTING_MINETEST_DIR=$PWD ./util/buildbot/buildwin64.sh winbuild
+        env:
+          NO_MINETEST_GAME: 1
+          NO_PACKAGE: 1
diff --git a/.github/workflows/cpp_lint.yml b/.github/workflows/cpp_lint.yml
new file mode 100644 (file)
index 0000000..3044d51
--- /dev/null
@@ -0,0 +1,53 @@
+name: cpp_lint
+
+# lint on c/cpp changes or workflow changes
+on:
+  push:
+    paths:
+      - 'lib/**.[ch]'
+      - 'lib/**.cpp'
+      - 'src/**.[ch]'
+      - 'src/**.cpp'
+      - '**/CMakeLists.txt'
+      - 'cmake/Modules/**'
+      - 'util/ci/**'
+      - '.github/workflows/**.yml'
+  pull_request:
+    paths:
+      - 'lib/**.[ch]'
+      - 'lib/**.cpp'
+      - 'src/**.[ch]'
+      - 'src/**.cpp'
+      - '**/CMakeLists.txt'
+      - 'cmake/Modules/**'
+      - 'util/ci/**'
+      - '.github/workflows/**.yml'
+
+jobs:
+  clang_format:
+    runs-on: ubuntu-18.04
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install clang-format
+        run: |
+          sudo apt-get install ${CLANG_FORMAT} -qyy
+        env:
+          CLANG_FORMAT: clang-format-9
+      - name: Run clang-format
+        run: |
+          source ./util/ci/lint.sh
+          perform_lint
+
+  clang_tidy:
+    runs-on: ubuntu-18.04
+    steps:
+    - uses: actions/checkout@v2
+    - name: Install clang-tidy
+      run: |
+        sudo apt-get install clang-tidy-9 -qyy
+        source ./util/ci/common.sh
+        install_linux_deps
+
+    - name: Run clang-tidy
+      run: |
+        ./util/ci/clang-tidy.sh
diff --git a/.github/workflows/lua_lint.yml b/.github/workflows/lua_lint.yml
new file mode 100644 (file)
index 0000000..1b2c011
--- /dev/null
@@ -0,0 +1,32 @@
+name: lua_lint
+
+# Lint on lua changes on builtin or if workflow changed
+on:
+  push:
+    paths:
+      - 'builtin/**.lua'
+      - '.github/workflows/**.yml'
+  pull_request:
+    paths:
+      - 'builtin/**.lua'
+      - '.github/workflows/**.yml'
+
+jobs:
+  luacheck:
+    runs-on: ubuntu-18.04
+    steps:
+    - uses: actions/checkout@v2
+    - name: Install luarocks
+      run: |
+        sudo apt-get update -qyy
+        sudo apt-get install luarocks -qyy
+
+    - name: Install luarocks tools
+      run: |
+        luarocks install --local luacheck
+        luarocks install --local busted
+
+    - name: Run checks
+      run: |
+        $HOME/.luarocks/bin/luacheck builtin
+        $HOME/.luarocks/bin/busted builtin
index a3d634261140f93cd313999cc27f3196beb162c6..d03b7b6014a7cf118b5b3f2b9a5a4b10f48f9883 100644 (file)
@@ -219,7 +219,6 @@ build:fedora-24:
     - apt-get update -y
     - apt-get install -y wget xz-utils unzip git cmake gettext
     - wget -q http://minetest.kitsunemimi.pw/mingw-w64-${WIN_ARCH}_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz
-    - sed -e "s|%PREFIX%|${WIN_ARCH}-w64-mingw32|" -e "s|%ROOTPATH%|/usr/${WIN_ARCH}-w64-mingw32|" < util/travis/toolchain_mingw.cmake.in > ${TOOLCHAIN_OUTPUT}
     - tar -xaf mingw.tar.xz -C /usr
 
 .build_win_template:
@@ -256,7 +255,6 @@ build:win32:
   variables:
     NO_PACKAGE: "1"
     WIN_ARCH: "i686"
-    TOOLCHAIN_OUTPUT: "util/buildbot/toolchain_mingw.cmake"
 
 package:win32:
   extends: .package_win_template
@@ -265,7 +263,6 @@ package:win32:
   variables:
     NO_PACKAGE: "1"
     WIN_ARCH: "i686"
-    TOOLCHAIN_OUTPUT: "util/buildbot/toolchain_mingw.cmake"
 
 build:win64:
   extends: .build_win_template
@@ -274,7 +271,6 @@ build:win64:
   variables:
     NO_PACKAGE: "1"
     WIN_ARCH: "x86_64"
-    TOOLCHAIN_OUTPUT: "util/buildbot/toolchain_mingw64.cmake"
 
 package:win64:
   extends: .package_win_template
@@ -283,7 +279,6 @@ package:win64:
   variables:
     NO_PACKAGE: "1"
     WIN_ARCH: "x86_64"
-    TOOLCHAIN_OUTPUT: "util/buildbot/toolchain_mingw64.cmake"
 
 package:docker:
   stage: package
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644 (file)
index 7b224b5..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-language: cpp
-before_install: ./util/travis/before_install.sh
-script: ./util/travis/script.sh
-os: linux
-dist: bionic
-group: edge
-notifications:
-  email: false
-matrix:
-  fast_finish: true
-  include:
-
-    - env: CLANG_FORMAT=clang-format-8
-      compiler: clang
-      os: linux
-      addons:
-        apt:
-          packages: ['clang-format-8']
-
-    - name: "Builtin Luacheck and Unit Tests"
-      language: generic
-      compiler: null
-      os: linux
-      addons:
-        apt:
-          packages:
-          - luarocks
-      before_install:
-        - luarocks install --local luacheck
-        - luarocks install --local busted
-      script:
-        - $HOME/.luarocks/bin/luacheck builtin
-        - $HOME/.luarocks/bin/busted builtin
-
-    - env: CLANG_TIDY=clang-tidy-8
-      compiler: clang
-      os: linux
-      script: ./util/travis/clangtidy.sh
-      addons:
-        apt:
-          packages: ['clang-tidy-8']
-
-    - name: "MinGW cross-compiler (32-bit)"
-      env: PLATFORM=Win32
-      compiler: gcc
-      os: linux
-
-    - name: "MinGW cross-compiler (64-bit)"
-      env: PLATFORM=Win64
-      compiler: gcc
-      os: linux
-
-#    - env: PLATFORM=Unix
-#      compiler: clang
-#      os: osx
-#      osx_image: xcode8
-
-    - env: PLATFORM=Unix COMPILER=gcc-6
-      compiler: gcc
-      os: linux
-      addons:
-        apt:
-          packages: ['gcc-6', 'g++-6']
-
-    - env: PLATFORM=Unix COMPILER=gcc-8
-      compiler: gcc
-      os: linux
-      addons:
-        apt:
-          packages: ['gcc-8', 'g++-8']
-
-    - env: PLATFORM=Unix COMPILER=clang-3.9
-      compiler: clang
-      os: linux
-      addons:
-        apt:
-          packages: ['clang-3.9']
-
-    - env: PLATFORM=Unix COMPILER=clang-9
-      compiler: clang
-      os: linux
-      addons:
-        apt:
-          packages: ['clang-9']
-
-    - env: PLATFORM=Unix COMPILER=clang-9 FREETYPE=0
-      compiler: clang
-      os: linux
-      addons:
-        apt:
-          packages: ['clang-9']
-
-    - env: PLATFORM=Unix COMPILER=clang-9 VALGRIND=1
-      compiler: clang
-      os: linux
-      addons:
-        apt:
-          packages: ['valgrind', 'clang-9']
index e9065dfa70cf9639222a380dc4653ec0beb2e9aa..4c6539af79334a5309b948b9a64b6c3f1e1d25eb 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 Minetest
 ========
 
-[![Build Status](https://travis-ci.org/minetest/minetest.svg?branch=master)](https://travis-ci.org/minetest/minetest)
+![Build Status](https://github.com/minetest/minetest/workflows/validate/badge.svg)
 [![Translation status](https://hosted.weblate.org/widgets/minetest/-/svg-badge.svg)](https://hosted.weblate.org/engage/minetest/?utm_source=widget)
 [![License](https://img.shields.io/badge/license-LGPLv2.1%2B-blue.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
 
index 090ac7b0d9f08fbd84428aa475707ceee38d58bc..e62d32969b9ddc776dbe5e480e2685f9b0d0429f 100755 (executable)
@@ -86,22 +86,21 @@ cd $libdir
 # Get minetest
 cd $builddir
 if [ ! "x$EXISTING_MINETEST_DIR" = "x" ]; then
-       ln -s $EXISTING_MINETEST_DIR $CORE_NAME
+       cd /$EXISTING_MINETEST_DIR # must be absolute path
 else
        [ -d $CORE_NAME ] && (cd $CORE_NAME && git pull) || (git clone -b $CORE_BRANCH $CORE_GIT)
+       cd $CORE_NAME
 fi
-cd $CORE_NAME
 git_hash=$(git rev-parse --short HEAD)
 
 # Get minetest_game
-cd games
 if [ "x$NO_MINETEST_GAME" = "x" ]; then
+       cd games
        [ -d $GAME_NAME ] && (cd $GAME_NAME && git pull) || (git clone -b $GAME_BRANCH $GAME_GIT)
+       cd ..
 fi
-cd ../..
 
 # Build the thing
-cd $CORE_NAME
 [ -d _build ] && rm -Rf _build/
 mkdir _build
 cd _build
index b24a478d8a3da021ee8d56b7ceab99d3c40b4136..94e009c29540eb17e87e495887c34f10b626c3f4 100755 (executable)
@@ -78,22 +78,21 @@ cd $libdir
 # Get minetest
 cd $builddir
 if [ ! "x$EXISTING_MINETEST_DIR" = "x" ]; then
-       ln -s $EXISTING_MINETEST_DIR $CORE_NAME
+       cd /$EXISTING_MINETEST_DIR # must be absolute path
 else
        [ -d $CORE_NAME ] && (cd $CORE_NAME && git pull) || (git clone -b $CORE_BRANCH $CORE_GIT)
+       cd $CORE_NAME
 fi
-cd $CORE_NAME
 git_hash=$(git rev-parse --short HEAD)
 
 # Get minetest_game
-cd games
 if [ "x$NO_MINETEST_GAME" = "x" ]; then
+       cd games
        [ -d $GAME_NAME ] && (cd $GAME_NAME && git pull) || (git clone -b $GAME_BRANCH $GAME_GIT)
+       cd ..
 fi
-cd ../..
 
 # Build the thing
-cd $CORE_NAME
 [ -d _build ] && rm -Rf _build/
 mkdir _build
 cd _build
diff --git a/util/ci/build.sh b/util/ci/build.sh
new file mode 100755 (executable)
index 0000000..59069b0
--- /dev/null
@@ -0,0 +1,8 @@
+#! /bin/bash -eu
+
+mkdir cmakebuild
+cd cmakebuild
+cmake -DCMAKE_BUILD_TYPE=Debug \
+       -DRUN_IN_PLACE=TRUE -DENABLE_GETTEXT=TRUE \
+       -DBUILD_SERVER=TRUE ${CMAKE_FLAGS} ..
+make -j2
diff --git a/util/ci/clang-format-whitelist.txt b/util/ci/clang-format-whitelist.txt
new file mode 100644 (file)
index 0000000..3334257
--- /dev/null
@@ -0,0 +1,500 @@
+src/activeobject.h
+src/ban.cpp
+src/camera.cpp
+src/camera.h
+src/chat.cpp
+src/chat.h
+src/chat_interface.h
+src/client/clientlauncher.cpp
+src/client/clientlauncher.h
+src/client/sound_openal.cpp
+src/client.cpp
+src/clientenvironment.cpp
+src/clientenvironment.h
+src/client/gameui.cpp
+src/client.h
+src/client/hud.cpp
+src/client/hud.h
+src/clientiface.cpp
+src/clientiface.h
+src/client/joystick_controller.cpp
+src/client/joystick_controller.h
+src/clientmap.cpp
+src/clientmap.h
+src/clientmedia.cpp
+src/clientmedia.h
+src/clientobject.cpp
+src/clientobject.h
+src/client/render/core.cpp
+src/client/renderingengine.cpp
+src/client/render/interlaced.cpp
+src/client/render/plain.cpp
+src/client/render/sidebyside.cpp
+src/client/render/stereo.cpp
+src/client/tile.cpp
+src/client/tile.h
+src/client/fontengine.h
+src/client/clientenvironment.cpp
+src/client/mapblock_mesh.cpp
+src/client/sound_openal.h
+src/client/clouds.cpp
+src/client/fontengine.cpp
+src/client/camera.h
+src/client/hud.cpp
+src/client/clientmap.cpp
+src/client/sound_openal.cpp
+src/client/minimap.h
+src/client/content_cao.cpp
+src/client/localplayer.h
+src/client/mapblock_mesh.h
+src/client/mesh.cpp
+src/client/sound.cpp
+src/client/guiscalingfilter.cpp
+src/client/content_cso.cpp
+src/client/gameui.cpp
+src/client/wieldmesh.cpp
+src/client/clientmedia.h
+src/client/game.cpp
+src/client/keys.h
+src/client/client.h
+src/client/shader.cpp
+src/client/clientmap.h
+src/client/inputhandler.h
+src/client/content_mapblock.h
+src/client/game.h
+src/client/mesh.h
+src/client/camera.cpp
+src/client/sky.h
+src/client/mesh_generator_thread.cpp
+src/client/guiscalingfilter.h
+src/client/clientobject.cpp
+src/client/tile.cpp
+src/client/hud.h
+src/client/inputhandler.cpp
+src/client/clientevent.h
+src/client/gameui.h
+src/client/content_cso.h
+src/client/sky.cpp
+src/client/localplayer.cpp
+src/client/content_mapblock.cpp
+src/client/clientobject.h
+src/client/filecache.cpp
+src/client/particles.h
+src/client/clientenvironment.h
+src/client/imagefilters.h
+src/client/renderingengine.cpp
+src/client/tile.h
+src/client/clientmedia.cpp
+src/client/event_manager.h
+src/client/joystick_controller.h
+src/client/clouds.h
+src/client/clientlauncher.h
+src/client/content_cao.h
+src/client/minimap.cpp
+src/client/sound.h
+src/client/keycode.cpp
+src/client/particles.cpp
+src/client/joystick_controller.cpp
+src/client/keycode.h
+src/client/wieldmesh.h
+src/client/filecache.h
+src/client/shader.h
+src/client/mesh_generator_thread.h
+src/client/renderingengine.h
+src/client/client.cpp
+src/client/imagefilters.cpp
+src/client/clientlauncher.cpp
+src/clouds.cpp
+src/clouds.h
+src/collision.cpp
+src/collision.h
+src/config.h
+src/content_cao.cpp
+src/content_cao.h
+src/content_cso.cpp
+src/content_cso.h
+src/content_mapblock.cpp
+src/content_mapblock.h
+src/content_mapnode.cpp
+src/content_nodemeta.cpp
+src/content_nodemeta.h
+src/convert_json.cpp
+src/convert_json.h
+src/craftdef.cpp
+src/craftdef.h
+src/database/database.cpp
+src/database/database-dummy.cpp
+src/database/database-files.cpp
+src/database/database-leveldb.cpp
+src/database/database-postgresql.cpp
+src/database/database-postgresql.h
+src/database/database-redis.cpp
+src/database/database-sqlite3.cpp
+src/database/database-sqlite3.h
+src/daynightratio.h
+src/debug.cpp
+src/debug.h
+src/defaultsettings.cpp
+src/emerge.cpp
+src/emerge.h
+src/environment.cpp
+src/exceptions.h
+src/face_position_cache.cpp
+src/face_position_cache.h
+src/filecache.cpp
+src/filesys.cpp
+src/filesys.h
+src/fontengine.cpp
+src/fontengine.h
+src/game.cpp
+src/gamedef.h
+src/game.h
+src/gettext.cpp
+src/gettext.h
+src/gui/guiAnimatedImage.cpp
+src/gui/guiAnimatedImage.h
+src/gui/guiBackgroundImage.cpp
+src/gui/guiBackgroundImage.h
+src/gui/guiBox.cpp
+src/gui/guiBox.h
+src/gui/guiButton.cpp
+src/gui/guiButton.h
+src/gui/guiButtonImage.cpp
+src/gui/guiButtonImage.h
+src/gui/guiButtonItemImage.cpp
+src/gui/guiButtonItemImage.h
+src/gui/guiChatConsole.cpp
+src/gui/guiChatConsole.h
+src/gui/guiConfirmRegistration.cpp
+src/gui/guiEditBoxWithScrollbar.cpp
+src/gui/guiEditBoxWithScrollbar.h
+src/gui/guiEngine.cpp
+src/gui/guiEngine.h
+src/gui/guiFormSpecMenu.cpp
+src/gui/guiFormSpecMenu.h
+src/gui/guiKeyChangeMenu.cpp
+src/gui/guiHyperText.cpp
+src/gui/guiHyperText.h
+src/gui/guiInventoryList.cpp
+src/gui/guiInventoryList.h
+src/gui/guiItemImage.cpp
+src/gui/guiItemImage.h
+src/gui/guiMainMenu.h
+src/gui/guiPasswordChange.cpp
+src/gui/guiPathSelectMenu.cpp
+src/gui/guiPathSelectMenu.h
+src/gui/guiScrollBar.cpp
+src/gui/guiSkin.cpp
+src/gui/guiSkin.h
+src/gui/guiTable.cpp
+src/gui/guiTable.h
+src/gui/guiVolumeChange.cpp
+src/gui/guiVolumeChange.h
+src/gui/intlGUIEditBox.cpp
+src/gui/intlGUIEditBox.h
+src/gui/mainmenumanager.h
+src/gui/modalMenu.h
+src/guiscalingfilter.cpp
+src/guiscalingfilter.h
+src/gui/StyleSpec.h
+src/gui/touchscreengui.cpp
+src/httpfetch.cpp
+src/hud.cpp
+src/hud.h
+src/imagefilters.cpp
+src/imagefilters.h
+src/inventory.cpp
+src/inventory.h
+src/inventorymanager.cpp
+src/inventorymanager.h
+src/irrlicht_changes/CGUITTFont.cpp
+src/irrlicht_changes/CGUITTFont.h
+src/irrlicht_changes/irrUString.h
+src/irrlicht_changes/static_text.cpp
+src/irrlicht_changes/static_text.h
+src/irrlichttypes.h
+src/itemdef.cpp
+src/itemdef.h
+src/itemstackmetadata.cpp
+src/keycode.cpp
+src/light.cpp
+src/localplayer.cpp
+src/log.cpp
+src/log.h
+src/main.cpp
+src/mapblock.cpp
+src/mapblock.h
+src/mapblock_mesh.cpp
+src/mapblock_mesh.h
+src/map.cpp
+src/mapgen/cavegen.cpp
+src/mapgen/cavegen.h
+src/mapgen/dungeongen.cpp
+src/mapgen/dungeongen.h
+src/mapgen/mapgen.cpp
+src/mapgen/mapgen.h
+src/mapgen/mapgen_carpathian.cpp
+src/mapgen/mapgen_carpathian.h
+src/mapgen/mapgen_flat.cpp
+src/mapgen/mapgen_flat.h
+src/mapgen/mapgen_fractal.cpp
+src/mapgen/mapgen_fractal.h
+src/mapgen/mapgen_singlenode.cpp
+src/mapgen/mapgen_singlenode.h
+src/mapgen/mapgen_v5.cpp
+src/mapgen/mapgen_v5.h
+src/mapgen/mapgen_v6.cpp
+src/mapgen/mapgen_v6.h
+src/mapgen/mapgen_v7.cpp
+src/mapgen/mapgen_v7.h
+src/mapgen/mapgen_valleys.cpp
+src/mapgen/mapgen_valleys.h
+src/mapgen/mg_biome.cpp
+src/mapgen/mg_biome.h
+src/mapgen/mg_decoration.cpp
+src/mapgen/mg_decoration.h
+src/mapgen/mg_ore.cpp
+src/mapgen/mg_ore.h
+src/mapgen/mg_schematic.cpp
+src/mapgen/mg_schematic.h
+src/mapgen/treegen.cpp
+src/mapgen/treegen.h
+src/map.h
+src/mapnode.cpp
+src/mapnode.h
+src/mapsector.cpp
+src/mapsector.h
+src/map_settings_manager.cpp
+src/map_settings_manager.h
+src/mesh.cpp
+src/mesh_generator_thread.cpp
+src/mesh.h
+src/metadata.h
+src/minimap.cpp
+src/minimap.h
+src/mods.cpp
+src/mods.h
+src/network/address.cpp
+src/network/clientopcodes.cpp
+src/network/clientopcodes.h
+src/network/clientpackethandler.cpp
+src/network/connection.cpp
+src/network/connection.h
+src/network/connectionthreads.cpp
+src/network/networkpacket.cpp
+src/network/networkprotocol.h
+src/network/serveropcodes.cpp
+src/network/serveropcodes.h
+src/network/serverpackethandler.cpp
+src/nodedef.cpp
+src/nodedef.h
+src/nodemetadata.cpp
+src/nodemetadata.h
+src/nodetimer.cpp
+src/nodetimer.h
+src/noise.cpp
+src/noise.h
+src/objdef.cpp
+src/objdef.h
+src/object_properties.cpp
+src/object_properties.h
+src/particles.cpp
+src/particles.h
+src/pathfinder.cpp
+src/pathfinder.h
+src/player.cpp
+src/player.h
+src/porting_android.cpp
+src/porting_android.h
+src/porting.cpp
+src/porting.h
+src/profiler.h
+src/raycast.cpp
+src/raycast.h
+src/reflowscan.cpp
+src/reflowscan.h
+src/remoteplayer.cpp
+src/rollback.cpp
+src/rollback.h
+src/rollback_interface.cpp
+src/rollback_interface.h
+src/script/common/c_content.cpp
+src/script/common/c_content.h
+src/script/common/c_converter.cpp
+src/script/common/c_converter.h
+src/script/common/c_internal.cpp
+src/script/common/c_internal.h
+src/script/common/c_types.cpp
+src/script/common/c_types.h
+src/script/cpp_api/s_async.cpp
+src/script/cpp_api/s_async.h
+src/script/cpp_api/s_base.cpp
+src/script/cpp_api/s_base.h
+src/script/cpp_api/s_client.cpp
+src/script/cpp_api/s_entity.cpp
+src/script/cpp_api/s_entity.h
+src/script/cpp_api/s_env.cpp
+src/script/cpp_api/s_env.h
+src/script/cpp_api/s_internal.h
+src/script/cpp_api/s_inventory.cpp
+src/script/cpp_api/s_inventory.h
+src/script/cpp_api/s_item.cpp
+src/script/cpp_api/s_item.h
+src/script/cpp_api/s_mainmenu.h
+src/script/cpp_api/s_node.cpp
+src/script/cpp_api/s_node.h
+src/script/cpp_api/s_nodemeta.cpp
+src/script/cpp_api/s_nodemeta.h
+src/script/cpp_api/s_player.cpp
+src/script/cpp_api/s_player.h
+src/script/cpp_api/s_security.cpp
+src/script/cpp_api/s_security.h
+src/script/cpp_api/s_server.cpp
+src/script/cpp_api/s_server.h
+src/script/lua_api/l_areastore.cpp
+src/script/lua_api/l_base.cpp
+src/script/lua_api/l_base.h
+src/script/lua_api/l_client.cpp
+src/script/lua_api/l_craft.cpp
+src/script/lua_api/l_craft.h
+src/script/lua_api/l_env.cpp
+src/script/lua_api/l_env.h
+src/script/lua_api/l_http.cpp
+src/script/lua_api/l_http.h
+src/script/lua_api/l_internal.h
+src/script/lua_api/l_inventory.cpp
+src/script/lua_api/l_inventory.h
+src/script/lua_api/l_item.cpp
+src/script/lua_api/l_item.h
+src/script/lua_api/l_itemstackmeta.cpp
+src/script/lua_api/l_itemstackmeta.h
+src/script/lua_api/l_localplayer.cpp
+src/script/lua_api/l_mainmenu.cpp
+src/script/lua_api/l_mainmenu.h
+src/script/lua_api/l_mapgen.cpp
+src/script/lua_api/l_mapgen.h
+src/script/lua_api/l_metadata.cpp
+src/script/lua_api/l_minimap.cpp
+src/script/lua_api/l_nodemeta.cpp
+src/script/lua_api/l_nodemeta.h
+src/script/lua_api/l_nodetimer.cpp
+src/script/lua_api/l_noise.cpp
+src/script/lua_api/l_object.cpp
+src/script/lua_api/l_object.h
+src/script/lua_api/l_particles.cpp
+src/script/lua_api/l_particles.h
+src/script/lua_api/l_particles_local.cpp
+src/script/lua_api/l_rollback.cpp
+src/script/lua_api/l_rollback.h
+src/script/lua_api/l_server.cpp
+src/script/lua_api/l_settings.cpp
+src/script/lua_api/l_sound.cpp
+src/script/lua_api/l_storage.cpp
+src/script/lua_api/l_util.cpp
+src/script/lua_api/l_vmanip.cpp
+src/script/scripting_client.cpp
+src/script/scripting_client.h
+src/script/scripting_mainmenu.cpp
+src/script/scripting_mainmenu.h
+src/script/scripting_server.cpp
+src/script/scripting_server.h
+src/serialization.cpp
+src/serialization.h
+src/server.cpp
+src/serverenvironment.cpp
+src/serverenvironment.h
+src/server.h
+src/serverlist.cpp
+src/serverlist.h
+src/server/luaentity_sao.cpp
+src/server/player_sao.cpp
+src/server/serveractiveobject.cpp
+src/server/serveractiveobject.h
+src/settings.cpp
+src/settings.h
+src/settings_translation_file.cpp
+src/shader.cpp
+src/shader.h
+src/sky.cpp
+src/sound.cpp
+src/staticobject.cpp
+src/staticobject.h
+src/subgame.cpp
+src/subgame.h
+src/terminal_chat_console.cpp
+src/terminal_chat_console.h
+src/texture_override.cpp
+src/threading/atomic.h
+src/threading/event.cpp
+src/threading/mutex_auto_lock.h
+src/threading/mutex.cpp
+src/threading/mutex.h
+src/threading/semaphore.cpp
+src/threading/thread.cpp
+src/threading/thread.h
+src/threads.h
+src/tileanimation.cpp
+src/tileanimation.h
+src/tool.cpp
+src/tool.h
+src/translation.cpp
+src/unittest/test_areastore.cpp
+src/unittest/test_collision.cpp
+src/unittest/test_compression.cpp
+src/unittest/test_connection.cpp
+src/unittest/test.cpp
+src/unittest/test_filepath.cpp
+src/unittest/test.h
+src/unittest/test_inventory.cpp
+src/unittest/test_keycode.cpp
+src/unittest/test_map_settings_manager.cpp
+src/unittest/test_noderesolver.cpp
+src/unittest/test_noise.cpp
+src/unittest/test_random.cpp
+src/unittest/test_schematic.cpp
+src/unittest/test_serialization.cpp
+src/unittest/test_settings.cpp
+src/unittest/test_socket.cpp
+src/unittest/test_threading.cpp
+src/unittest/test_utilities.cpp
+src/unittest/test_voxelalgorithms.cpp
+src/unittest/test_voxelmanipulator.cpp
+src/util/areastore.cpp
+src/util/areastore.h
+src/util/auth.cpp
+src/util/auth.h
+src/util/base64.cpp
+src/util/base64.h
+src/util/basic_macros.h
+src/util/container.h
+src/util/directiontables.cpp
+src/util/directiontables.h
+src/util/enriched_string.cpp
+src/util/enriched_string.h
+src/util/md32_common.h
+src/util/numeric.cpp
+src/util/numeric.h
+src/util/pointedthing.cpp
+src/util/pointedthing.h
+src/util/pointer.h
+src/util/quicktune.h
+src/util/quicktune_shortcutter.h
+src/util/quicktune.cpp
+src/util/serialize.cpp
+src/util/serialize.h
+src/util/sha1.cpp
+src/util/srp.cpp
+src/util/srp.h
+src/util/strfnd.h
+src/util/string.cpp
+src/util/string.h
+src/util/thread.h
+src/util/timetaker.cpp
+src/util/timetaker.h
+src/version.cpp
+src/version.h
+src/voxelalgorithms.cpp
+src/voxelalgorithms.h
+src/voxel.cpp
+src/voxel.h
+src/wieldmesh.cpp
diff --git a/util/ci/clang-tidy.sh b/util/ci/clang-tidy.sh
new file mode 100755 (executable)
index 0000000..d048f54
--- /dev/null
@@ -0,0 +1,18 @@
+#! /bin/bash -eu
+
+mkdir -p cmakebuild
+cd cmakebuild
+cmake -DCMAKE_BUILD_TYPE=Debug \
+       -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
+       -DRUN_IN_PLACE=TRUE \
+       -DENABLE_GETTEXT=TRUE \
+       -DENABLE_SOUND=FALSE \
+       -DBUILD_SERVER=TRUE ..
+make GenerateVersion
+
+cd ..
+
+./util/ci/run-clang-tidy.py \
+       -clang-tidy-binary=clang-tidy-9 -p cmakebuild \
+       -quiet -config="$(cat .clang-tidy)" \
+       'src/.*'
diff --git a/util/ci/common.sh b/util/ci/common.sh
new file mode 100644 (file)
index 0000000..5a4f784
--- /dev/null
@@ -0,0 +1,45 @@
+#!/bin/bash -e
+
+set_linux_compiler_env() {
+       if [[ "${COMPILER}" == "gcc-6" ]]; then
+               export CC=gcc-6
+               export CXX=g++-6
+       elif [[ "${COMPILER}" == "gcc-8" ]]; then
+               export CC=gcc-8
+               export CXX=g++-8
+       elif [[ "${COMPILER}" == "clang-3.9" ]]; then
+               export CC=clang-3.9
+               export CXX=clang++-3.9
+       elif [[ "${COMPILER}" == "clang-9" ]]; then
+               export CC=clang-9
+               export CXX=clang++-9
+       fi
+}
+
+# Linux build only
+install_linux_deps() {
+       local pkgs=(libirrlicht-dev cmake libbz2-dev libpng-dev \
+               libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev \
+               libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev \
+               gettext libpq-dev postgresql-server-dev-all libleveldb-dev \
+               libcurl4-openssl-dev)
+       # for better coverage, build some jobs with luajit
+       if [ -n "$WITH_LUAJIT" ]; then
+               pkgs+=(libluajit-5.1-dev)
+       fi
+
+       sudo apt-get update
+       sudo apt-get install -y --no-install-recommends ${pkgs[@]}
+}
+
+# Mac OSX build only
+install_macosx_deps() {
+       brew update
+       brew install freetype gettext hiredis irrlicht leveldb libogg libvorbis luajit
+       if brew ls | grep -q jpeg; then
+               brew upgrade jpeg
+       else
+               brew install jpeg
+       fi
+       #brew upgrade postgresql
+}
diff --git a/util/ci/lint.sh b/util/ci/lint.sh
new file mode 100644 (file)
index 0000000..395445c
--- /dev/null
@@ -0,0 +1,43 @@
+#! /bin/bash
+function perform_lint() {
+       echo "Performing LINT..."
+       if [ -z "${CLANG_FORMAT}" ]; then
+               CLANG_FORMAT=clang-format
+       fi
+       echo "LINT: Using binary $CLANG_FORMAT"
+       CLANG_FORMAT_WHITELIST="util/ci/clang-format-whitelist.txt"
+
+       files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
+
+       local errorcount=0
+       local fail=0
+       for f in ${files_to_lint}; do
+               d=$(diff -u "$f" <(${CLANG_FORMAT} "$f") || true)
+
+               if ! [ -z "$d" ]; then
+                       whitelisted=$(awk '$1 == "'$f'" { print 1 }' "$CLANG_FORMAT_WHITELIST")
+
+                       # If file is not whitelisted, mark a failure
+                       if [ -z "${whitelisted}" ]; then
+                               errorcount=$((errorcount+1))
+
+                               printf "The file %s is not compliant with the coding style" "$f"
+                               if [ ${errorcount} -gt 50 ]; then
+                                       printf "\nToo many errors encountered previously, this diff is hidden.\n"
+                               else
+                                       printf ":\n%s\n" "$d"
+                               fi
+
+                               fail=1
+                       fi
+               fi
+       done
+
+       if [ "$fail" = 1 ]; then
+               echo "LINT reports failure."
+               exit 1
+       fi
+
+       echo "LINT OK"
+}
+
diff --git a/util/ci/run-clang-tidy.py b/util/ci/run-clang-tidy.py
new file mode 100755 (executable)
index 0000000..6ad0ff2
--- /dev/null
@@ -0,0 +1,321 @@
+#!/usr/bin/env python
+#
+#===- run-clang-tidy.py - Parallel clang-tidy runner ---------*- python -*--===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+# FIXME: Integrate with clang-tidy-diff.py
+
+"""
+Parallel clang-tidy runner
+==========================
+
+Runs clang-tidy over all files in a compilation database. Requires clang-tidy
+and clang-apply-replacements in $PATH.
+
+Example invocations.
+- Run clang-tidy on all files in the current working directory with a default
+  set of checks and show warnings in the cpp files and all project headers.
+    run-clang-tidy.py $PWD
+
+- Fix all header guards.
+    run-clang-tidy.py -fix -checks=-*,llvm-header-guard
+
+- Fix all header guards included from clang-tidy and header guards
+  for clang-tidy headers.
+    run-clang-tidy.py -fix -checks=-*,llvm-header-guard extra/clang-tidy \
+                      -header-filter=extra/clang-tidy
+
+Compilation database setup:
+http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
+"""
+
+from __future__ import print_function
+
+import argparse
+import glob
+import json
+import multiprocessing
+import os
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+import threading
+import traceback
+
+try:
+  import yaml
+except ImportError:
+  yaml = None
+
+is_py2 = sys.version[0] == '2'
+
+if is_py2:
+    import Queue as queue
+else:
+    import queue as queue
+
+def find_compilation_database(path):
+  """Adjusts the directory until a compilation database is found."""
+  result = './'
+  while not os.path.isfile(os.path.join(result, path)):
+    if os.path.realpath(result) == '/':
+      print('Error: could not find compilation database.')
+      sys.exit(1)
+    result += '../'
+  return os.path.realpath(result)
+
+
+def make_absolute(f, directory):
+  if os.path.isabs(f):
+    return f
+  return os.path.normpath(os.path.join(directory, f))
+
+
+def get_tidy_invocation(f, clang_tidy_binary, checks, tmpdir, build_path,
+                        header_filter, extra_arg, extra_arg_before, quiet,
+                        config):
+  """Gets a command line for clang-tidy."""
+  start = [clang_tidy_binary]
+  if header_filter is not None:
+    start.append('-header-filter=' + header_filter)
+  if checks:
+    start.append('-checks=' + checks)
+  if tmpdir is not None:
+    start.append('-export-fixes')
+    # Get a temporary file. We immediately close the handle so clang-tidy can
+    # overwrite it.
+    (handle, name) = tempfile.mkstemp(suffix='.yaml', dir=tmpdir)
+    os.close(handle)
+    start.append(name)
+  for arg in extra_arg:
+      start.append('-extra-arg=%s' % arg)
+  for arg in extra_arg_before:
+      start.append('-extra-arg-before=%s' % arg)
+  start.append('-p=' + build_path)
+  if quiet:
+      start.append('-quiet')
+  if config:
+      start.append('-config=' + config)
+  start.append(f)
+  return start
+
+
+def merge_replacement_files(tmpdir, mergefile):
+  """Merge all replacement files in a directory into a single file"""
+  # The fixes suggested by clang-tidy >= 4.0.0 are given under
+  # the top level key 'Diagnostics' in the output yaml files
+  mergekey="Diagnostics"
+  merged=[]
+  for replacefile in glob.iglob(os.path.join(tmpdir, '*.yaml')):
+    content = yaml.safe_load(open(replacefile, 'r'))
+    if not content:
+      continue # Skip empty files.
+    merged.extend(content.get(mergekey, []))
+
+  if merged:
+    # MainSourceFile: The key is required by the definition inside
+    # include/clang/Tooling/ReplacementsYaml.h, but the value
+    # is actually never used inside clang-apply-replacements,
+    # so we set it to '' here.
+    output = { 'MainSourceFile': '', mergekey: merged }
+    with open(mergefile, 'w') as out:
+      yaml.safe_dump(output, out)
+  else:
+    # Empty the file:
+    open(mergefile, 'w').close()
+
+
+def check_clang_apply_replacements_binary(args):
+  """Checks if invoking supplied clang-apply-replacements binary works."""
+  try:
+    subprocess.check_call([args.clang_apply_replacements_binary, '--version'])
+  except:
+    print('Unable to run clang-apply-replacements. Is clang-apply-replacements '
+          'binary correctly specified?', file=sys.stderr)
+    traceback.print_exc()
+    sys.exit(1)
+
+
+def apply_fixes(args, tmpdir):
+  """Calls clang-apply-fixes on a given directory."""
+  invocation = [args.clang_apply_replacements_binary]
+  if args.format:
+    invocation.append('-format')
+  if args.style:
+    invocation.append('-style=' + args.style)
+  invocation.append(tmpdir)
+  subprocess.call(invocation)
+
+
+def run_tidy(args, tmpdir, build_path, queue, lock, failed_files):
+  """Takes filenames out of queue and runs clang-tidy on them."""
+  while True:
+    name = queue.get()
+    invocation = get_tidy_invocation(name, args.clang_tidy_binary, args.checks,
+                                     tmpdir, build_path, args.header_filter,
+                                     args.extra_arg, args.extra_arg_before,
+                                     args.quiet, args.config)
+
+    proc = subprocess.Popen(invocation)
+    proc.wait()
+    if proc.returncode != 0:
+      failed_files.append(name)
+    queue.task_done()
+
+
+def main():
+  parser = argparse.ArgumentParser(description='Runs clang-tidy over all files '
+                                   'in a compilation database. Requires '
+                                   'clang-tidy and clang-apply-replacements in '
+                                   '$PATH.')
+  parser.add_argument('-clang-tidy-binary', metavar='PATH',
+                      default='clang-tidy',
+                      help='path to clang-tidy binary')
+  parser.add_argument('-clang-apply-replacements-binary', metavar='PATH',
+                      default='clang-apply-replacements',
+                      help='path to clang-apply-replacements binary')
+  parser.add_argument('-checks', default=None,
+                      help='checks filter, when not specified, use clang-tidy '
+                      'default')
+  parser.add_argument('-config', default=None,
+                      help='Specifies a configuration in YAML/JSON format: '
+                      '  -config="{Checks: \'*\', '
+                      '                       CheckOptions: [{key: x, '
+                      '                                       value: y}]}" '
+                      'When the value is empty, clang-tidy will '
+                      'attempt to find a file named .clang-tidy for '
+                      'each source file in its parent directories.')
+  parser.add_argument('-header-filter', default=None,
+                      help='regular expression matching the names of the '
+                      'headers to output diagnostics from. Diagnostics from '
+                      'the main file of each translation unit are always '
+                      'displayed.')
+  if yaml:
+    parser.add_argument('-export-fixes', metavar='filename', dest='export_fixes',
+                        help='Create a yaml file to store suggested fixes in, '
+                        'which can be applied with clang-apply-replacements.')
+  parser.add_argument('-j', type=int, default=0,
+                      help='number of tidy instances to be run in parallel.')
+  parser.add_argument('files', nargs='*', default=['.*'],
+                      help='files to be processed (regex on path)')
+  parser.add_argument('-fix', action='store_true', help='apply fix-its')
+  parser.add_argument('-format', action='store_true', help='Reformat code '
+                      'after applying fixes')
+  parser.add_argument('-style', default='file', help='The style of reformat '
+                      'code after applying fixes')
+  parser.add_argument('-p', dest='build_path',
+                      help='Path used to read a compile command database.')
+  parser.add_argument('-extra-arg', dest='extra_arg',
+                      action='append', default=[],
+                      help='Additional argument to append to the compiler '
+                      'command line.')
+  parser.add_argument('-extra-arg-before', dest='extra_arg_before',
+                      action='append', default=[],
+                      help='Additional argument to prepend to the compiler '
+                      'command line.')
+  parser.add_argument('-quiet', action='store_true',
+                      help='Run clang-tidy in quiet mode')
+  args = parser.parse_args()
+
+  db_path = 'compile_commands.json'
+
+  if args.build_path is not None:
+    build_path = args.build_path
+  else:
+    # Find our database
+    build_path = find_compilation_database(db_path)
+
+  try:
+    invocation = [args.clang_tidy_binary, '-list-checks']
+    invocation.append('-p=' + build_path)
+    if args.checks:
+      invocation.append('-checks=' + args.checks)
+    invocation.append('-')
+    if args.quiet:
+      # Even with -quiet we still want to check if we can call clang-tidy.
+      with open(os.devnull, 'w') as dev_null:
+        subprocess.check_call(invocation, stdout=dev_null)
+    else:
+      subprocess.check_call(invocation)
+  except:
+    print("Unable to run clang-tidy.", file=sys.stderr)
+    sys.exit(1)
+
+  # Load the database and extract all files.
+  database = json.load(open(os.path.join(build_path, db_path)))
+  files = [make_absolute(entry['file'], entry['directory'])
+           for entry in database]
+
+  max_task = args.j
+  if max_task == 0:
+    max_task = multiprocessing.cpu_count()
+
+  tmpdir = None
+  if args.fix or (yaml and args.export_fixes):
+    check_clang_apply_replacements_binary(args)
+    tmpdir = tempfile.mkdtemp()
+
+  # Build up a big regexy filter from all command line arguments.
+  file_name_re = re.compile('|'.join(args.files))
+
+  return_code = 0
+  try:
+    # Spin up a bunch of tidy-launching threads.
+    task_queue = queue.Queue(max_task)
+    # List of files with a non-zero return code.
+    failed_files = []
+    lock = threading.Lock()
+    for _ in range(max_task):
+      t = threading.Thread(target=run_tidy,
+                           args=(args, tmpdir, build_path, task_queue, lock, failed_files))
+      t.daemon = True
+      t.start()
+
+    # Fill the queue with files.
+    for name in files:
+      if file_name_re.search(name):
+        task_queue.put(name)
+
+    # Wait for all threads to be done.
+    task_queue.join()
+    if len(failed_files):
+      return_code = 1
+
+  except KeyboardInterrupt:
+    # This is a sad hack. Unfortunately subprocess goes
+    # bonkers with ctrl-c and we start forking merrily.
+    print('\nCtrl-C detected, goodbye.')
+    if tmpdir:
+      shutil.rmtree(tmpdir)
+    os.kill(0, 9)
+
+  if yaml and args.export_fixes:
+    print('Writing fixes to ' + args.export_fixes + ' ...')
+    try:
+      merge_replacement_files(tmpdir, args.export_fixes)
+    except:
+      print('Error exporting fixes.\n', file=sys.stderr)
+      traceback.print_exc()
+      return_code=1
+
+  if args.fix:
+    print('Applying fixes ...')
+    try:
+      apply_fixes(args, tmpdir)
+    except:
+      print('Error applying fixes.\n', file=sys.stderr)
+      traceback.print_exc()
+      return_code=1
+
+  if tmpdir:
+    shutil.rmtree(tmpdir)
+  sys.exit(return_code)
+
+if __name__ == '__main__':
+  main()
diff --git a/util/travis/before_install.sh b/util/travis/before_install.sh
deleted file mode 100755 (executable)
index 649486d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash -e
-
-echo "Preparing for $TRAVIS_COMMIT_RANGE"
-
-. util/travis/common.sh
-
-if [[ ! -z "${CLANG_FORMAT}" ]]; then
-       exit 0
-fi
-
-needs_compile || exit 0
-
-if [[ $PLATFORM == "Unix" ]] || [[ ! -z "${CLANG_TIDY}" ]]; then
-       if [[ $TRAVIS_OS_NAME == "linux" ]] || [[ ! -z "${CLANG_TIDY}" ]]; then
-               install_linux_deps
-       else
-               install_macosx_deps
-       fi
-elif [[ $PLATFORM == "Win32" ]]; then
-       wget http://minetest.kitsunemimi.pw/mingw-w64-i686_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz
-       # buildwin32.sh detects the installed toolchain automatically
-       sudo tar -xaf mingw.tar.xz -C /usr
-elif [[ $PLATFORM == "Win64" ]]; then
-       wget http://minetest.kitsunemimi.pw/mingw-w64-x86_64_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz
-       sed -e "s|%PREFIX%|x86_64-w64-mingw32|" \
-               -e "s|%ROOTPATH%|/usr/x86_64-w64-mingw32|" \
-               < util/travis/toolchain_mingw.cmake.in > util/buildbot/toolchain_mingw64.cmake
-       sudo tar -xaf mingw.tar.xz -C /usr
-fi
diff --git a/util/travis/clang-format-whitelist.txt b/util/travis/clang-format-whitelist.txt
deleted file mode 100644 (file)
index 02c8b26..0000000
+++ /dev/null
@@ -1,499 +0,0 @@
-src/activeobject.h
-src/ban.cpp
-src/camera.cpp
-src/camera.h
-src/chat.cpp
-src/chat.h
-src/chat_interface.h
-src/client/clientlauncher.cpp
-src/client/clientlauncher.h
-src/client/sound_openal.cpp
-src/client.cpp
-src/clientenvironment.cpp
-src/clientenvironment.h
-src/client/gameui.cpp
-src/client.h
-src/client/hud.cpp
-src/client/hud.h
-src/clientiface.cpp
-src/clientiface.h
-src/client/joystick_controller.cpp
-src/client/joystick_controller.h
-src/clientmap.cpp
-src/clientmap.h
-src/clientmedia.cpp
-src/clientmedia.h
-src/clientobject.cpp
-src/clientobject.h
-src/client/render/core.cpp
-src/client/renderingengine.cpp
-src/client/render/interlaced.cpp
-src/client/render/plain.cpp
-src/client/render/sidebyside.cpp
-src/client/render/stereo.cpp
-src/client/tile.cpp
-src/client/tile.h
-src/client/fontengine.h
-src/client/clientenvironment.cpp
-src/client/mapblock_mesh.cpp
-src/client/sound_openal.h
-src/client/clouds.cpp
-src/client/fontengine.cpp
-src/client/camera.h
-src/client/hud.cpp
-src/client/clientmap.cpp
-src/client/sound_openal.cpp
-src/client/minimap.h
-src/client/content_cao.cpp
-src/client/localplayer.h
-src/client/mapblock_mesh.h
-src/client/mesh.cpp
-src/client/sound.cpp
-src/client/guiscalingfilter.cpp
-src/client/content_cso.cpp
-src/client/gameui.cpp
-src/client/wieldmesh.cpp
-src/client/clientmedia.h
-src/client/game.cpp
-src/client/keys.h
-src/client/client.h
-src/client/shader.cpp
-src/client/clientmap.h
-src/client/inputhandler.h
-src/client/content_mapblock.h
-src/client/game.h
-src/client/mesh.h
-src/client/camera.cpp
-src/client/sky.h
-src/client/mesh_generator_thread.cpp
-src/client/guiscalingfilter.h
-src/client/clientobject.cpp
-src/client/tile.cpp
-src/client/hud.h
-src/client/inputhandler.cpp
-src/client/clientevent.h
-src/client/gameui.h
-src/client/content_cso.h
-src/client/sky.cpp
-src/client/localplayer.cpp
-src/client/content_mapblock.cpp
-src/client/clientobject.h
-src/client/filecache.cpp
-src/client/particles.h
-src/client/clientenvironment.h
-src/client/imagefilters.h
-src/client/renderingengine.cpp
-src/client/tile.h
-src/client/clientmedia.cpp
-src/client/event_manager.h
-src/client/joystick_controller.h
-src/client/clouds.h
-src/client/clientlauncher.h
-src/client/content_cao.h
-src/client/minimap.cpp
-src/client/sound.h
-src/client/keycode.cpp
-src/client/particles.cpp
-src/client/joystick_controller.cpp
-src/client/keycode.h
-src/client/wieldmesh.h
-src/client/filecache.h
-src/client/shader.h
-src/client/mesh_generator_thread.h
-src/client/renderingengine.h
-src/client/client.cpp
-src/client/imagefilters.cpp
-src/client/clientlauncher.cpp
-src/clouds.cpp
-src/clouds.h
-src/collision.cpp
-src/collision.h
-src/config.h
-src/content_cao.cpp
-src/content_cao.h
-src/content_cso.cpp
-src/content_cso.h
-src/content_mapblock.cpp
-src/content_mapblock.h
-src/content_mapnode.cpp
-src/content_nodemeta.cpp
-src/content_nodemeta.h
-src/convert_json.cpp
-src/convert_json.h
-src/craftdef.cpp
-src/craftdef.h
-src/database/database.cpp
-src/database/database-dummy.cpp
-src/database/database-files.cpp
-src/database/database-leveldb.cpp
-src/database/database-postgresql.cpp
-src/database/database-postgresql.h
-src/database/database-redis.cpp
-src/database/database-sqlite3.cpp
-src/database/database-sqlite3.h
-src/daynightratio.h
-src/debug.cpp
-src/debug.h
-src/defaultsettings.cpp
-src/emerge.cpp
-src/emerge.h
-src/environment.cpp
-src/exceptions.h
-src/face_position_cache.cpp
-src/face_position_cache.h
-src/filecache.cpp
-src/filesys.cpp
-src/filesys.h
-src/fontengine.cpp
-src/fontengine.h
-src/game.cpp
-src/gamedef.h
-src/game.h
-src/gettext.cpp
-src/gettext.h
-src/gui/guiAnimatedImage.cpp
-src/gui/guiAnimatedImage.h
-src/gui/guiBackgroundImage.cpp
-src/gui/guiBackgroundImage.h
-src/gui/guiBox.cpp
-src/gui/guiBox.h
-src/gui/guiButton.cpp
-src/gui/guiButton.h
-src/gui/guiButtonImage.cpp
-src/gui/guiButtonImage.h
-src/gui/guiButtonItemImage.cpp
-src/gui/guiButtonItemImage.h
-src/gui/guiChatConsole.cpp
-src/gui/guiChatConsole.h
-src/gui/guiConfirmRegistration.cpp
-src/gui/guiEditBoxWithScrollbar.cpp
-src/gui/guiEditBoxWithScrollbar.h
-src/gui/guiEngine.cpp
-src/gui/guiEngine.h
-src/gui/guiFormSpecMenu.cpp
-src/gui/guiFormSpecMenu.h
-src/gui/guiKeyChangeMenu.cpp
-src/gui/guiHyperText.cpp
-src/gui/guiHyperText.h
-src/gui/guiInventoryList.cpp
-src/gui/guiInventoryList.h
-src/gui/guiItemImage.cpp
-src/gui/guiItemImage.h
-src/gui/guiMainMenu.h
-src/gui/guiPasswordChange.cpp
-src/gui/guiPathSelectMenu.cpp
-src/gui/guiPathSelectMenu.h
-src/gui/guiScrollBar.cpp
-src/gui/guiSkin.cpp
-src/gui/guiSkin.h
-src/gui/guiTable.cpp
-src/gui/guiTable.h
-src/gui/guiVolumeChange.cpp
-src/gui/guiVolumeChange.h
-src/gui/intlGUIEditBox.cpp
-src/gui/intlGUIEditBox.h
-src/gui/mainmenumanager.h
-src/gui/modalMenu.h
-src/guiscalingfilter.cpp
-src/guiscalingfilter.h
-src/gui/StyleSpec.h
-src/gui/touchscreengui.cpp
-src/httpfetch.cpp
-src/hud.cpp
-src/hud.h
-src/imagefilters.cpp
-src/imagefilters.h
-src/inventory.cpp
-src/inventory.h
-src/inventorymanager.cpp
-src/inventorymanager.h
-src/irrlicht_changes/CGUITTFont.cpp
-src/irrlicht_changes/CGUITTFont.h
-src/irrlicht_changes/irrUString.h
-src/irrlicht_changes/static_text.cpp
-src/irrlicht_changes/static_text.h
-src/irrlichttypes.h
-src/itemdef.cpp
-src/itemdef.h
-src/itemstackmetadata.cpp
-src/keycode.cpp
-src/light.cpp
-src/localplayer.cpp
-src/log.cpp
-src/log.h
-src/main.cpp
-src/mapblock.cpp
-src/mapblock.h
-src/mapblock_mesh.cpp
-src/mapblock_mesh.h
-src/map.cpp
-src/mapgen/cavegen.cpp
-src/mapgen/cavegen.h
-src/mapgen/dungeongen.cpp
-src/mapgen/dungeongen.h
-src/mapgen/mapgen.cpp
-src/mapgen/mapgen.h
-src/mapgen/mapgen_carpathian.cpp
-src/mapgen/mapgen_carpathian.h
-src/mapgen/mapgen_flat.cpp
-src/mapgen/mapgen_flat.h
-src/mapgen/mapgen_fractal.cpp
-src/mapgen/mapgen_fractal.h
-src/mapgen/mapgen_singlenode.cpp
-src/mapgen/mapgen_singlenode.h
-src/mapgen/mapgen_v5.cpp
-src/mapgen/mapgen_v5.h
-src/mapgen/mapgen_v6.cpp
-src/mapgen/mapgen_v6.h
-src/mapgen/mapgen_v7.cpp
-src/mapgen/mapgen_v7.h
-src/mapgen/mapgen_valleys.cpp
-src/mapgen/mapgen_valleys.h
-src/mapgen/mg_biome.cpp
-src/mapgen/mg_biome.h
-src/mapgen/mg_decoration.cpp
-src/mapgen/mg_decoration.h
-src/mapgen/mg_ore.cpp
-src/mapgen/mg_ore.h
-src/mapgen/mg_schematic.cpp
-src/mapgen/mg_schematic.h
-src/mapgen/treegen.cpp
-src/mapgen/treegen.h
-src/map.h
-src/mapnode.cpp
-src/mapnode.h
-src/mapsector.cpp
-src/mapsector.h
-src/map_settings_manager.cpp
-src/map_settings_manager.h
-src/mesh.cpp
-src/mesh_generator_thread.cpp
-src/mesh.h
-src/metadata.h
-src/minimap.cpp
-src/minimap.h
-src/mods.cpp
-src/mods.h
-src/network/address.cpp
-src/network/clientopcodes.cpp
-src/network/clientopcodes.h
-src/network/clientpackethandler.cpp
-src/network/connection.cpp
-src/network/connection.h
-src/network/connectionthreads.cpp
-src/network/networkpacket.cpp
-src/network/networkprotocol.h
-src/network/serveropcodes.cpp
-src/network/serveropcodes.h
-src/network/serverpackethandler.cpp
-src/nodedef.cpp
-src/nodedef.h
-src/nodemetadata.cpp
-src/nodemetadata.h
-src/nodetimer.cpp
-src/nodetimer.h
-src/noise.cpp
-src/noise.h
-src/objdef.cpp
-src/objdef.h
-src/object_properties.cpp
-src/object_properties.h
-src/particles.cpp
-src/particles.h
-src/pathfinder.cpp
-src/pathfinder.h
-src/player.cpp
-src/player.h
-src/porting_android.cpp
-src/porting_android.h
-src/porting.cpp
-src/porting.h
-src/profiler.h
-src/raycast.cpp
-src/raycast.h
-src/reflowscan.cpp
-src/reflowscan.h
-src/remoteplayer.cpp
-src/rollback.cpp
-src/rollback.h
-src/rollback_interface.cpp
-src/rollback_interface.h
-src/script/common/c_content.cpp
-src/script/common/c_content.h
-src/script/common/c_converter.cpp
-src/script/common/c_converter.h
-src/script/common/c_internal.cpp
-src/script/common/c_internal.h
-src/script/common/c_types.cpp
-src/script/common/c_types.h
-src/script/cpp_api/s_async.cpp
-src/script/cpp_api/s_async.h
-src/script/cpp_api/s_base.cpp
-src/script/cpp_api/s_base.h
-src/script/cpp_api/s_client.cpp
-src/script/cpp_api/s_entity.cpp
-src/script/cpp_api/s_entity.h
-src/script/cpp_api/s_env.cpp
-src/script/cpp_api/s_env.h
-src/script/cpp_api/s_internal.h
-src/script/cpp_api/s_inventory.cpp
-src/script/cpp_api/s_inventory.h
-src/script/cpp_api/s_item.cpp
-src/script/cpp_api/s_item.h
-src/script/cpp_api/s_mainmenu.h
-src/script/cpp_api/s_node.cpp
-src/script/cpp_api/s_node.h
-src/script/cpp_api/s_nodemeta.cpp
-src/script/cpp_api/s_nodemeta.h
-src/script/cpp_api/s_player.cpp
-src/script/cpp_api/s_player.h
-src/script/cpp_api/s_security.cpp
-src/script/cpp_api/s_security.h
-src/script/cpp_api/s_server.cpp
-src/script/cpp_api/s_server.h
-src/script/lua_api/l_areastore.cpp
-src/script/lua_api/l_base.cpp
-src/script/lua_api/l_base.h
-src/script/lua_api/l_client.cpp
-src/script/lua_api/l_craft.cpp
-src/script/lua_api/l_craft.h
-src/script/lua_api/l_env.cpp
-src/script/lua_api/l_env.h
-src/script/lua_api/l_http.cpp
-src/script/lua_api/l_http.h
-src/script/lua_api/l_internal.h
-src/script/lua_api/l_inventory.cpp
-src/script/lua_api/l_inventory.h
-src/script/lua_api/l_item.cpp
-src/script/lua_api/l_item.h
-src/script/lua_api/l_itemstackmeta.cpp
-src/script/lua_api/l_itemstackmeta.h
-src/script/lua_api/l_localplayer.cpp
-src/script/lua_api/l_mainmenu.cpp
-src/script/lua_api/l_mainmenu.h
-src/script/lua_api/l_mapgen.cpp
-src/script/lua_api/l_mapgen.h
-src/script/lua_api/l_metadata.cpp
-src/script/lua_api/l_minimap.cpp
-src/script/lua_api/l_nodemeta.cpp
-src/script/lua_api/l_nodemeta.h
-src/script/lua_api/l_nodetimer.cpp
-src/script/lua_api/l_noise.cpp
-src/script/lua_api/l_object.cpp
-src/script/lua_api/l_object.h
-src/script/lua_api/l_particles.cpp
-src/script/lua_api/l_particles.h
-src/script/lua_api/l_particles_local.cpp
-src/script/lua_api/l_rollback.cpp
-src/script/lua_api/l_rollback.h
-src/script/lua_api/l_server.cpp
-src/script/lua_api/l_settings.cpp
-src/script/lua_api/l_sound.cpp
-src/script/lua_api/l_storage.cpp
-src/script/lua_api/l_util.cpp
-src/script/lua_api/l_vmanip.cpp
-src/script/scripting_client.cpp
-src/script/scripting_client.h
-src/script/scripting_mainmenu.cpp
-src/script/scripting_mainmenu.h
-src/script/scripting_server.cpp
-src/script/scripting_server.h
-src/serialization.cpp
-src/serialization.h
-src/server.cpp
-src/serverenvironment.cpp
-src/serverenvironment.h
-src/server.h
-src/serverlist.cpp
-src/serverlist.h
-src/server/luaentity_sao.cpp
-src/server/player_sao.cpp
-src/server/serveractiveobject.cpp
-src/server/serveractiveobject.h
-src/settings.cpp
-src/settings.h
-src/settings_translation_file.cpp
-src/shader.cpp
-src/shader.h
-src/sky.cpp
-src/sound.cpp
-src/staticobject.cpp
-src/staticobject.h
-src/subgame.cpp
-src/subgame.h
-src/terminal_chat_console.cpp
-src/terminal_chat_console.h
-src/texture_override.cpp
-src/threading/atomic.h
-src/threading/event.cpp
-src/threading/mutex_auto_lock.h
-src/threading/mutex.cpp
-src/threading/mutex.h
-src/threading/semaphore.cpp
-src/threading/thread.cpp
-src/threading/thread.h
-src/threads.h
-src/tileanimation.cpp
-src/tool.cpp
-src/tool.h
-src/translation.cpp
-src/unittest/test_areastore.cpp
-src/unittest/test_collision.cpp
-src/unittest/test_compression.cpp
-src/unittest/test_connection.cpp
-src/unittest/test.cpp
-src/unittest/test_filepath.cpp
-src/unittest/test.h
-src/unittest/test_inventory.cpp
-src/unittest/test_keycode.cpp
-src/unittest/test_map_settings_manager.cpp
-src/unittest/test_noderesolver.cpp
-src/unittest/test_noise.cpp
-src/unittest/test_random.cpp
-src/unittest/test_schematic.cpp
-src/unittest/test_serialization.cpp
-src/unittest/test_settings.cpp
-src/unittest/test_socket.cpp
-src/unittest/test_threading.cpp
-src/unittest/test_utilities.cpp
-src/unittest/test_voxelalgorithms.cpp
-src/unittest/test_voxelmanipulator.cpp
-src/util/areastore.cpp
-src/util/areastore.h
-src/util/auth.cpp
-src/util/auth.h
-src/util/base64.cpp
-src/util/base64.h
-src/util/basic_macros.h
-src/util/container.h
-src/util/directiontables.cpp
-src/util/directiontables.h
-src/util/enriched_string.cpp
-src/util/enriched_string.h
-src/util/md32_common.h
-src/util/numeric.cpp
-src/util/numeric.h
-src/util/pointedthing.cpp
-src/util/pointedthing.h
-src/util/pointer.h
-src/util/quicktune.h
-src/util/quicktune_shortcutter.h
-src/util/quicktune.cpp
-src/util/serialize.cpp
-src/util/serialize.h
-src/util/sha1.cpp
-src/util/srp.cpp
-src/util/srp.h
-src/util/strfnd.h
-src/util/string.cpp
-src/util/string.h
-src/util/thread.h
-src/util/timetaker.cpp
-src/util/timetaker.h
-src/version.cpp
-src/version.h
-src/voxelalgorithms.cpp
-src/voxelalgorithms.h
-src/voxel.cpp
-src/voxel.h
-src/wieldmesh.cpp
diff --git a/util/travis/clangtidy.sh b/util/travis/clangtidy.sh
deleted file mode 100755 (executable)
index ed6523b..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash -e
-. util/travis/common.sh
-
-needs_compile || exit 0
-
-if [ -z "${CLANG_TIDY}" ]; then
-       CLANG_TIDY=clang-tidy
-fi
-
-mkdir -p cmakebuild && cd cmakebuild
-cmake -DCMAKE_BUILD_TYPE=Debug \
-       -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-       -DRUN_IN_PLACE=TRUE \
-       -DENABLE_GETTEXT=TRUE \
-       -DENABLE_SOUND=FALSE \
-       -DBUILD_SERVER=TRUE ..
-make GenerateVersion
-cd ..
-
-echo "Performing clang-tidy checks..."
-./util/travis/run-clang-tidy.py \
-       -clang-tidy-binary=${CLANG_TIDY} -p cmakebuild \
-       -quiet -config="$(cat .clang-tidy)" \
-       'src/.*'
-
-RET=$?
-echo "Clang tidy returned $RET"
-exit $RET
diff --git a/util/travis/common.sh b/util/travis/common.sh
deleted file mode 100644 (file)
index cf9ce02..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/bash -e
-
-set_linux_compiler_env() {
-       if [[ "${COMPILER}" == "gcc-6" ]]; then
-               export CC=gcc-6
-               export CXX=g++-6
-       elif [[ "${COMPILER}" == "gcc-8" ]]; then
-               export CC=gcc-8
-               export CXX=g++-8
-       elif [[ "${COMPILER}" == "clang-3.9" ]]; then
-               export CC=clang-3.9
-               export CXX=clang++-3.9
-       elif [[ "${COMPILER}" == "clang-9" ]]; then
-               export CC=clang-9
-               export CXX=clang++-9
-       fi
-}
-
-# Linux build only
-install_linux_deps() {
-       local pkgs=(libirrlicht-dev cmake libbz2-dev libpng-dev \
-               libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev \
-               libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev \
-               gettext libpq-dev postgresql-server-dev-all libleveldb-dev)
-       # for better coverage, build some jobs with luajit
-       if [[ "$CC" == "clang"* && -z "$VALGRIND$FREETYPE" ]]; then
-               pkgs+=(libluajit-5.1-dev)
-       fi
-
-       sudo apt-get update
-       sudo apt-get install -y --no-install-recommends ${pkgs[@]}
-}
-
-# Mac OSX build only
-install_macosx_deps() {
-       brew update
-       brew install freetype gettext hiredis irrlicht leveldb libogg libvorbis luajit
-       if brew ls | grep -q jpeg; then
-               brew upgrade jpeg
-       else
-               brew install jpeg
-       fi
-       #brew upgrade postgresql
-}
-
-# Relative to git-repository root:
-TRIGGER_COMPILE_PATHS="src/.*\.(c|cpp|h)|CMakeLists.txt|cmake/Modules/|util/travis/|util/buildbot/"
-
-needs_compile() {
-       RANGE="$TRAVIS_COMMIT_RANGE"
-       if [[ "$(git diff --name-only $RANGE -- 2>/dev/null)" == "" ]]; then
-               RANGE="$TRAVIS_COMMIT^...$TRAVIS_COMMIT"
-               echo "Fixed range: $RANGE"
-       fi
-       git diff --name-only $RANGE -- | egrep -q "^($TRIGGER_COMPILE_PATHS)"
-}
-
diff --git a/util/travis/lint.sh b/util/travis/lint.sh
deleted file mode 100644 (file)
index b3027c6..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#! /bin/bash
-function perform_lint() {
-       echo "Performing LINT..."
-       if [ -z "${CLANG_FORMAT}" ]; then
-               CLANG_FORMAT=clang-format
-       fi
-       echo "LINT: Using binary $CLANG_FORMAT"
-       CLANG_FORMAT_WHITELIST="util/travis/clang-format-whitelist.txt"
-
-       files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
-
-       local errorcount=0
-       local fail=0
-       for f in ${files_to_lint}; do
-               d=$(diff -u "$f" <(${CLANG_FORMAT} "$f") || true)
-
-               if ! [ -z "$d" ]; then
-                       whitelisted=$(awk '$1 == "'$f'" { print 1 }' "$CLANG_FORMAT_WHITELIST")
-
-                       # If file is not whitelisted, mark a failure
-                       if [ -z "${whitelisted}" ]; then
-                               errorcount=$((errorcount+1))
-
-                               printf "The file %s is not compliant with the coding style" "$f"
-                               if [ ${errorcount} -gt 50 ]; then
-                                       printf "\nToo many errors encountered previously, this diff is hidden.\n"
-                               else
-                                       printf ":\n%s\n" "$d"
-                               fi
-
-                               fail=1
-                       fi
-               fi
-       done
-
-       if [ "$fail" = 1 ]; then
-               echo "LINT reports failure."
-               exit 1
-       fi
-
-       echo "LINT OK"
-}
-
diff --git a/util/travis/run-clang-tidy.py b/util/travis/run-clang-tidy.py
deleted file mode 100755 (executable)
index 6ad0ff2..0000000
+++ /dev/null
@@ -1,321 +0,0 @@
-#!/usr/bin/env python
-#
-#===- run-clang-tidy.py - Parallel clang-tidy runner ---------*- python -*--===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-#===------------------------------------------------------------------------===#
-# FIXME: Integrate with clang-tidy-diff.py
-
-"""
-Parallel clang-tidy runner
-==========================
-
-Runs clang-tidy over all files in a compilation database. Requires clang-tidy
-and clang-apply-replacements in $PATH.
-
-Example invocations.
-- Run clang-tidy on all files in the current working directory with a default
-  set of checks and show warnings in the cpp files and all project headers.
-    run-clang-tidy.py $PWD
-
-- Fix all header guards.
-    run-clang-tidy.py -fix -checks=-*,llvm-header-guard
-
-- Fix all header guards included from clang-tidy and header guards
-  for clang-tidy headers.
-    run-clang-tidy.py -fix -checks=-*,llvm-header-guard extra/clang-tidy \
-                      -header-filter=extra/clang-tidy
-
-Compilation database setup:
-http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
-"""
-
-from __future__ import print_function
-
-import argparse
-import glob
-import json
-import multiprocessing
-import os
-import re
-import shutil
-import subprocess
-import sys
-import tempfile
-import threading
-import traceback
-
-try:
-  import yaml
-except ImportError:
-  yaml = None
-
-is_py2 = sys.version[0] == '2'
-
-if is_py2:
-    import Queue as queue
-else:
-    import queue as queue
-
-def find_compilation_database(path):
-  """Adjusts the directory until a compilation database is found."""
-  result = './'
-  while not os.path.isfile(os.path.join(result, path)):
-    if os.path.realpath(result) == '/':
-      print('Error: could not find compilation database.')
-      sys.exit(1)
-    result += '../'
-  return os.path.realpath(result)
-
-
-def make_absolute(f, directory):
-  if os.path.isabs(f):
-    return f
-  return os.path.normpath(os.path.join(directory, f))
-
-
-def get_tidy_invocation(f, clang_tidy_binary, checks, tmpdir, build_path,
-                        header_filter, extra_arg, extra_arg_before, quiet,
-                        config):
-  """Gets a command line for clang-tidy."""
-  start = [clang_tidy_binary]
-  if header_filter is not None:
-    start.append('-header-filter=' + header_filter)
-  if checks:
-    start.append('-checks=' + checks)
-  if tmpdir is not None:
-    start.append('-export-fixes')
-    # Get a temporary file. We immediately close the handle so clang-tidy can
-    # overwrite it.
-    (handle, name) = tempfile.mkstemp(suffix='.yaml', dir=tmpdir)
-    os.close(handle)
-    start.append(name)
-  for arg in extra_arg:
-      start.append('-extra-arg=%s' % arg)
-  for arg in extra_arg_before:
-      start.append('-extra-arg-before=%s' % arg)
-  start.append('-p=' + build_path)
-  if quiet:
-      start.append('-quiet')
-  if config:
-      start.append('-config=' + config)
-  start.append(f)
-  return start
-
-
-def merge_replacement_files(tmpdir, mergefile):
-  """Merge all replacement files in a directory into a single file"""
-  # The fixes suggested by clang-tidy >= 4.0.0 are given under
-  # the top level key 'Diagnostics' in the output yaml files
-  mergekey="Diagnostics"
-  merged=[]
-  for replacefile in glob.iglob(os.path.join(tmpdir, '*.yaml')):
-    content = yaml.safe_load(open(replacefile, 'r'))
-    if not content:
-      continue # Skip empty files.
-    merged.extend(content.get(mergekey, []))
-
-  if merged:
-    # MainSourceFile: The key is required by the definition inside
-    # include/clang/Tooling/ReplacementsYaml.h, but the value
-    # is actually never used inside clang-apply-replacements,
-    # so we set it to '' here.
-    output = { 'MainSourceFile': '', mergekey: merged }
-    with open(mergefile, 'w') as out:
-      yaml.safe_dump(output, out)
-  else:
-    # Empty the file:
-    open(mergefile, 'w').close()
-
-
-def check_clang_apply_replacements_binary(args):
-  """Checks if invoking supplied clang-apply-replacements binary works."""
-  try:
-    subprocess.check_call([args.clang_apply_replacements_binary, '--version'])
-  except:
-    print('Unable to run clang-apply-replacements. Is clang-apply-replacements '
-          'binary correctly specified?', file=sys.stderr)
-    traceback.print_exc()
-    sys.exit(1)
-
-
-def apply_fixes(args, tmpdir):
-  """Calls clang-apply-fixes on a given directory."""
-  invocation = [args.clang_apply_replacements_binary]
-  if args.format:
-    invocation.append('-format')
-  if args.style:
-    invocation.append('-style=' + args.style)
-  invocation.append(tmpdir)
-  subprocess.call(invocation)
-
-
-def run_tidy(args, tmpdir, build_path, queue, lock, failed_files):
-  """Takes filenames out of queue and runs clang-tidy on them."""
-  while True:
-    name = queue.get()
-    invocation = get_tidy_invocation(name, args.clang_tidy_binary, args.checks,
-                                     tmpdir, build_path, args.header_filter,
-                                     args.extra_arg, args.extra_arg_before,
-                                     args.quiet, args.config)
-
-    proc = subprocess.Popen(invocation)
-    proc.wait()
-    if proc.returncode != 0:
-      failed_files.append(name)
-    queue.task_done()
-
-
-def main():
-  parser = argparse.ArgumentParser(description='Runs clang-tidy over all files '
-                                   'in a compilation database. Requires '
-                                   'clang-tidy and clang-apply-replacements in '
-                                   '$PATH.')
-  parser.add_argument('-clang-tidy-binary', metavar='PATH',
-                      default='clang-tidy',
-                      help='path to clang-tidy binary')
-  parser.add_argument('-clang-apply-replacements-binary', metavar='PATH',
-                      default='clang-apply-replacements',
-                      help='path to clang-apply-replacements binary')
-  parser.add_argument('-checks', default=None,
-                      help='checks filter, when not specified, use clang-tidy '
-                      'default')
-  parser.add_argument('-config', default=None,
-                      help='Specifies a configuration in YAML/JSON format: '
-                      '  -config="{Checks: \'*\', '
-                      '                       CheckOptions: [{key: x, '
-                      '                                       value: y}]}" '
-                      'When the value is empty, clang-tidy will '
-                      'attempt to find a file named .clang-tidy for '
-                      'each source file in its parent directories.')
-  parser.add_argument('-header-filter', default=None,
-                      help='regular expression matching the names of the '
-                      'headers to output diagnostics from. Diagnostics from '
-                      'the main file of each translation unit are always '
-                      'displayed.')
-  if yaml:
-    parser.add_argument('-export-fixes', metavar='filename', dest='export_fixes',
-                        help='Create a yaml file to store suggested fixes in, '
-                        'which can be applied with clang-apply-replacements.')
-  parser.add_argument('-j', type=int, default=0,
-                      help='number of tidy instances to be run in parallel.')
-  parser.add_argument('files', nargs='*', default=['.*'],
-                      help='files to be processed (regex on path)')
-  parser.add_argument('-fix', action='store_true', help='apply fix-its')
-  parser.add_argument('-format', action='store_true', help='Reformat code '
-                      'after applying fixes')
-  parser.add_argument('-style', default='file', help='The style of reformat '
-                      'code after applying fixes')
-  parser.add_argument('-p', dest='build_path',
-                      help='Path used to read a compile command database.')
-  parser.add_argument('-extra-arg', dest='extra_arg',
-                      action='append', default=[],
-                      help='Additional argument to append to the compiler '
-                      'command line.')
-  parser.add_argument('-extra-arg-before', dest='extra_arg_before',
-                      action='append', default=[],
-                      help='Additional argument to prepend to the compiler '
-                      'command line.')
-  parser.add_argument('-quiet', action='store_true',
-                      help='Run clang-tidy in quiet mode')
-  args = parser.parse_args()
-
-  db_path = 'compile_commands.json'
-
-  if args.build_path is not None:
-    build_path = args.build_path
-  else:
-    # Find our database
-    build_path = find_compilation_database(db_path)
-
-  try:
-    invocation = [args.clang_tidy_binary, '-list-checks']
-    invocation.append('-p=' + build_path)
-    if args.checks:
-      invocation.append('-checks=' + args.checks)
-    invocation.append('-')
-    if args.quiet:
-      # Even with -quiet we still want to check if we can call clang-tidy.
-      with open(os.devnull, 'w') as dev_null:
-        subprocess.check_call(invocation, stdout=dev_null)
-    else:
-      subprocess.check_call(invocation)
-  except:
-    print("Unable to run clang-tidy.", file=sys.stderr)
-    sys.exit(1)
-
-  # Load the database and extract all files.
-  database = json.load(open(os.path.join(build_path, db_path)))
-  files = [make_absolute(entry['file'], entry['directory'])
-           for entry in database]
-
-  max_task = args.j
-  if max_task == 0:
-    max_task = multiprocessing.cpu_count()
-
-  tmpdir = None
-  if args.fix or (yaml and args.export_fixes):
-    check_clang_apply_replacements_binary(args)
-    tmpdir = tempfile.mkdtemp()
-
-  # Build up a big regexy filter from all command line arguments.
-  file_name_re = re.compile('|'.join(args.files))
-
-  return_code = 0
-  try:
-    # Spin up a bunch of tidy-launching threads.
-    task_queue = queue.Queue(max_task)
-    # List of files with a non-zero return code.
-    failed_files = []
-    lock = threading.Lock()
-    for _ in range(max_task):
-      t = threading.Thread(target=run_tidy,
-                           args=(args, tmpdir, build_path, task_queue, lock, failed_files))
-      t.daemon = True
-      t.start()
-
-    # Fill the queue with files.
-    for name in files:
-      if file_name_re.search(name):
-        task_queue.put(name)
-
-    # Wait for all threads to be done.
-    task_queue.join()
-    if len(failed_files):
-      return_code = 1
-
-  except KeyboardInterrupt:
-    # This is a sad hack. Unfortunately subprocess goes
-    # bonkers with ctrl-c and we start forking merrily.
-    print('\nCtrl-C detected, goodbye.')
-    if tmpdir:
-      shutil.rmtree(tmpdir)
-    os.kill(0, 9)
-
-  if yaml and args.export_fixes:
-    print('Writing fixes to ' + args.export_fixes + ' ...')
-    try:
-      merge_replacement_files(tmpdir, args.export_fixes)
-    except:
-      print('Error exporting fixes.\n', file=sys.stderr)
-      traceback.print_exc()
-      return_code=1
-
-  if args.fix:
-    print('Applying fixes ...')
-    try:
-      apply_fixes(args, tmpdir)
-    except:
-      print('Error applying fixes.\n', file=sys.stderr)
-      traceback.print_exc()
-      return_code=1
-
-  if tmpdir:
-    shutil.rmtree(tmpdir)
-  sys.exit(return_code)
-
-if __name__ == '__main__':
-  main()
diff --git a/util/travis/script.sh b/util/travis/script.sh
deleted file mode 100755 (executable)
index 19aa2fd..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash -e
-. util/travis/common.sh
-. util/travis/lint.sh
-
-needs_compile || exit 0
-
-if [[ ! -z "${CLANG_FORMAT}" ]]; then
-       # Lint and exit CI
-       perform_lint
-       exit 0
-fi
-
-set_linux_compiler_env
-
-if [[ ${PLATFORM} == "Unix" ]]; then
-       mkdir -p travisbuild
-       cd travisbuild || exit 1
-
-       CMAKE_FLAGS=''
-
-       if [[ ${TRAVIS_OS_NAME} == "osx" ]]; then
-               CMAKE_FLAGS+=' -DCUSTOM_GETTEXT_PATH=/usr/local/opt/gettext'
-       fi
-
-       if [[ -n "${FREETYPE}" ]] && [[ "${FREETYPE}" == "0" ]]; then
-               CMAKE_FLAGS+=' -DENABLE_FREETYPE=0'
-       fi
-
-       cmake -DCMAKE_BUILD_TYPE=Debug \
-               -DRUN_IN_PLACE=TRUE \
-               -DENABLE_GETTEXT=TRUE \
-               -DBUILD_SERVER=TRUE \
-               ${CMAKE_FLAGS} ..
-       make -j2
-
-       echo "Running unit tests."
-       CMD="../bin/minetest --run-unittests"
-       if [[ "${VALGRIND}" == "1" ]]; then
-               valgrind --leak-check=full --leak-check-heuristics=all --undef-value-errors=no --error-exitcode=9 ${CMD} && exit 0
-       else
-               ${CMD} && exit 0
-       fi
-
-elif [[ $PLATFORM == Win* ]]; then
-       [[ $CC == "clang" ]] && exit 1 # Not supposed to happen
-       # We need to have our build directory outside of the minetest directory because
-       #  CMake will otherwise get very very confused with symlinks and complain that
-       #  something is not a subdirectory of something even if it actually is.
-       # e.g.:
-       # /home/travis/minetest/minetest/travisbuild/minetest
-       # \/  \/  \/
-       # /home/travis/minetest/minetest/travisbuild/minetest/travisbuild/minetest
-       # \/  \/  \/
-       # /home/travis/minetest/minetest/travisbuild/minetest/travisbuild/minetest/travisbuild/minetest
-       # You get the idea.
-       OLDDIR=$(pwd)
-       cd ..
-       export EXISTING_MINETEST_DIR=$OLDDIR
-       export NO_MINETEST_GAME=1
-       if [[ $PLATFORM == "Win32" ]]; then
-               "$OLDDIR/util/buildbot/buildwin32.sh" travisbuild && exit 0
-       elif [[ $PLATFORM == "Win64" ]]; then
-               "$OLDDIR/util/buildbot/buildwin64.sh" travisbuild && exit 0
-       fi
-else
-       echo "Unknown platform \"${PLATFORM}\"."
-       exit 1
-fi
-
diff --git a/util/travis/toolchain_mingw.cmake.in b/util/travis/toolchain_mingw.cmake.in
deleted file mode 100644 (file)
index 65f6751..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-# Target operating system name
-set(CMAKE_SYSTEM_NAME Windows)
-
-# Compilers to use
-set(CMAKE_C_COMPILER %PREFIX%-gcc)
-set(CMAKE_CXX_COMPILER %PREFIX%-g++)
-set(CMAKE_RC_COMPILER %PREFIX%-windres)
-
-# Location of the target environment
-set(CMAKE_FIND_ROOT_PATH %ROOTPATH%)
-
-# Adjust the default behaviour of the FIND_XXX() commands:
-# search for headers and libraries in the target environment,
-# search for programs in the host environment
-set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
-set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
-set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
-