89 lines
2.2 KiB
Bash
Executable File
89 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Runs every check CI runs. Missing tools are skipped with a note, so this
|
|
# works on a bare machine; LINT_STRICT=1 (what CI sets) turns a skip into a
|
|
# failure, so a tool silently missing from the runner cannot pass as green.
|
|
set -uo pipefail
|
|
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
cd "$REPO" || exit 1
|
|
|
|
STRICT="${LINT_STRICT:-0}"
|
|
fail=0
|
|
|
|
# Vendored skills are upstream copies: they follow their own conventions and a
|
|
# re-vendor replaces them wholesale, so linting them only makes noise.
|
|
own() { git ls-files "$@" | grep -v -e '^skills/impeccable/' -e '^skills/humanizer/'; }
|
|
|
|
run() { # run <name> <cmd...>
|
|
local name="$1"
|
|
shift
|
|
printf '\n== %s\n' "$name"
|
|
"$@" || fail=1
|
|
}
|
|
|
|
skip() { # skip <name> <tool>
|
|
printf '\n== %s\n' "$1"
|
|
if [ "$STRICT" = 1 ]; then
|
|
echo "$2 is not installed"
|
|
fail=1
|
|
else
|
|
echo "skipped ($2 not installed)"
|
|
fi
|
|
}
|
|
|
|
have() { command -v "$1" >/dev/null 2>&1; }
|
|
|
|
run "repo lints" python3 bin/lint-repo.py
|
|
|
|
if have shellcheck; then
|
|
# shellcheck disable=SC2046
|
|
run "shellcheck" shellcheck $(own '*.sh')
|
|
else
|
|
skip "shellcheck" shellcheck
|
|
fi
|
|
|
|
if have ruff; then
|
|
run "ruff" ruff check .
|
|
else
|
|
skip "ruff" ruff
|
|
fi
|
|
|
|
# shellcheck disable=SC2046
|
|
run "python syntax" python3 -m compileall -q $(own '*.py')
|
|
|
|
if have jq; then
|
|
printf '\n== json\n'
|
|
bad=0
|
|
while read -r f; do
|
|
jq -e . "$f" >/dev/null 2>&1 || { echo "invalid JSON: $f"; bad=1; }
|
|
done < <(own '*.json')
|
|
[ "$bad" = 0 ] && echo "ok" || fail=1
|
|
else
|
|
skip "json" jq
|
|
fi
|
|
|
|
if have node; then
|
|
printf '\n== js syntax\n'
|
|
bad=0
|
|
while read -r f; do
|
|
node --check "$f" || bad=1
|
|
done < <(own '*.js' '*.mjs')
|
|
[ "$bad" = 0 ] && echo "ok" || fail=1
|
|
else
|
|
skip "js syntax" node
|
|
fi
|
|
|
|
# The flake is what NixOS boxes install from; nothing else evaluates home.nix.
|
|
# CI runs it as its own job (installing nix costs more than the rest combined),
|
|
# so the lint job opts out rather than reporting a false skip.
|
|
if [ "${LINT_NO_NIX:-0}" = 1 ]; then
|
|
printf '\n== nix flake check\nskipped (LINT_NO_NIX=1)\n'
|
|
elif have nix; then
|
|
run "nix flake check" nix flake check --no-write-lock-file
|
|
else
|
|
skip "nix flake check" nix
|
|
fi
|
|
|
|
printf '\n'
|
|
[ "$fail" = 0 ] && echo "all checks passed" || echo "FAILED"
|
|
exit "$fail"
|