diff options
author | Jay Conrod <jayconrod@google.com> | 2019-07-01 15:25:04 -0400 |
---|---|---|
committer | Jay Conrod <jayconrod@google.com> | 2019-07-03 18:15:45 +0000 |
commit | a3a0cc2e1ae5eeafdffc8c6f1cc9ea9ea93937e3 (patch) | |
tree | 15d603ac8d3cb3c5f1446f92db87b7792601b502 /src/cmd/go/internal/modload/query.go | |
parent | b412fde53a6b53475e25aaa9e49f3c6df3c48716 (diff) | |
download | go-a3a0cc2e1ae5eeafdffc8c6f1cc9ea9ea93937e3.tar.gz go-a3a0cc2e1ae5eeafdffc8c6f1cc9ea9ea93937e3.zip |
cmd/go: restore @latest behavior and support @upgrade in 'go get'
'go get path@latest' may now downgrade a module required at a
pre-release or pseudo-version newer than the latest released
version. This restores the 1.12 behavior and the ability to easily
roll back from a temporary development version.
'go get path@upgrade' is like @latest but will not downgrade.
If no version suffix is specified ('go get path'), @upgrade is
implied.
Fixes #32846
Change-Id: Ibec0628292ab1c484716a5add0950d7a7ee45f47
Reviewed-on: https://go-review.googlesource.com/c/go/+/184440
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Diffstat (limited to 'src/cmd/go/internal/modload/query.go')
-rw-r--r-- | src/cmd/go/internal/modload/query.go | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index 8ce61c0a1d..269f60d620 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -28,9 +28,10 @@ import ( // tagged version, with non-prereleases preferred over prereleases. // If there are no tagged versions in the repo, latest returns the most // recent commit. +// - the literal string "upgrade", equivalent to "latest" except that if +// current is a newer version, current will be returned (see below). // - the literal string "patch", denoting the latest available tagged version -// with the same major and minor number as current. If current is "", -// "patch" is equivalent to "latest". +// with the same major and minor number as current (see below). // - v1, denoting the latest available tagged version v1.x.x. // - v1.2, denoting the latest available tagged version v1.2.x. // - v1.2.3, a semantic version string denoting that tagged version. @@ -39,11 +40,12 @@ import ( // with non-prereleases preferred over prereleases. // - a repository commit identifier or tag, denoting that commit. // -// current is optional, denoting the current version of the module. -// If query is "latest" or "patch", current will be returned if it is a newer -// semantic version or if it is a chronologically later pseudoversion. This -// prevents accidental downgrades from newer prerelease or development -// versions. +// current denotes the current version of the module; it may be "" if the +// current version is unknown or should not be considered. If query is +// "upgrade" or "patch", current will be returned if it is a newer +// semantic version or a chronologically later pseudo-version than the +// version that would otherwise be chosen. This prevents accidental downgrades +// from newer pre-release or development versions. // // If the allowed function is non-nil, Query excludes any versions for which // allowed returns false. @@ -81,6 +83,10 @@ func queryProxy(proxy, path, query, current string, allowed func(module.Version) ok = allowed mayUseLatest = true + case query == "upgrade": + ok = allowed + mayUseLatest = true + case query == "patch": if current == "" { ok = allowed @@ -202,9 +208,9 @@ func queryProxy(proxy, path, query, current string, allowed func(module.Version) return nil, err } - // For "latest" and "patch", make sure we don't accidentally downgrade + // For "upgrade" and "patch", make sure we don't accidentally downgrade // from a newer prerelease or from a chronologically newer pseudoversion. - if current != "" && (query == "latest" || query == "patch") { + if current != "" && (query == "upgrade" || query == "patch") { currentTime, err := modfetch.PseudoVersionTime(current) if semver.Compare(rev.Version, current) < 0 || (err == nil && rev.Time.Before(currentTime)) { return repo.Stat(current) |