aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/go/internal/modload/query.go
diff options
context:
space:
mode:
authorJay Conrod <jayconrod@google.com>2019-07-01 15:25:04 -0400
committerJay Conrod <jayconrod@google.com>2019-07-03 18:15:45 +0000
commita3a0cc2e1ae5eeafdffc8c6f1cc9ea9ea93937e3 (patch)
tree15d603ac8d3cb3c5f1446f92db87b7792601b502 /src/cmd/go/internal/modload/query.go
parentb412fde53a6b53475e25aaa9e49f3c6df3c48716 (diff)
downloadgo-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.go24
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)