#!/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
