github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/grpc/vet.sh (about) 1 #!/bin/bash 2 3 set -ex # Exit on error; debugging enabled. 4 set -o pipefail # Fail a pipe if any sub-command fails. 5 6 # not makes sure the command passed to it does not exit with a return code of 0. 7 not() { 8 # This is required instead of the earlier (! $COMMAND) because subshells and 9 # pipefail don't work the same on Darwin as in Linux. 10 ! "$@" 11 } 12 13 die() { 14 echo "$@" >&2 15 exit 1 16 } 17 18 fail_on_output() { 19 tee /dev/stderr | not read 20 } 21 22 # Check to make sure it's safe to modify the user's git repo. 23 git status --porcelain | fail_on_output 24 25 # Undo any edits made by this script. 26 cleanup() { 27 git reset --hard HEAD 28 } 29 trap cleanup EXIT 30 31 PATH="${HOME}/go/bin:${GOROOT}/bin:${PATH}" 32 go version 33 34 if [[ "$1" = "-install" ]]; then 35 # Install the pinned versions as defined in module tools. 36 pushd ./test/tools 37 go install \ 38 golang.org/x/lint/golint \ 39 golang.org/x/tools/cmd/goimports \ 40 honnef.co/go/tools/cmd/staticcheck \ 41 github.com/client9/misspell/cmd/misspell 42 popd 43 if [[ -z "${VET_SKIP_PROTO}" ]]; then 44 if [[ "${TRAVIS}" = "true" ]]; then 45 PROTOBUF_VERSION=3.14.0 46 PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip 47 pushd /home/travis 48 wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} 49 unzip ${PROTOC_FILENAME} 50 bin/protoc --version 51 popd 52 elif [[ "${GITHUB_ACTIONS}" = "true" ]]; then 53 PROTOBUF_VERSION=3.14.0 54 PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip 55 pushd /home/runner/go 56 wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} 57 unzip ${PROTOC_FILENAME} 58 bin/protoc --version 59 popd 60 elif not which protoc > /dev/null; then 61 die "Please install protoc into your path" 62 fi 63 fi 64 exit 0 65 elif [[ "$#" -ne 0 ]]; then 66 die "Unknown argument(s): $*" 67 fi 68 69 # - Ensure all source files contain a copyright message. 70 not git grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)\|DO NOT EDIT" -- '*.go' 71 72 # - Make sure all tests in grpc and grpc/test use leakcheck via Teardown. 73 not grep 'func Test[^(]' *_test.go 74 not grep 'func Test[^(]' test/*.go 75 76 # - Do not import x/net/context. 77 not git grep -l 'x/net/context' -- "*.go" 78 79 # - Do not import math/rand for real library code. Use internal/grpcrand for 80 # thread safety. 81 git grep -l '"math/rand"' -- "*.go" 2>&1 | not grep -v '^examples\|^stress\|grpcrand\|^benchmark\|wrr_test' 82 83 # - Do not call grpclog directly. Use grpclog.Component instead. 84 git grep -l 'grpclog.I\|grpclog.W\|grpclog.E\|grpclog.F\|grpclog.V' -- "*.go" | not grep -v '^grpclog/component.go\|^internal/grpctest/tlogger_test.go' 85 86 # - Ensure all ptypes proto packages are renamed when importing. 87 not git grep "\(import \|^\s*\)\"github.com/golang/protobuf/ptypes/" -- "*.go" 88 89 # - Ensure all xds proto imports are renamed to *pb or *grpc. 90 git grep '"github.com/hxx258456/ccgo/go-control-plane/envoy' -- '*.go' ':(exclude)*.pb.go' | not grep -v 'pb "\|grpc "' 91 92 misspell -error . 93 94 # - Check that generated proto files are up to date. 95 if [[ -z "${VET_SKIP_PROTO}" ]]; then 96 PATH="/home/travis/bin:${PATH}" make proto && \ 97 git status --porcelain 2>&1 | fail_on_output || \ 98 (git status; git --no-pager diff; exit 1) 99 fi 100 101 # - gofmt, goimports, golint (with exceptions for generated code), go vet, 102 # go mod tidy. 103 # Perform these checks on each module inside gRPC. 104 for MOD_FILE in $(find . -name 'go.mod'); do 105 MOD_DIR=$(dirname ${MOD_FILE}) 106 pushd ${MOD_DIR} 107 go vet -all ./... | fail_on_output 108 gofmt -s -d -l . 2>&1 | fail_on_output 109 goimports -l . 2>&1 | not grep -vE "\.pb\.go" 110 golint ./... 2>&1 | not grep -vE "/testv3\.pb\.go:" 111 112 go mod tidy 113 git status --porcelain 2>&1 | fail_on_output || \ 114 (git status; git --no-pager diff; exit 1) 115 popd 116 done 117 118 # - Collection of static analysis checks 119 # 120 # TODO(dfawley): don't use deprecated functions in examples or first-party 121 # plugins. 122 SC_OUT="$(mktemp)" 123 staticcheck -go 1.9 -checks 'inherit,-ST1015' ./... > "${SC_OUT}" || true 124 # Error if anything other than deprecation warnings are printed. 125 not grep -v "is deprecated:.*SA1019" "${SC_OUT}" 126 # Only ignore the following deprecated types/fields/functions. 127 not grep -Fv '.CredsBundle 128 .HeaderMap 129 .Metadata is deprecated: use Attributes 130 .NewAddress 131 .NewServiceConfig 132 .Type is deprecated: use Attributes 133 BuildVersion is deprecated 134 balancer.ErrTransientFailure 135 balancer.Picker 136 extDesc.Filename is deprecated 137 github.com/golang/protobuf/jsonpb is deprecated 138 grpc.CallCustomCodec 139 grpc.Code 140 grpc.Compressor 141 grpc.CustomCodec 142 grpc.Decompressor 143 grpc.MaxMsgSize 144 grpc.MethodConfig 145 grpc.NewGZIPCompressor 146 grpc.NewGZIPDecompressor 147 grpc.RPCCompressor 148 grpc.RPCDecompressor 149 grpc.ServiceConfig 150 grpc.WithBalancerName 151 grpc.WithCompressor 152 grpc.WithDecompressor 153 grpc.WithDialer 154 grpc.WithMaxMsgSize 155 grpc.WithServiceConfig 156 grpc.WithTimeout 157 http.CloseNotifier 158 info.SecurityVersion 159 proto is deprecated 160 proto.InternalMessageInfo is deprecated 161 proto.EnumName is deprecated 162 proto.ErrInternalBadWireType is deprecated 163 proto.FileDescriptor is deprecated 164 proto.Marshaler is deprecated 165 proto.MessageType is deprecated 166 proto.RegisterEnum is deprecated 167 proto.RegisterFile is deprecated 168 proto.RegisterType is deprecated 169 proto.RegisterExtension is deprecated 170 proto.RegisteredExtension is deprecated 171 proto.RegisteredExtensions is deprecated 172 proto.RegisterMapType is deprecated 173 proto.Unmarshaler is deprecated 174 resolver.Backend 175 resolver.GRPCLB 176 Target is deprecated: Use the Target field in the BuildOptions instead. 177 xxx_messageInfo_ 178 ' "${SC_OUT}" 179 180 # - special golint on package comments. 181 lint_package_comment_per_package() { 182 # Number of files in this go package. 183 fileCount=$(go list -f '{{len .GoFiles}}' $1) 184 if [ ${fileCount} -eq 0 ]; then 185 return 0 186 fi 187 # Number of package errors generated by golint. 188 lintPackageCommentErrorsCount=$(golint --min_confidence 0 $1 | grep -c "should have a package comment") 189 # golint complains about every file that's missing the package comment. If the 190 # number of files for this package is greater than the number of errors, there's 191 # at least one file with package comment, good. Otherwise, fail. 192 if [ ${fileCount} -le ${lintPackageCommentErrorsCount} ]; then 193 echo "Package $1 (with ${fileCount} files) is missing package comment" 194 return 1 195 fi 196 } 197 lint_package_comment() { 198 set +ex 199 200 count=0 201 for i in $(go list ./...); do 202 lint_package_comment_per_package "$i" 203 ((count += $?)) 204 done 205 206 set -ex 207 return $count 208 } 209 lint_package_comment 210 211 echo SUCCESS