libexec/shellspec-syntax-check.sh
#!/bin/sh
set -eu
# shellcheck source=lib/libexec/translator.sh
. "${SHELLSPEC_LIB:-./lib}/libexec/translator.sh"
exit_status='' syntax_error=''
trans() {
case $1 in (constant)
# shellcheck disable=SC2145
"trans_$@"
esac
}
trans_constant() {
eval "$1=\\'$2\\'"
}
syntax_error() {
putsn "Syntax error: $1 in $specfile line $lineno${2+:}${2:-}" >&2
syntax_error=1
}
error_handler() {
error=0
while IFS= read -r line; do
case $line in
# Do not fail the warnings of ksh 2020.0.0
*:\ warning:\ line\ *) warn "$line"; ;;
*) error "$line"; error=1
esac
done
return "$error"
}
syntax_check() {
initialize
translate < "$1"
finalize
[ "$syntax_error" ] && return 1
$SHELLSPEC_SHELL -n "$1"
}
one_line_syntax_check() {
set -- "$1" "shellspec_syntax_check() { : ${2}${LF} }"
eval "$1=\$( eval \"\$2\" 2>&1 )" && return 0
eval "$1=\"\${$1%%\$LF*}\""
eval "$1=\"\${$1##*:}\""
return 1
}
specfile() {
specfile=$2
putsn "$specfile"
( ( ( syntax_check "$specfile" >&3; echo $? >&5 ) 2>&1 \
| ( error_handler >&2; echo $? >&5 ) ) 5>&1 \
| (
xs=0
read -r xs1; read -r xs2
[ "$xs1" -eq 0 ] || xs="$xs1"
[ "$xs2" -eq 0 ] || xs="$xs2"
set_exit_status "$xs"
)
) 3>&1 || exit_status=$?
}
find_specfiles specfile "$@"
exit "${exit_status:-0}"