#!/usr/bin/env bash
SHELLFMT_VERSION=${SHELLFMT_VERSION:-3.14.1}
SRC="$(
cd "$(dirname "$0")/../.."
pwd -P
)"
echo "SRC: ${SRC}"
DIR_SHELLFMT="${SRC}/cache/tools/shellfmt"
mkdir -p "${DIR_SHELLFMT}"
MACHINE="${BASH_VERSINFO[5]}"
case "$MACHINE" in
*darwin*) SHELLFMT_OS="darwin" ;;
*linux*) SHELLFMT_OS="linux" ;;
*)
echo "unknown os: $MACHINE"
exit 3
;;
esac
case "$MACHINE" in
*aarch64*) SHELLFMT_ARCH="arm64" ;;
*x86_64*) SHELLFMT_ARCH="amd64" ;;
*)
echo "unknown arch: $MACHINE"
exit 2
;;
esac
SHELLFMT_FN="shfmt_v${SHELLFMT_VERSION}_${SHELLFMT_OS}_${SHELLFMT_ARCH}"
DOWN_URL="${GITHUB_SOURCE:-"https://github.com"}/mvdan/sh/releases/download/v${SHELLFMT_VERSION}/${SHELLFMT_FN}"
SHELLFMT_BIN="${DIR_SHELLFMT}/${SHELLFMT_FN}"
echo "MACHINE: ${MACHINE}"
echo "Download URL: ${DOWN_URL}"
echo "SHELLFMT_BIN: ${SHELLFMT_BIN}"
if [[ ! -f "${SHELLFMT_BIN}" ]]; then
echo "Cache miss, downloading..."
curl -fLo "${SHELLFMT_BIN}" "${DOWN_URL}" || {
echo "shellfmt download failed from ${DOWN_URL}"
rm -f "${SHELLFMT_BIN}"
exit 1
}
chmod +x "${SHELLFMT_BIN}"
fi
ACTUAL_VERSION="$("${SHELLFMT_BIN}" -version)"
echo "Running shellfmt ${ACTUAL_VERSION}"
declare -a SCOPED_ARGS=()
for _f in "$@"; do
if [[ "${_f}" == /* ]]; then
SCOPED_ARGS+=("${_f}")
else
SCOPED_ARGS+=("${PWD}/${_f}")
fi
done
cd "${SRC}"
ALLOWED_EXT_RE='\.(sh|conf|inc|csc|tvb|eos|wip)$'
declare -a ALL_BASH_FILES=()
if ((${#SCOPED_ARGS[@]} > 0)); then
echo -e "\nScoped mode: formatting only the files passed on argv"
for f in "${SCOPED_ARGS[@]}"; do
if [[ ! -e "${f}" ]]; then
echo " skip (missing): ${f}"
continue
fi
if [[ ! "${f}" =~ ${ALLOWED_EXT_RE} ]]; then
echo " skip (unsupported extension): ${f}"
continue
fi
ALL_BASH_FILES+=("${f}")
done
if ((${#ALL_BASH_FILES[@]} == 0)); then
echo "No eligible files after filtering — nothing to do."
exit 0
fi
else
board_config_files=$(find config/boards -type f \( -name "*.conf" -o -name "*.csc" -o -name "*.tvb" -o -name "*.eos" -o -name "*.wip" \))
family_config_files=$(find config/sources -type f \( -name "*.conf" -o -name "*.inc" -o -name "*.sh" \))
lib_files=$(find lib -type f -name "*.sh")
extensions_files=$(find extensions -type f -name "*.sh")
ALL_BASH_FILES=(compile.sh ${board_config_files} ${family_config_files} ${lib_files} ${extensions_files})
fi
echo -e "\nAll files:" "${ALL_BASH_FILES[@]}"
echo -e "\nShellfmt files differing:"
"${SHELLFMT_BIN}" -l "${ALL_BASH_FILES[@]}" | sort -h
echo -e "\nFormatting files..."
"${SHELLFMT_BIN}" -w "${ALL_BASH_FILES[@]}"
echo "Shellfmt finished!"