Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added presubmit script distilled from that in trillian #29

Merged
merged 1 commit into from
May 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions scripts/check_license.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/bin/bash
pav-kv marked this conversation as resolved.
Show resolved Hide resolved
#
# 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 <path>"
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 "$@"
115 changes: 115 additions & 0 deletions scripts/presubmit.sh
Original file line number Diff line number Diff line change
@@ -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 "$@"