VictoriaMetrics/vendor/google.golang.org/grpc/vet.sh

213 lines
6.6 KiB
Bash
Raw Normal View History

#!/bin/bash
set -ex # Exit on error; debugging enabled.
set -o pipefail # Fail a pipe if any sub-command fails.
2020-04-24 14:28:31 +02:00
# not makes sure the command passed to it does not exit with a return code of 0.
not() {
# This is required instead of the earlier (! $COMMAND) because subshells and
# pipefail don't work the same on Darwin as in Linux.
! "$@"
}
die() {
echo "$@" >&2
exit 1
}
fail_on_output() {
2020-04-24 14:28:31 +02:00
tee /dev/stderr | not read
}
# Check to make sure it's safe to modify the user's git repo.
git status --porcelain | fail_on_output
# Undo any edits made by this script.
cleanup() {
git reset --hard HEAD
}
trap cleanup EXIT
2021-04-08 00:00:36 +02:00
PATH="${HOME}/go/bin:${GOROOT}/bin:${PATH}"
go version
if [[ "$1" = "-install" ]]; then
2021-07-07 15:10:33 +02:00
# Install the pinned versions as defined in module tools.
pushd ./test/tools
go install \
golang.org/x/lint/golint \
golang.org/x/tools/cmd/goimports \
honnef.co/go/tools/cmd/staticcheck \
github.com/client9/misspell/cmd/misspell
popd
if [[ -z "${VET_SKIP_PROTO}" ]]; then
2023-03-25 02:08:06 +01:00
if [[ "${GITHUB_ACTIONS}" = "true" ]]; then
PROTOBUF_VERSION=22.0 # a.k.a v4.22.0 in pb.go files.
2020-11-13 12:08:34 +01:00
PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip
pushd /home/runner/go
wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME}
unzip ${PROTOC_FILENAME}
bin/protoc --version
popd
2020-04-24 14:28:31 +02:00
elif not which protoc > /dev/null; then
die "Please install protoc into your path"
fi
fi
exit 0
elif [[ "$#" -ne 0 ]]; then
die "Unknown argument(s): $*"
fi
2023-02-08 17:55:14 +01:00
# - Check that generated proto files are up to date.
if [[ -z "${VET_SKIP_PROTO}" ]]; then
2023-03-25 02:08:06 +01:00
make proto && git status --porcelain 2>&1 | fail_on_output || \
2023-02-08 17:55:14 +01:00
(git status; git --no-pager diff; exit 1)
fi
if [[ -n "${VET_ONLY_PROTO}" ]]; then
exit 0
fi
# - Ensure all source files contain a copyright message.
2022-11-22 10:26:16 +01:00
# (Done in two parts because Darwin "git grep" has broken support for compound
# exclusion matches.)
(grep -L "DO NOT EDIT" $(git grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)" -- '*.go') || true) | fail_on_output
# - Make sure all tests in grpc and grpc/test use leakcheck via Teardown.
2020-04-24 14:28:31 +02:00
not grep 'func Test[^(]' *_test.go
not grep 'func Test[^(]' test/*.go
# - Do not import x/net/context.
2020-04-24 14:28:31 +02:00
not git grep -l 'x/net/context' -- "*.go"
# - Do not import math/rand for real library code. Use internal/grpcrand for
# thread safety.
2020-04-24 14:28:31 +02:00
git grep -l '"math/rand"' -- "*.go" 2>&1 | not grep -v '^examples\|^stress\|grpcrand\|^benchmark\|wrr_test'
2023-09-07 12:34:14 +02:00
# - Do not use "interface{}"; use "any" instead.
git grep -l 'interface{}' -- "*.go" 2>&1 | not grep -v '\.pb\.go\|protoc-gen-go-grpc'
2020-09-10 08:49:55 +02:00
# - Do not call grpclog directly. Use grpclog.Component instead.
2022-11-22 10:26:16 +01:00
git grep -l -e 'grpclog.I' --or -e 'grpclog.W' --or -e 'grpclog.E' --or -e 'grpclog.F' --or -e 'grpclog.V' -- "*.go" | not grep -v '^grpclog/component.go\|^internal/grpctest/tlogger_test.go'
2020-09-10 08:49:55 +02:00
# - Ensure all ptypes proto packages are renamed when importing.
2020-04-24 14:28:31 +02:00
not git grep "\(import \|^\s*\)\"github.com/golang/protobuf/ptypes/" -- "*.go"
2023-10-31 20:19:51 +01:00
# - Ensure all usages of grpc_testing package are renamed when importing.
not git grep "\(import \|^\s*\)\"google.golang.org/grpc/interop/grpc_testing" -- "*.go"
2020-06-25 22:42:41 +02:00
# - Ensure all xds proto imports are renamed to *pb or *grpc.
2020-09-10 08:49:55 +02:00
git grep '"github.com/envoyproxy/go-control-plane/envoy' -- '*.go' ':(exclude)*.pb.go' | not grep -v 'pb "\|grpc "'
2019-12-26 18:42:48 +01:00
misspell -error .
2021-05-20 17:38:21 +02:00
# - gofmt, goimports, golint (with exceptions for generated code), go vet,
# go mod tidy.
# Perform these checks on each module inside gRPC.
for MOD_FILE in $(find . -name 'go.mod'); do
MOD_DIR=$(dirname ${MOD_FILE})
pushd ${MOD_DIR}
go vet -all ./... | fail_on_output
gofmt -s -d -l . 2>&1 | fail_on_output
goimports -l . 2>&1 | not grep -vE "\.pb\.go"
2022-03-16 12:55:03 +01:00
golint ./... 2>&1 | not grep -vE "/grpc_testing_not_regenerate/.*\.pb\.go:"
2021-05-20 17:38:21 +02:00
2023-09-07 12:34:14 +02:00
go mod tidy -compat=1.19
2020-08-05 10:15:42 +02:00
git status --porcelain 2>&1 | fail_on_output || \
(git status; git --no-pager diff; exit 1)
2021-05-20 17:38:21 +02:00
popd
done
# - Collection of static analysis checks
2019-12-26 18:42:48 +01:00
#
# TODO(dfawley): don't use deprecated functions in examples or first-party
# plugins.
2023-01-11 03:58:34 +01:00
# TODO(dfawley): enable ST1019 (duplicate imports) but allow for protobufs.
2019-12-26 18:42:48 +01:00
SC_OUT="$(mktemp)"
2023-01-11 03:58:34 +01:00
staticcheck -go 1.19 -checks 'inherit,-ST1015,-ST1019,-SA1019' ./... > "${SC_OUT}" || true
2019-12-26 18:42:48 +01:00
# Error if anything other than deprecation warnings are printed.
2020-04-24 14:28:31 +02:00
not grep -v "is deprecated:.*SA1019" "${SC_OUT}"
2019-12-26 18:42:48 +01:00
# Only ignore the following deprecated types/fields/functions.
2020-06-25 22:42:41 +02:00
not grep -Fv '.CredsBundle
2019-12-26 18:42:48 +01:00
.HeaderMap
2020-06-25 22:42:41 +02:00
.Metadata is deprecated: use Attributes
2019-12-26 18:42:48 +01:00
.NewAddress
.NewServiceConfig
.Type is deprecated: use Attributes
2021-04-08 00:00:36 +02:00
BuildVersion is deprecated
2020-06-25 22:42:41 +02:00
balancer.ErrTransientFailure
2019-12-26 18:42:48 +01:00
balancer.Picker
2021-04-08 00:00:36 +02:00
extDesc.Filename is deprecated
github.com/golang/protobuf/jsonpb is deprecated
2019-12-26 18:42:48 +01:00
grpc.CallCustomCodec
grpc.Code
grpc.Compressor
2020-08-05 10:15:42 +02:00
grpc.CustomCodec
2019-12-26 18:42:48 +01:00
grpc.Decompressor
grpc.MaxMsgSize
grpc.MethodConfig
grpc.NewGZIPCompressor
grpc.NewGZIPDecompressor
grpc.RPCCompressor
grpc.RPCDecompressor
grpc.ServiceConfig
grpc.WithCompressor
grpc.WithDecompressor
grpc.WithDialer
grpc.WithMaxMsgSize
grpc.WithServiceConfig
grpc.WithTimeout
http.CloseNotifier
info.SecurityVersion
2020-11-13 12:08:34 +01:00
proto is deprecated
proto.InternalMessageInfo is deprecated
proto.EnumName is deprecated
proto.ErrInternalBadWireType is deprecated
proto.FileDescriptor is deprecated
proto.Marshaler is deprecated
proto.MessageType is deprecated
proto.RegisterEnum is deprecated
proto.RegisterFile is deprecated
proto.RegisterType is deprecated
proto.RegisterExtension is deprecated
proto.RegisteredExtension is deprecated
proto.RegisteredExtensions is deprecated
proto.RegisterMapType is deprecated
2021-04-08 00:00:36 +02:00
proto.Unmarshaler is deprecated
Target is deprecated: Use the Target field in the BuildOptions instead.
xxx_messageInfo_
' "${SC_OUT}"
2020-04-24 14:28:31 +02:00
2020-06-25 22:42:41 +02:00
# - special golint on package comments.
lint_package_comment_per_package() {
# Number of files in this go package.
fileCount=$(go list -f '{{len .GoFiles}}' $1)
if [ ${fileCount} -eq 0 ]; then
return 0
fi
# Number of package errors generated by golint.
lintPackageCommentErrorsCount=$(golint --min_confidence 0 $1 | grep -c "should have a package comment")
# golint complains about every file that's missing the package comment. If the
# number of files for this package is greater than the number of errors, there's
# at least one file with package comment, good. Otherwise, fail.
if [ ${fileCount} -le ${lintPackageCommentErrorsCount} ]; then
echo "Package $1 (with ${fileCount} files) is missing package comment"
return 1
fi
}
lint_package_comment() {
set +ex
count=0
for i in $(go list ./...); do
lint_package_comment_per_package "$i"
((count += $?))
done
set -ex
return $count
}
lint_package_comment
2020-04-24 14:28:31 +02:00
echo SUCCESS