#!/usr/bin/env bash
SHELLCHECK_VERSION=${SHELLCHECK_VERSION:-0.11.0}
SRC="$(
cd "$(dirname "$0")/../.."
pwd -P
)"
echo "SRC: ${SRC}"
DIR_SHELLCHECK="${SRC}/cache/tools/shellcheck"
mkdir -p "${DIR_SHELLCHECK}"
MACHINE="${BASH_VERSINFO[5]}"
case "$MACHINE" in
*darwin*) SHELLCHECK_OS="darwin" ;;
*linux*) SHELLCHECK_OS="linux" ;;
*)
echo "unknown os: $MACHINE"
exit 3
;;
esac
case "$MACHINE" in
*aarch64*) SHELLCHECK_ARCH="aarch64" ;;
*x86_64*) SHELLCHECK_ARCH="x86_64" ;;
*)
echo "unknown arch: $MACHINE"
exit 2
;;
esac
SHELLCHECK_FN="shellcheck-v${SHELLCHECK_VERSION}.${SHELLCHECK_OS}.${SHELLCHECK_ARCH}"
SHELLCHECK_FN_TARXZ="${SHELLCHECK_FN}.tar.xz"
DOWN_URL="${GITHUB_SOURCE:-"https://github.com"}/koalaman/shellcheck/releases/download/v${SHELLCHECK_VERSION}/${SHELLCHECK_FN_TARXZ}"
SHELLCHECK_BIN="${DIR_SHELLCHECK}/${SHELLCHECK_FN}"
if [[ ! -f "${SHELLCHECK_BIN}" ]]; then
echo "Cache miss, downloading..."
echo "MACHINE: ${MACHINE}"
echo "Down URL: ${DOWN_URL}"
echo "SHELLCHECK_BIN: ${SHELLCHECK_BIN}"
curl -fLo "${SHELLCHECK_BIN}.tar.xz" "${DOWN_URL}" || {
echo "download of shellcheck failed from ${DOWN_URL}"
rm -f "${SHELLCHECK_BIN}.tar.xz"
exit 1
}
tar -xf "${SHELLCHECK_BIN}.tar.xz" -C "${DIR_SHELLCHECK}" "shellcheck-v${SHELLCHECK_VERSION}/shellcheck"
mv -v "${DIR_SHELLCHECK}/shellcheck-v${SHELLCHECK_VERSION}/shellcheck" "${SHELLCHECK_BIN}"
rm -rf "${DIR_SHELLCHECK}/shellcheck-v${SHELLCHECK_VERSION}" "${SHELLCHECK_BIN}.tar.xz"
chmod +x "${SHELLCHECK_BIN}"
fi
ACTUAL_VERSION="$("${SHELLCHECK_BIN}" --version | grep "^version")"
if [[ -n "${SHELLCHECK_INSTALL_ONLY}" ]]; then
echo "SHELLCHECK_INSTALL_ONLY set, exiting after install. SHELLCHECK_BIN=${SHELLCHECK_BIN}"
exit 0
fi
function calculate_params_for_severity() {
declare SEVERITY="${SEVERITY:-"critical"}"
params+=(--check-sourced --color=always --external-sources --format=tty --shell=bash)
case "${SEVERITY}" in
important)
params+=("--severity=warning")
excludes+=(
"SC2034"
)
;;
critical)
params+=("--severity=warning")
excludes+=(
"SC2034"
"SC2207"
"SC2046"
"SC2086"
"SC2206"
)
;;
*)
params+=("--severity=${SEVERITY}")
;;
esac
for exclude in "${excludes[@]}"; do
params+=(--exclude="${exclude}")
done
}
declare -a problems=()
cd "${SRC}" || exit 3
SEVERITY="error"
declare -a params=()
calculate_params_for_severity
declare -a config_files=()
declare -a config_source_files=()
declare -a config_board_files=()
mapfile -t config_source_files < <(find "${SRC}/config/sources" -type f -name "*.inc" -o -name "*.conf")
mapfile -t config_board_files < <(find "${SRC}/config/boards" -type f -name "*.wip" -o -name "*.tvb" -o -name "*.conf" -o -name "*.csc" -o -name "*.eos")
config_files=("${config_source_files[@]}" "${config_board_files[@]}")
echo "Running shellcheck ${ACTUAL_VERSION} against ${#config_files[@]} config files, severity 'SEVERITY=${SEVERITY}', please wait..."
if "${SHELLCHECK_BIN}" "${params[@]}" "${config_files[@]}"; then
echo "Congrats, no ${SEVERITY}'s detected in config/sources."
else
echo "Ooops, ${SEVERITY}'s detected in config/sources."
problems+=("Ooops, ${SEVERITY}'s detected in config/sources.")
fi
SEVERITY="critical"
declare -a params=()
calculate_params_for_severity
echo "Running shellcheck ${ACTUAL_VERSION} against 'compile.sh' -- lib/ checks, severity 'SEVERITY=${SEVERITY}', please wait..."
echo "All params: " "${params[@]}"
if "${SHELLCHECK_BIN}" "${params[@]}" compile.sh; then
echo "Congrats, no ${SEVERITY}'s detected in lib/ code."
else
problems+=("Ooops, ${SEVERITY}'s detected in lib/ code.")
fi
if [[ ${#problems[@]} -gt 0 ]]; then
echo "Problems detected:"
for problem in "${problems[@]}"; do
echo " - ${problem}"
done
exit 1
fi