#!/usr/bin/env bash # Copyright 2021 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. # This script generates mock files using mockgen. # Usage: `hack/update-mocks.sh`. set -o errexit set -o nounset set -o pipefail KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. source "${KUBE_ROOT}/hack/lib/init.sh" kube::golang::setup_env echo 'installing mockgen' go -C "${KUBE_ROOT}/hack/tools" install github.com/golang/mock/mockgen function git_grep() { git grep --untracked --exclude-standard \ "$@" \ ':!:vendor/*' `# catches vendor/...` \ ':!:*/vendor/*' `# catches any subdir/vendor/...` \ ':!:third_party/*' `# catches third_party/...` \ ':!:*/third_party/*' `# catches third_party/...` \ ':!:*/testdata/*' `# catches any testdata` \ ':(glob)**/*.go' } cd "${KUBE_ROOT}" GENERATED_MOCK_FILE_REGEX="^// Code generated by MockGen. DO NOT EDIT.$" # pick a tempfile path for writing to tmp=$(mktemp) kube::util::trap_add "rm -f ${tmp:?}" EXIT git_grep -l -z "${GENERATED_MOCK_FILE_REGEX}" | xargs -0 rm -f echo 'executing go generate command on below files' git_grep -l -z "//go:generate mockgen" | while read -r -d $'\0' file; do echo "- ${file}" temp_file_name="$(kube::realpath "$(mktemp -t "$(basename "$0").XXXXXX")")" # search for build tag used in file build_tag_string=$(grep -o '+build.*$' "$file") || true # if the file does not have build string if [ -n "$build_tag_string" ]; then # write the build tag in the temp file echo -n "$build_tag_string" > "$temp_file_name" # if +build tag is defined in interface file BUILD_TAG_FILE=$temp_file_name go generate -v "$file" else # if no +build tag is defined in interface file # NOTE: This works around a bug in `go generate` with workspaces, which # should be fixed in Go 1.22.1. go -C "$(dirname "$file")" generate "$(basename "$file")" fi done # get the changed or new mock files git ls-files -mo --exclude-standard -z | while read -r -d $'\0' file; do # only process files that appear to be mocks test -f "$file" || continue grep -q "${GENERATED_MOCK_FILE_REGEX}" "$file" || continue # search for build tags used in file # //go:build !providerless # // +build !providerless go_build_tag_string=$(grep -o 'go:build.*$' "$file") || true build_tag_string=$(grep -o '+build.*$' "$file") || true new_header='' # if the file has both headers if [ -n "$build_tag_string" ] && [ -n "$go_build_tag_string" ] then # create a new header with the build string and the copyright text new_header=$(echo -e "//""$go_build_tag_string""\n""//" "$build_tag_string""\n" | cat - hack/boilerplate/boilerplate.generatego.txt) # ignore the first line (build tag) from the file tail -n +3 "$file" >"${tmp}" fi # if the file has only // +build !providerless header if [ -n "$build_tag_string" ] && [ -z "$go_build_tag_string" ] then # create a new header with the build string and the copyright text new_header=$(echo -e "//" "$build_tag_string""\n" | cat - hack/boilerplate/boilerplate.generatego.txt) # ignore the first line (build tag) from the file tail -n +2 "$file" >"${tmp}" fi # if the file has only //go:build !providerless header if [ -z "$build_tag_string" ] && [ -n "$go_build_tag_string" ] then # create a new header with the build string and the copyright text new_header=$(echo -e "//""$go_build_tag_string""\n" | cat - hack/boilerplate/boilerplate.generatego.txt) # ignore the first line (build tag) from the file tail -n +2 "$file" >"${tmp}" fi # if the header is generated if [ -n "$new_header" ] then # write the newly generated header file to the original file echo -e "$new_header" | cat - "${tmp}" > "$file" else # if no build string insert at the top cat hack/boilerplate/boilerplate.generatego.txt "$file" >"${tmp}" && \ mv "${tmp}" "$file" fi done