From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp44.i.mail.ru (smtp44.i.mail.ru [94.100.177.104]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 8865045C304 for ; Tue, 1 Dec 2020 15:32:13 +0300 (MSK) From: Alexander Turenko Date: Tue, 1 Dec 2020 15:32:06 +0300 Message-Id: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH] tools: fix luacheck invocation in different cases List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Sergey Bronnikov Cc: tarantool-patches@dev.tarantool.org, Alexander Turenko Now `make luacheck` gracefully handles different cases: in-source and out-of-source build (within the source tree or outside), current working directory as a real path or with symlink components. As result of looking into those problems I filed the issue [1] against luacheck. It seems, there are problems around absolute paths with symlinks components. [1]: https://github.com/mpeterv/luacheck/issues/208 --- no issue Totktonada/fix-luacheck-invocation https://github.com/tarantool/tarantool/tree/Totktonada/fix-luacheck-invocation CMakeLists.txt | 5 ++- tools/run-luacheck.sh | 71 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 3 deletions(-) create mode 100755 tools/run-luacheck.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index fa6818f8e..10206b943 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,6 @@ find_program(BASH bash) find_program(GIT git) find_program(LD ld) find_program(CTAGS ctags) -find_program(LUACHECK luacheck ENV PATH) # Define PACKAGE macro in tarantool/config.h set(PACKAGE "Tarantool" CACHE STRING "Package name.") @@ -157,10 +156,10 @@ add_custom_target(ctags DEPENDS tags) # # Enable 'make luacheck' target. # - add_custom_target(luacheck) add_custom_command(TARGET luacheck - COMMAND ${LUACHECK} --codes --config "${PROJECT_SOURCE_DIR}/.luacheckrc" "${PROJECT_SOURCE_DIR}" + COMMAND "${PROJECT_SOURCE_DIR}/tools/run-luacheck.sh" + "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" COMMENT "Perform static analysis of Lua code" ) diff --git a/tools/run-luacheck.sh b/tools/run-luacheck.sh new file mode 100755 index 000000000..e6ebb78b3 --- /dev/null +++ b/tools/run-luacheck.sh @@ -0,0 +1,71 @@ +#!/bin/sh + +set -eux + +SOURCE_DIR="${1:-}" +BUILD_DIR="${2:-}" + +if [ -z "${SOURCE_DIR}" ] || [ -z "${BUILD_DIR}" ]; then + printf "Usage: ${0} /path/to/the/source/tree /path/to/the/build/directory\n" + exit 1 +fi + +if ! type luacheck; then + printf "Unable to find luacheck\n" + exit 1 +fi + +# Workaround luacheck behaviour around the `include_files` +# configuration option, a current working directory and a +# directory path passed as an argument. +# +# https://github.com/mpeterv/luacheck/issues/208 +# +# If we'll just invoke the following command under the +# `make luacheck` target: +# +# | luacheck --codes \ +# | --config "${PROJECT_SOURCE_DIR}/.luacheckrc" \ +# | "${PROJECT_SOURCE_DIR}" +# +# The linter will fail to find Lua sources in the following cases: +# +# 1. In-source build. The current working directory is not a +# real path (contains components, which are symlinks). +# 2. Out-of-source build. +# +# It seems, the only reliable way to verify sources is to change +# the current directory prior to the luacheck call. +cd "${SOURCE_DIR}" + +# Exclude the build directory if it is under the source directory. +# +# Except the case, when the build directory is the same as the +# source directory. +# +# We lean on the following assumptions: +# +# 1. "${SOURCE_DIR}" and "${BUILD_DIR}" have no the trailing slash. +# 2. "${SOURCE_DIR}" and "${BUILD_DIR}" are either real paths +# (with resolved symlink components) or absolute paths with the +# same symlink components (where applicable). +# +# Those assumptions should be true when the variables are passed +# from the CMake variables "${PROJECT_SOURCE_DIR}" and +# "${PROJECT_BINARY_DIR}". +# +# When the prerequisites are hold true, the EXCLUDE_FILES pattern +# will be relative to the "${SOURCE_DIR}" and luacheck will work +# as expected. +EXCLUDE_FILES="" +case "${BUILD_DIR}" in +"${SOURCE_DIR}/"*) + EXCLUDE_FILES="${BUILD_DIR#"${SOURCE_DIR}/"}/**/*.lua" + ;; +esac + +if [ -z "${EXCLUDE_FILES}" ]; then + luacheck --codes --config .luacheckrc . +else + luacheck --codes --config .luacheckrc . --exclude-files "${EXCLUDE_FILES}" +fi -- 2.25.0