#!/bin/sh # script/fmt-check: check formatting (read-only). set -eu ROOT="$(cd "$(dirname "$0")/.." && pwd -P)" # Must match the pin in script/bootstrap. NODE_VERSION="22.17.0" # script/bootstrap installs node and yarn under nvm and leaves neither # on the PATH of the shell that called it, so resolve the pinned # toolchain here the way bootstrap's own install step does. nvm is a # bash script, hence the subshell. run_yarn() { if command -v yarn >/dev/null 2>&1; then exec yarn "$@" fi if [ ! -s "$HOME/.nvm/nvm.sh" ]; then echo "fmt-check: no yarn; run script/bootstrap first" >&2 exit 1 fi exec bash -c '. "$HOME/.nvm/nvm.sh" && nvm use "$1" >/dev/null && shift && exec yarn "$@"' bash "$NODE_VERSION" "$@" } main() { cd "$ROOT" status=0 # gofmt and prettier both run every time, so the output names each # one that fails. Under set -e a bare assignment would end the # script when gofmt fails (a Go file it cannot parse). if ! files="$(gofmt -s -l .)"; then echo "gofmt: failed; see its errors above" >&2 status=1 fi if [ -n "$files" ]; then echo "gofmt: files not formatted:" >&2 echo "$files" >&2 status=1 fi # run_yarn ends in exec; the subshell returns here afterwards. (run_yarn run prettier --check '**/*.md' --tab-width 4 --prose-wrap always) || status=1 exit "$status" } main "$@"