#!/bin/sh # script/gofumpt: run gofumpt over this repo's Go files. # # Takes exactly one mode argument, --write or --check, and runs the same # gofumpt version over the same files in both modes. script/fmt and # script/fmt-check both go through here, so what gets formatted and what # gets verified cannot drift apart. set -eu ROOT="$(cd "$(dirname "$0")/.." && pwd -P)" # The gofumpt script/bootstrap installs into bin/. Must match the pin # there. GOFUMPT_VERSION="v0.12.0" GOFUMPT="$ROOT/bin/gofumpt" usage() { echo "usage: script/gofumpt --write|--check" >&2 exit 2 } main() { [ "$#" -eq 1 ] || usage # A bin/gofumpt left from before the pin moved formats differently, so # it fails here until script/bootstrap replaces it. actual="$("$GOFUMPT" --version 2>/dev/null | cut -d' ' -f1)" if [ "$actual" != "$GOFUMPT_VERSION" ]; then echo "gofumpt: needs $GOFUMPT_VERSION in bin/gofumpt," \ "found: ${actual:-none}; run script/bootstrap" >&2 exit 1 fi # Every Go file in the repo, from $ROOT down. gofumpt holds generated # files, such as mfer/mf.pb.go, to gofmt's rules only. case "$1" in --write) "$GOFUMPT" -l -w "$ROOT" ;; --check) # Own line: a failing command inside `[ -n "$(...)" ]` does # not trip `set -e`, so a gofumpt that never ran would pass. unformatted="$("$GOFUMPT" -l "$ROOT")" if [ -n "$unformatted" ]; then echo "gofumpt: files need formatting (run make fmt):" >&2 echo "$unformatted" >&2 exit 1 fi ;; *) usage ;; esac } main "$@"