From 1dcbd8dc58abf7319a8f557536e3b5158cba8ed7 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 1 May 2020 15:30:58 -0400 Subject: [PATCH] cmd/go/internal/modload: make QueryPattern consider current versions QueryPattern will now look up the current version of a module (if any) before invoking queryProxy. This changes the interpretation of some patterns (like "upgrade") and avoids the need to download earlier versions for earlier versions when the current version is +incompatible. Fixes #37574 Change-Id: I4089d6099236493df13a7f88a252b5e5e556d383 Reviewed-on: https://go-review.googlesource.com/c/go/+/231599 Reviewed-by: Bryan C. Mills Reviewed-by: Michael Matloob Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/internal/modload/query.go | 12 +++++++- ...example.com_incompatiblewithsub_v1.0.0.txt | 8 +++++ ...ncompatiblewithsub_v2.0.0+incompatible.txt | 8 +++++ .../script/mod_get_prefer_incompatible.txt | 29 +++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/cmd/go/testdata/mod/example.com_incompatiblewithsub_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_incompatiblewithsub_v2.0.0+incompatible.txt create mode 100644 src/cmd/go/testdata/script/mod_get_prefer_incompatible.txt diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index f8ea7e6309..5e9cfdcfe3 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -455,8 +455,9 @@ func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]Q err := modfetch.TryProxies(func(proxy string) error { queryModule := func(path string) (r QueryResult, err error) { + current := findCurrentVersion(path) r.Mod.Path = path - r.Rev, err = queryProxy(proxy, path, query, "", allowed) + r.Rev, err = queryProxy(proxy, path, query, current, allowed) if err != nil { return r, err } @@ -508,6 +509,15 @@ func modulePrefixesExcludingTarget(path string) []string { return prefixes } +func findCurrentVersion(path string) string { + for _, m := range buildList { + if m.Path == path { + return m.Version + } + } + return "" +} + type prefixResult struct { QueryResult err error diff --git a/src/cmd/go/testdata/mod/example.com_incompatiblewithsub_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_incompatiblewithsub_v1.0.0.txt new file mode 100644 index 0000000000..435578da8d --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_incompatiblewithsub_v1.0.0.txt @@ -0,0 +1,8 @@ +Module example.com/incompatiblewithsub has an incompatible version +and a package in a subdirectory. +-- .info -- +{"Version":"v1.0.0"} +-- .mod -- +module example.com/incompatiblewithsub +-- sub/sub.go -- +package sub diff --git a/src/cmd/go/testdata/mod/example.com_incompatiblewithsub_v2.0.0+incompatible.txt b/src/cmd/go/testdata/mod/example.com_incompatiblewithsub_v2.0.0+incompatible.txt new file mode 100644 index 0000000000..198ec1702b --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_incompatiblewithsub_v2.0.0+incompatible.txt @@ -0,0 +1,8 @@ +Module example.com/incompatiblewithsub has an incompatible version +and a package in a subdirectory. +-- .info -- +{"Version":"v2.0.0+incompatible"} +-- .mod -- +module example.com/incompatiblewithsub +-- sub/sub.go -- +package sub diff --git a/src/cmd/go/testdata/script/mod_get_prefer_incompatible.txt b/src/cmd/go/testdata/script/mod_get_prefer_incompatible.txt new file mode 100644 index 0000000000..be3db42d1d --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_prefer_incompatible.txt @@ -0,0 +1,29 @@ +# Verifies golang.org/issue/37574. + +# If we are already using an +incompatible version, we shouldn't look up +# a lower compatible version when upgrading. +cp go.mod go.mod.orig +go mod tidy +cmp go.mod.orig go.mod +grep '^example.com/incompatiblewithsub v2\.0\.0\+incompatible' go.sum +! grep '^example.com/incompatiblewithsub v1.0.0' go.sum + +go get -d example.com/incompatiblewithsub/sub +cmp go.mod.orig go.mod +! grep '^example.com/incompatiblewithsub v1.0.0' go.sum + +# TODO(golang.org/issue/31580): the 'go get' command above should not change +# go.sum. However, as part of the query above, we download example.com@v1.0.0, +# an unrelated module, since it's a possible prefix. The sum for that module +# should not be written to go.sum. + +-- go.mod -- +module m + +go 1.15 + +require example.com/incompatiblewithsub v2.0.0+incompatible +-- use.go -- +package use + +import _ "example.com/incompatiblewithsub/sub" -- 2.48.1