mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-10-26 06:54:40 -04:00
90 lines
3.0 KiB
Bash
Executable File
90 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Static analysis for the engine Lua (config: .luacheckrc).
|
|
#
|
|
# Complements scripts/test.sh: the tests prove behavior, luacheck catches the
|
|
# defects that never run in a green test -- undefined globals/locals (the
|
|
# class that hid a music.volume crash: a hook read a `state` that was still
|
|
# the nil global), unused values, unreachable code. The .luacheckrc mutes the
|
|
# cosmetic categories the codebase lives with, so what prints is worth a look.
|
|
#
|
|
# scripts/lint.sh full advisory report over every shipped tree
|
|
# scripts/lint.sh --gate only the codes CI blocks on (0xx, 1xx, 511)
|
|
# scripts/lint.sh --ci full report in one pass, fails only on gate codes
|
|
# scripts/lint.sh src tools lint specific paths
|
|
#
|
|
# Install once with: luarocks install luacheck
|
|
#
|
|
# luacheck 1.2.0 (the newest release) predates Lua 5.5, which made generic-for
|
|
# control variables read-only. Under Lua 5.5 it dies while loading
|
|
# luacheck.standards, before it lints a single file, so it has to run under
|
|
# Lua <= 5.4. The version probe below turns that into a readable message
|
|
# instead of a raw Lua traceback.
|
|
|
|
set -uo pipefail
|
|
cd "$(dirname "$0")/.."
|
|
|
|
DEFAULT_PATHS=(main.lua conf.lua src data/scripts mods tools)
|
|
|
|
GATE=0
|
|
CI=0
|
|
case "${1:-}" in
|
|
--gate) GATE=1; shift ;;
|
|
--ci) CI=1; shift ;;
|
|
esac
|
|
|
|
export PATH="$(pwd)/node_modules/.bin:${HOME:-}/.luarocks/bin:$PATH"
|
|
|
|
if ! command -v luacheck >/dev/null 2>&1; then
|
|
echo "luacheck not found on PATH (install: luarocks install luacheck)" >&2
|
|
exit 2
|
|
fi
|
|
|
|
# luacheck 1.2.0 predates Lua 5.5, where generic-for control variables became
|
|
# read-only. Under Lua 5.5 it fails at module load, so the gate can never pass.
|
|
# Diagnose that here rather than leaking the loader's traceback.
|
|
LUACHECK_INSTALL_HINT="luarocks --lua-version=5.4 --tree /opt/homebrew install luacheck"
|
|
|
|
if ! LUACHECK_VERSION="$(luacheck --version 2>&1)"; then
|
|
echo "luacheck is on PATH but cannot run:" >&2
|
|
printf '%s\n' "$LUACHECK_VERSION" | sed 's/^/ /' >&2
|
|
echo >&2
|
|
echo "luacheck 1.2.0 is incompatible with Lua 5.5 (generic-for control" >&2
|
|
echo "variables became read-only there). Install it against Lua 5.4:" >&2
|
|
echo " $LUACHECK_INSTALL_HINT" >&2
|
|
echo "(adjust --tree to match your LuaRocks setup)" >&2
|
|
exit 2
|
|
fi
|
|
|
|
case "$LUACHECK_VERSION" in
|
|
*"Lua 5.5"*)
|
|
echo "warning: luacheck is running under Lua 5.5, which luacheck 1.2.0" >&2
|
|
echo " predates; treat its results with suspicion. Prefer a 5.4 build:" >&2
|
|
echo " $LUACHECK_INSTALL_HINT" >&2
|
|
;;
|
|
esac
|
|
|
|
if [ "$#" -gt 0 ]; then
|
|
PATHS=("$@")
|
|
else
|
|
PATHS=("${DEFAULT_PATHS[@]}")
|
|
fi
|
|
|
|
if [ "$GATE" = "1" ]; then
|
|
exec luacheck "${PATHS[@]}" -q --codes --only 0 1 511
|
|
fi
|
|
|
|
if [ "$CI" = "1" ]; then
|
|
report="$(luacheck "${PATHS[@]}" --codes --no-color)"
|
|
printf '%s\n' "$report"
|
|
gate="$(printf '%s\n' "$report" | grep -E '\((E|W)(0[0-9][0-9]|1[0-9][0-9]|511)\)' || true)"
|
|
if [ -n "$gate" ]; then
|
|
echo
|
|
echo "gate failures (0xx, 1xx, 511):"
|
|
printf '%s\n' "$gate"
|
|
exit 1
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
luacheck "${PATHS[@]}"
|