From 87c6b0d69fed6f705fba814f764275eecbbb82ad Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Thu, 7 Dec 2023 19:45:32 -0800 Subject: [PATCH] Smallish update-vendor cleanup --- hack/update-vendor.sh | 71 +++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/hack/update-vendor.sh b/hack/update-vendor.sh index f1c46982fa0..03fcb3255b5 100755 --- a/hack/update-vendor.sh +++ b/hack/update-vendor.sh @@ -24,6 +24,8 @@ cd "$(pwd -P)" KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. source "${KUBE_ROOT}/hack/lib/init.sh" +# Turn off workspaces until we are ready for them later +export GOWORK=off # Explicitly opt into go modules, even though we're inside a GOPATH directory export GO111MODULE=on # Explicitly set GOFLAGS to ignore vendor, since GOFLAGS=-mod=vendor breaks dependency resolution while rebuilding vendor @@ -86,12 +88,13 @@ function ensure_require_replace_directives_for_all_dependencies() { # Propagate root replace/require directives into staging modules, in case we are downgrading, so they don't bump the root required version back up for repo in $(kube::util::list_staging_repos); do - pushd "staging/src/k8s.io/${repo}" >/dev/null 2>&1 + ( + cd "staging/src/k8s.io/${repo}" jq -r '"-require \(.Path)@\(.Version)"' < "${require_json}" \ | xargs -L 100 go mod edit -fmt jq -r '"-replace \(.Old.Path)=\(.New.Path)@\(.New.Version)"' < "${replace_json}" \ | xargs -L 100 go mod edit -fmt - popd >/dev/null 2>&1 + ) done # tidy to ensure require directives are added for indirect dependencies @@ -178,14 +181,16 @@ function add_generated_comments() { # Phase 1: ensure go.mod files for staging modules and main module for repo in $(kube::util::list_staging_repos); do - pushd "staging/src/k8s.io/${repo}" >/dev/null 2>&1 + ( + cd "staging/src/k8s.io/${repo}" + if [[ ! -f go.mod ]]; then kube::log::status "go.mod: initialize ${repo}" >&11 rm -f Godeps/Godeps.json # remove before initializing, staging Godeps are not authoritative go mod init "k8s.io/${repo}" go mod edit -fmt fi - popd >/dev/null 2>&1 + ) done if [[ ! -f go.mod ]]; then @@ -205,7 +210,7 @@ go mod edit -json \ go mod edit -json \ | jq -r '.Replace[]? | select(.New.Path | startswith("./staging/")) | "-dropreplace \(.Old.Path)"' \ | xargs -L 100 go mod edit -fmt -# Readd +# Re-add kube::util::list_staging_repos \ | while read -r X; do echo "-require k8s.io/${X}@v0.0.0"; done \ | xargs -L 100 go mod edit -fmt @@ -229,7 +234,9 @@ group_directives kube::log::status "go.mod: propagate to staging modules" >&11 for repo in $(kube::util::list_staging_repos); do - pushd "staging/src/k8s.io/${repo}" >/dev/null 2>&1 + ( + cd "staging/src/k8s.io/${repo}" + echo "=== propagating to ${repo}" # copy root go.mod, changing module name sed "s#module k8s.io/kubernetes#module k8s.io/${repo}#" \ @@ -243,7 +250,7 @@ for repo in $(kube::util::list_staging_repos); do kube::util::list_staging_repos \ | while read -r X; do echo "-replace k8s.io/${X}=../${X}"; done \ | xargs -L 100 go mod edit - popd >/dev/null 2>&1 + ) done @@ -265,20 +272,31 @@ while IFS= read -r repo; do # record existence of the repo to ensure modules with no peer relationships still get included in the order echo "${repo} ${repo}" >> "${TMP_DIR}/tidy_deps.txt" - pushd "${KUBE_ROOT}/staging/src/${repo}" >/dev/null 2>&1 + ( + cd "${KUBE_ROOT}/staging/src/${repo}" + # save the original go.mod, since go list doesn't just add missing entries, it also removes specific required versions from it tmp_go_mod="${TMP_DIR}/tidy_${repo/\//_}_go.mod.original" tmp_go_deps="${TMP_DIR}/tidy_${repo/\//_}_deps.txt" cp go.mod "${tmp_go_mod}" - { - echo "=== sorting ${repo}" - # 'go list' calculates direct imports and updates go.mod so that go list -m lists our module dependencies - echo "=== computing imports for ${repo}" - go list all - echo "=== computing tools imports for ${repo}" - go list -e -tags=tools all - } + echo "=== sorting ${repo}" + # 'go list' calculates direct imports and updates go.mod so that go list -m lists our module dependencies + echo "=== computing imports for ${repo}" + go list all + # ignore errors related to importing `package main` packages, but catch + # other errors (https://github.com/golang/go/issues/59186) + errs=() + kube::util::read-array errs < <( + go list -e -tags=tools -json all | jq -r '.Error.Err | select( . != null )' \ + | grep -v "is a program, not an importable package" + ) + if (( "${#errs[@]}" != 0 )); then + for err in "${errs[@]}"; do + echo "${err}" >&2 + done + exit 1 + fi # capture module dependencies go list -m -f '{{if not .Main}}{{.Path}}{{end}}' all > "${tmp_go_deps}" @@ -293,12 +311,13 @@ while IFS= read -r repo; do # switch the required version to an explicit v0.0.0 (rather than an unknown v0.0.0-00010101000000-000000000000) go mod edit -require "${dep}@v0.0.0" done - popd >/dev/null 2>&1 + ) done < "${tidy_unordered}" kube::log::status "go.mod: tidying" >&11 for repo in $(tsort "${TMP_DIR}/tidy_deps.txt"); do - pushd "${KUBE_ROOT}/staging/src/${repo}" >/dev/null 2>&1 + ( + cd "${KUBE_ROOT}/staging/src/${repo}" echo "=== tidying ${repo}" # prune replace directives that pin to the naturally selected version. @@ -318,8 +337,8 @@ for repo in $(tsort "${TMP_DIR}/tidy_deps.txt"); do # disallow transitive dependencies on k8s.io/kubernetes loopback_deps=() kube::util::read-array loopback_deps < <(go list all 2>/dev/null | grep k8s.io/kubernetes/ || true) - if [[ -n ${loopback_deps[*]:+"${loopback_deps[*]}"} ]]; then - kube::log::error "Disallowed ${repo} -> k8s.io/kubernetes dependencies exist via the following imports: $(go mod why "${loopback_deps[@]}")" >&22 2>&1 + if (( "${#loopback_deps[@]}" > 0 )); then + kube::log::error "${#loopback_deps[@]} disallowed ${repo} -> k8s.io/kubernetes dependencies exist via the following imports: $(go mod why "${loopback_deps[@]}")" >&22 2>&1 exit 1 fi @@ -340,8 +359,7 @@ for repo in $(tsort "${TMP_DIR}/tidy_deps.txt"); do # group require/replace directives group_directives - - popd >/dev/null 2>&1 + ) done echo "=== tidying root" go mod tidy @@ -356,8 +374,8 @@ xargs -L 100 go mod edit -fmt # disallow transitive dependencies on k8s.io/kubernetes loopback_deps=() kube::util::read-array loopback_deps < <(go mod graph | grep ' k8s.io/kubernetes' || true) -if [[ -n ${loopback_deps[*]:+"${loopback_deps[*]}"} ]]; then - kube::log::error "Disallowed transitive k8s.io/kubernetes dependencies exist via the following imports:" >&22 2>&1 +if (( "${#loopback_deps[@]}" > 0 )); then + kube::log::error "${#loopback_deps[@]} disallowed transitive k8s.io/kubernetes dependencies exist via the following imports:" >&22 2>&1 kube::log::error "${loopback_deps[@]}" >&22 2>&1 exit 1 fi @@ -372,9 +390,10 @@ add_generated_comments " // Run hack/update-vendor.sh to update go.mod files and the vendor directory. " for repo in $(kube::util::list_staging_repos); do - pushd "staging/src/k8s.io/${repo}" >/dev/null 2>&1 + ( + cd "staging/src/k8s.io/${repo}" add_generated_comments "// This is a generated file. Do not edit directly." - popd >/dev/null 2>&1 + ) done