@@ -66,7 +66,9 @@ function ensure_require_replace_directives_for_all_dependencies() {
66
66
go mod edit -json | jq -r " .Require // [] | sort | .[] | select(${require_filter} )" > " ${require_json} "
67
67
go mod edit -json | jq -r " .Replace // [] | sort | .[] | select(${replace_filter} )" > " ${replace_json} "
68
68
69
- # 1. Ensure require directives have a corresponding replace directive pinning a version
69
+ # 1a. Ensure replace directives have an explicit require directive
70
+ cat " ${replace_json} " | jq -r ' "-require \(.Old.Path)@\(.New.Version)"' | xargs -L 100 go mod edit -fmt
71
+ # 1b. Ensure require directives have a corresponding replace directive pinning a version
70
72
cat " ${require_json} " | jq -r ' "-replace \(.Path)=\(.Path)@\(.Version)"' | xargs -L 100 go mod edit -fmt
71
73
cat " ${replace_json} " | jq -r ' "-replace \(.Old.Path)=\(.New.Path)@\(.New.Version)"' | xargs -L 100 go mod edit -fmt
72
74
@@ -238,7 +240,20 @@ kube::log::status "go.mod: tidying"
238
240
for repo in $( tsort " ${TMP_DIR} /tidy_deps.txt" ) ; do
239
241
pushd " ${KUBE_ROOT} /staging/src/${repo} " > /dev/null 2>&1
240
242
echo " === tidying ${repo} " >> " ${LOG_FILE} "
241
- go mod tidy >> " ${LOG_FILE} " 2>&1
243
+
244
+ # prune replace directives that pin to the naturally selected version.
245
+ # do this before tidying, since tidy removes unused modules that
246
+ # don't provide any relevant packages, which forgets which version of the
247
+ # unused transitive dependency we had a require directive for,
248
+ # and prevents pruning the matching replace directive after tidying.
249
+ go list -m -json all |
250
+ jq -r ' select(.Replace != null) |
251
+ select(.Path == .Replace.Path) |
252
+ select(.Version == .Replace.Version) |
253
+ "-dropreplace \(.Replace.Path)"' |
254
+ xargs -L 100 go mod edit -fmt
255
+
256
+ go mod tidy -v >> " ${LOG_FILE} " 2>&1
242
257
243
258
# disallow transitive dependencies on k8s.io/kubernetes
244
259
loopback_deps=" $( go list all 2> /dev/null | grep k8s.io/kubernetes/ || true) "
0 commit comments