Skip to content

Commit

Permalink
tools: fix luacheck invocation in different cases
Browse files Browse the repository at this point in the history
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]: mpeterv/luacheck#208
  • Loading branch information
Totktonada committed Nov 11, 2020
1 parent 99d6c8a commit a1d2ce9
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 3 deletions.
5 changes: 2 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.")
Expand Down Expand Up @@ -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"
)

Expand Down
71 changes: 71 additions & 0 deletions tools/run-luacheck.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit a1d2ce9

Please sign in to comment.