From ded06cea12ddf4e0a3863fc6ec407f815192b308 Mon Sep 17 00:00:00 2001 From: Martin Hutchinson Date: Fri, 27 May 2022 14:04:42 +0100 Subject: [PATCH] Added presubmit script distilled from that in trillian (#29) Removed some of the flags and branches that weren't needed, such as code generation. This isn't hooked into CI _yet_, but at least developers can run `./scripts/presubmit.sh` before submitting in the meantime. --- scripts/check_license.sh | 46 ++++++++++++++++ scripts/presubmit.sh | 115 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100755 scripts/check_license.sh create mode 100755 scripts/presubmit.sh diff --git a/scripts/check_license.sh b/scripts/check_license.sh new file mode 100755 index 0000000..d60889f --- /dev/null +++ b/scripts/check_license.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# +# Checks that source files (.go and .proto) have the Apache License header. +# Automatically skips generated files. +set -eu + +check_license() { + local path="$1" + + if head -1 "$path" | grep -iq 'generated by'; then + return 0 + fi + + # Look for "Apache License" on the file header + if ! head -10 "$path" | grep -q 'Apache License'; then + # Format: $path:$line:$message + echo "$path:10:license header not found" + return 1 + fi +} + +main() { + if [[ $# -lt 1 ]]; then + echo "Usage: $0 " + exit 1 + fi + + local code=0 + while [[ $# -gt 0 ]]; do + local path="$1" + if [[ -d "$path" ]]; then + for f in "$path"/*.{go,proto}; do + if [[ ! -f "$f" ]]; then + continue # Empty glob + fi + check_license "$f" || code=1 + done + else + check_license "$path" || code=1 + fi + shift + done + exit $code +} + +main "$@" diff --git a/scripts/presubmit.sh b/scripts/presubmit.sh new file mode 100755 index 0000000..466fa80 --- /dev/null +++ b/scripts/presubmit.sh @@ -0,0 +1,115 @@ +#!/bin/bash +# +# Presubmit checks for this repository. +# +# Checks for lint errors, spelling, licensing, correct builds / tests and so on. +# Flags may be specified to allow suppressing of checks or automatic fixes, try +# `scripts/presubmit.sh --help` for details. +# +# Globals: +# GO_TEST_TIMEOUT: timeout for 'go test'. Optional (defaults to 5m). +set -eu + +check_pkg() { + local cmd="$1" + local pkg="$2" + check_cmd "$cmd" "try running 'go get -u $pkg'" +} + +check_cmd() { + local cmd="$1" + local msg="$2" + if ! type -p "${cmd}" > /dev/null; then + echo "${cmd} not found, ${msg}" + return 1 + fi +} + +usage() { + echo "$0 [--coverage] [--fix] [--no-mod-tidy] [--no-build] [--no-linters]" +} + +main() { + local coverage=0 + local fix=0 + local run_mod_tidy=1 + local run_build=1 + local run_lint=1 + while [[ $# -gt 0 ]]; do + case "$1" in + --coverage) + coverage=1 + ;; + --fix) + fix=1 + ;; + --no-mod-tidy) + run_mod_tidy=0 + ;; + --help) + usage + exit 0 + ;; + --no-build) + run_build=0 + ;; + --no-linters) + run_lint=0 + ;; + *) + usage + exit 1 + ;; + esac + shift 1 + done + + cd "$(dirname "$0")" # at scripts/ + cd .. # at top level + + go_srcs="$(find . -name '*.go' | \ + grep -v mock_ | \ + grep -v .pb.go | \ + grep -v _string.go | \ + grep -v .shims.go | \ + tr '\n' ' ')" + + if [[ "$fix" -eq 1 ]]; then + check_pkg goimports golang.org/x/tools/cmd/goimports || exit 1 + + echo 'running gofmt' + gofmt -s -w ${go_srcs} + echo 'running goimports' + goimports -w ${go_srcs} + if [[ "$run_mod_tidy" -eq 1 ]]; then + echo 'running go mod tidy' + go mod tidy + fi + fi + + if [[ "${run_build}" -eq 1 ]]; then + echo 'running go build' + go build ./... + + export TEST_FLAGS="-timeout=${GO_TEST_TIMEOUT:-5m}" + + if [[ ${coverage} -eq 1 ]]; then + TEST_FLAGS+=" -covermode=atomic -coverprofile=coverage.txt" + fi + + echo "running go test ${TEST_FLAGS} ./..." + go test ${TEST_FLAGS} ./... + fi + + if [[ "${run_lint}" -eq 1 ]]; then + check_cmd golangci-lint \ + 'have you installed github.com/golangci/golangci-lint?' || exit 1 + + echo 'running golangci-lint' + golangci-lint run --deadline=8m + echo 'checking license headers' + ./scripts/check_license.sh ${go_srcs} + fi +} + +main "$@"