-
Notifications
You must be signed in to change notification settings - Fork 61
/
checks.bash
executable file
·154 lines (134 loc) · 3.8 KB
/
checks.bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env bash
# Copyright 2021 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
# This file will be run by `go test`.
# See all_test.go in this directory.
go version
# Ensure that installed go binaries are on the path.
# This bash expression follows the algorithm described at the top of
# `go install help`: first try $GOBIN, then $GOPATH/bin, then $HOME/go/bin.
go_install_dir=${GOBIN:-${GOPATH:-$HOME/go}/bin}
PATH=$PATH:$go_install_dir
source devtools/lib.sh
# ensure_go_binary verifies that a binary exists in $PATH corresponding to the
# given go-gettable URI. If no such binary exists, it is fetched via `go get`.
ensure_go_binary() {
local binary=$(basename $1)
if ! [ -x "$(command -v $binary)" ]; then
info "Installing: $1"
# Install the binary in a way that doesn't affect our go.mod file.
go install $1
fi
}
# verify_header checks that all given files contain the standard header for Go
# projects.
verify_header() {
if [[ "$@" != "" ]]; then
for FILE in $@
do
line="$(head -4 $FILE)"
if [[ ! $line == *"The Go Authors. All rights reserved."* ]] &&
[[ ! $line == "// DO NOT EDIT. This file was copied from" ]]; then
err "missing license header: $FILE"
fi
done
fi
}
# Support ** in globs for finding files throughout the tree.
shopt -s globstar
# check_headers checks that all source files that have been staged in this
# commit, and all other non-third-party files in the repo, have a license
# header.
check_headers() {
if [[ $# -gt 0 ]]; then
info "Checking listed files for license header"
verify_header $*
else
# Check code files that have been modified or added.
info "Checking go and sh files for license header"
verify_header $(find **/*.go -type f) $(find **/*.sh -type f)
fi
}
# check_unparam runs unparam on source files.
check_unparam() {
ensure_go_binary mvdan.cc/unparam
runcmd unparam ./...
}
# check_vet runs go vet on source files.
check_vet() {
runcmd go vet -all ./...
}
# check_staticcheck runs staticcheck on source files.
check_staticcheck() {
if [[ $(go version) = *go1.17* ]]; then
ensure_go_binary honnef.co/go/tools/cmd/staticcheck
runcmd staticcheck ./...
fi
}
# check_misspell runs misspell on source files.
check_misspell() {
ensure_go_binary github.com/client9/misspell/cmd/misspell
# exceptions:
# "github.com/unknwon/cae" - OK
# "github.com/julz/importas" - OK
# Ignore testdata files and the spelling.go file (which contains a list of replacements)
runcmd find . -type f | grep -v -e "spelling.go" -e "/testdata" | xargs misspell -i "unknwon,importas" -error
}
check_data_osv() {
commit=$(git log --name-status HEAD^..HEAD)
if [[ "$commit" =~ .*"D"."data/osv/".* ]]; then
err "Files in the data/osv/ directory should never be deleted. Use the withdrawn field instead to remove reports. See doc/format.md for details."
fi
}
go_linters() {
check_vet
check_staticcheck
check_misspell
check_unparam
}
go_modtidy() {
runcmd go mod tidy
}
runchecks() {
check_data_osv
check_headers
go_linters
go_modtidy
}
# checkoffline runs all checks that can be performed without network access.
checkoffline() {
check_data_osv
check_headers
check_vet
}
usage() {
cat <<EOUSAGE
Usage: $0 [subcommand]
Available subcommands:
help - display this help message
offline - run checks that do not require network access
EOUSAGE
}
main() {
case "$1" in
"-h" | "--help" | "help")
usage
exit 0
;;
"--offline" | "offline")
checkoffline
;;
"")
runchecks
;;
*)
usage
exit 1
esac
if [[ $EXIT_CODE != 0 ]]; then
err "checks.bash FAILED; see errors above"
fi
exit $EXIT_CODE
}
main $@