diff --git a/Makefile b/Makefile index 98e29ab84f..5258fec7ba 100644 --- a/Makefile +++ b/Makefile @@ -25,6 +25,7 @@ SHELL:=/usr/bin/env bash # GO_VERSION ?= 1.21.9 GO_CONTAINER_IMAGE ?= docker.io/library/golang:$(GO_VERSION) +GO_DIRECTIVE_VERSION ?= 1.21.0 # Use GOPROXY environment variable if set GOPROXY := $(shell go env GOPROXY) @@ -424,11 +425,15 @@ APIDIFF_OLD_COMMIT ?= $(shell git rev-parse origin/main) apidiff: $(GO_APIDIFF) ## Check for API differences $(GO_APIDIFF) $(APIDIFF_OLD_COMMIT) --print-compatible -ALL_VERIFY_CHECKS = licenses boilerplate shellcheck modules gen conversions doctoc flavors import-restrictions +ALL_VERIFY_CHECKS = licenses boilerplate shellcheck modules gen conversions doctoc flavors import-restrictions go-directive .PHONY: verify verify: $(addprefix verify-,$(ALL_VERIFY_CHECKS)) ## Run all verify-* targets +.PHONY: verify-go-directive +verify-go-directive: + TRACE=$(TRACE) ./hack/verify-go-directive.sh -g $(GO_DIRECTIVE_VERSION) + .PHONY: verify-modules verify-modules: generate-modules ## Verify go modules are up to date @if !(git diff --quiet HEAD -- go.sum go.mod $(TEST_DIR)/go.mod $(TEST_DIR)/go.sum); then \ diff --git a/hack/verify-go-directive.sh b/hack/verify-go-directive.sh new file mode 100755 index 0000000000..1d9c170f4e --- /dev/null +++ b/hack/verify-go-directive.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash + +# Copyright 2024 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +if [[ "${TRACE-0}" == "1" ]]; then + set -o xtrace +fi + +function usage { + local script + script="$(basename "$0")" + + cat >&2 <] +This script should be run at the root of a module. +-g + Compare the go directive in the local working copy's go.mod + to the specified maximum version it can be. Versions provided + here are of the form 1.x.y, without the 'go' prefix. +Examples: + ${script} -g 1.21.10 +EOF + exit 1 +} + +max="" +while getopts g: opt +do case "$opt" in + g) max="$OPTARG";; + [?]) usage;; + esac +done + +# If max is empty, print usage +if [[ -z "${max}" ]]; then + usage; +fi + +# If go directive is not specified as 1.x.y, print usage +if [[ ! "${max}" =~ ^1(\.[0-9]+){2}$ ]]; then + usage; +fi + +dir="" +if [[ -z "${dir}" ]]; then + dir="." +fi + +find "${dir}" -name "go.mod" -type f -print0 | while IFS= read -r -d '' file; do + echo "Running go directive verify test for ${file} against ${max}" + current=$(grep '^go [1-9]*' go.mod | cut -d ' ' -f2) + if [[ -z "${current}" ]]; then + echo >&2 "FAIL: could not get value of Go directive from ${file}" + exit 1 + fi + + if ! printf '%s\n' "${current}" "${max}" | sort --check=silent --version-sort; then + echo >&2 "FAIL: current Go directive ${current} is greater than ${max}" + exit 1 + fi +done \ No newline at end of file