From 4d2b00f612ed2ade6dd95387c92c6b8044e3b335 Mon Sep 17 00:00:00 2001
From: Ryan Richard <richardry@vmware.com>
Date: Thu, 8 Aug 2024 09:57:07 -0700
Subject: [PATCH] auto-update toolchain directives in go.mod files

Also ran the auto-formatter on the shell script.
---
 hack/update-go-mod/update-go-mod.sh | 32 +++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/hack/update-go-mod/update-go-mod.sh b/hack/update-go-mod/update-go-mod.sh
index b952a93f1..ab3c0844c 100755
--- a/hack/update-go-mod/update-go-mod.sh
+++ b/hack/update-go-mod/update-go-mod.sh
@@ -1,22 +1,38 @@
 #!/usr/bin/env bash
 
-# Copyright 2023 the Pinniped contributors. All Rights Reserved.
+# Copyright 2023-2024 the Pinniped contributors. All Rights Reserved.
 # SPDX-License-Identifier: Apache-2.0
 
 set -euo pipefail
 
-SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
 ROOT_DIR="$SCRIPT_DIR/../.."
 
 GO_MOD="${ROOT_DIR}/go.mod"
 
-pushd "${SCRIPT_DIR}" > /dev/null
-  script=$(go run . "${GO_MOD}" overrides.conf)
-popd > /dev/null
+pushd "${SCRIPT_DIR}" >/dev/null
+script=$(go run . "${GO_MOD}" overrides.conf)
+popd >/dev/null
 
 # Print to screen for debugging purposes.
 echo "$script"
 
-pushd "${ROOT_DIR}" > /dev/null
-  eval "$script"
-popd > /dev/null
+pushd "${ROOT_DIR}" >/dev/null
+eval "$script"
+popd >/dev/null
+
+# This script assumes that you are using the latest version of Go so it can detect its
+# version and update all the go.mod files to use that version.
+go_version="$(go version | cut -d ' ' -f3 | sed 's/^go//')"
+echo "Using Go version $go_version to update toolchain directives in go.mod files..."
+
+pushd "${ROOT_DIR}" >/dev/null
+# Find all go.mod files that include a toolchain directive.
+grep -E -l '^toolchain ' $(find . -name go.mod) | while IFS= read -r gomod_file; do
+  pushd "$(dirname "$gomod_file")" >/dev/null
+  echo "Updating toolchain in $gomod_file"
+  # Also update toolchain directive in go.mod to match the version of Go used by this job.
+  go get toolchain@"$(go version | cut -d ' ' -f3 | sed 's/^go//')"
+  popd >/dev/null
+done
+popd >/dev/null