diff --git a/hack/update-vendor.sh b/hack/update-vendor.sh index 0f5acdebf05..e881587395a 100755 --- a/hack/update-vendor.sh +++ b/hack/update-vendor.sh @@ -66,29 +66,43 @@ function ensure_require_replace_directives_for_all_dependencies() { # Capture local require/replace directives before running any go commands that can modify the go.mod file local require_json="${local_tmp_dir}/require.json" local replace_json="${local_tmp_dir}/replace.json" - go mod edit -json | jq -r ".Require // [] | sort | .[] | select(${require_filter})" > "${require_json}" - go mod edit -json | jq -r ".Replace // [] | sort | .[] | select(${replace_filter})" > "${replace_json}" + go mod edit -json \ + | jq -r ".Require // [] | sort | .[] | select(${require_filter})" \ + > "${require_json}" + go mod edit -json \ + | jq -r ".Replace // [] | sort | .[] | select(${replace_filter})" \ + > "${replace_json}" # 1a. Ensure replace directives have an explicit require directive - jq -r '"-require \(.Old.Path)@\(.New.Version)"' < "${replace_json}" | xargs -L 100 go mod edit -fmt + jq -r '"-require \(.Old.Path)@\(.New.Version)"' < "${replace_json}" \ + | xargs -L 100 go mod edit -fmt # 1b. Ensure require directives have a corresponding replace directive pinning a version - jq -r '"-replace \(.Path)=\(.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 + jq -r '"-replace \(.Path)=\(.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 # 2. 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 - jq -r '"-require \(.Path)@\(.Version)"' < "${require_json}" | xargs -L 100 go mod edit -fmt - jq -r '"-replace \(.Path)=\(.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 + jq -r '"-require \(.Path)@\(.Version)"' < "${require_json}" \ + | xargs -L 100 go mod edit -fmt + jq -r '"-replace \(.Path)=\(.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 # 3. Add explicit require directives for indirect dependencies - go list -m -json all | jq -r 'select(.Main != true) | select(.Indirect == true) | "-require \(.Path)@\(.Version)"' | xargs -L 100 go mod edit -fmt + go list -m -json all \ + | jq -r 'select(.Main != true) | select(.Indirect == true) | "-require \(.Path)@\(.Version)"' \ + | xargs -L 100 go mod edit -fmt # 4. Add explicit replace directives pinning dependencies that aren't pinned yet - go list -m -json all | jq -r 'select(.Main != true) | select(.Replace == null) | "-replace \(.Path)=\(.Path)@\(.Version)"' | xargs -L 100 go mod edit -fmt + go list -m -json all \ + | jq -r 'select(.Main != true) | select(.Replace == null) | "-replace \(.Path)=\(.Path)@\(.Version)"' \ + | xargs -L 100 go mod edit -fmt } function group_replace_directives() { @@ -169,11 +183,19 @@ fi kube::log::status "go.mod: update staging references" # Prune -go mod edit -json | jq -r '.Require[]? | select(.Version == "v0.0.0") | "-droprequire \(.Path)"' | xargs -L 100 go mod edit -fmt -go mod edit -json | jq -r '.Replace[]? | select(.New.Path | startswith("./staging/")) | "-dropreplace \(.Old.Path)"' | xargs -L 100 go mod edit -fmt +go mod edit -json \ + | jq -r '.Require[]? | select(.Version == "v0.0.0") | "-droprequire \(.Path)"' \ + | xargs -L 100 go mod edit -fmt +go mod edit -json \ + | jq -r '.Replace[]? | select(.New.Path | startswith("./staging/")) | "-dropreplace \(.Old.Path)"' \ + | xargs -L 100 go mod edit -fmt # Readd -kube::util::list_staging_repos | xargs -n 1 -I {} echo "-require k8s.io/{}@v0.0.0" | xargs -L 100 go mod edit -fmt -kube::util::list_staging_repos | xargs -n 1 -I {} echo "-replace k8s.io/{}=./staging/src/k8s.io/{}" | xargs -L 100 go mod edit -fmt +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 +kube::util::list_staging_repos \ + | while read -r X; do echo "-replace k8s.io/${X}=./staging/src/k8s.io/${X}"; done \ + | xargs -L 100 go mod edit -fmt # Phase 3: capture required (minimum) versions from all modules, and replaced (pinned) versions from the root module @@ -194,11 +216,17 @@ for repo in $(kube::util::list_staging_repos); do pushd "staging/src/k8s.io/${repo}" >/dev/null 2>&1 echo "=== propagating to ${repo}" >> "${LOG_FILE}" # copy root go.mod, changing module name - sed "s#module k8s.io/kubernetes#module k8s.io/${repo}#" < "${KUBE_ROOT}/go.mod" > "${KUBE_ROOT}/staging/src/k8s.io/${repo}/go.mod" + sed "s#module k8s.io/kubernetes#module k8s.io/${repo}#" \ + < "${KUBE_ROOT}/go.mod" \ + > "${KUBE_ROOT}/staging/src/k8s.io/${repo}/go.mod" # remove `require` directives for staging components (will get re-added as needed by `go list`) - kube::util::list_staging_repos | xargs -n 1 -I {} echo "-droprequire k8s.io/{}" | xargs -L 100 go mod edit + kube::util::list_staging_repos \ + | while read -r X; do echo "-droprequire k8s.io/${X}"; done \ + | xargs -L 100 go mod edit # rewrite `replace` directives for staging components to point to peer directories - kube::util::list_staging_repos | xargs -n 1 -I {} echo "-replace k8s.io/{}=../{}" | xargs -L 100 go mod edit + 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 @@ -209,7 +237,8 @@ kube::log::status "go.mod: sorting staging modules" # tidy staging repos in reverse dependency order. # the content of dependencies' go.mod files affects what `go mod tidy` chooses to record in a go.mod file. tidy_unordered="${TMP_DIR}/tidy_unordered.txt" -kube::util::list_staging_repos | xargs -I {} echo "k8s.io/{}" > "${tidy_unordered}" +kube::util::list_staging_repos \ + | xargs -I {} echo "k8s.io/{}" > "${tidy_unordered}" rm -f "${TMP_DIR}/tidy_deps.txt" # SC2094 checks that you do not read and write to the same file in a pipeline. # We do read from ${tidy_unordered} in the pipeline and mention it within the @@ -283,7 +312,7 @@ $(go mod why "${loopback_deps[@]}")" comm -23 \ <(go mod edit -json | jq -r '.Replace[] | .Old.Path' | sort) \ <(go list -m -json all | jq -r .Path | sort) | - xargs -L 1 -I {} echo "-dropreplace={}" | + while read -r X; do echo "-dropreplace=${X}"; done | xargs -L 100 go mod edit -fmt # prune replace directives that pin to the naturally selected version