]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: avoid erroneous canonicalization when trying to resolve imports using replace...
authorBryan C. Mills <bcmills@google.com>
Fri, 20 Dec 2019 03:36:13 +0000 (22:36 -0500)
committerBryan C. Mills <bcmills@google.com>
Fri, 20 Dec 2019 15:24:05 +0000 (15:24 +0000)
Updates #32700
Fixes #33795

Change-Id: I16897a0a2f3aa2f0b0bf8cf8252f3f39eef2e7ba
Reviewed-on: https://go-review.googlesource.com/c/go/+/212200
Run-TryBot: Bryan C. Mills <bcmills@google.com>
Reviewed-by: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/go/internal/modload/import.go
src/cmd/go/testdata/script/mod_replace_import.txt

index 9ae2900e4691e5fd97e379450a08766b2b533f96..3170ffab8897fee074f4d4444c619ec423c6ea23 100644 (file)
@@ -203,7 +203,12 @@ func Import(path string) (m module.Version, dir string, err error) {
                latest := map[string]string{} // path -> version
                for _, r := range modFile.Replace {
                        if maybeInModule(path, r.Old.Path) {
-                               latest[r.Old.Path] = semver.Max(r.Old.Version, latest[r.Old.Path])
+                               // Don't use semver.Max here; need to preserve +incompatible suffix.
+                               v := latest[r.Old.Path]
+                               if semver.Compare(r.Old.Version, v) > 0 {
+                                       v = r.Old.Version
+                               }
+                               latest[r.Old.Path] = v
                        }
                }
 
index 941ef61d35589b655ab9d4d011d23147f773a373..646b3b081deb3a473bc47fbee96daa9310321ea3 100644 (file)
@@ -54,6 +54,10 @@ replace (
        example.com/v => ./v
 )
 
+replace (
+       example.com/i v2.0.0+incompatible => ./i2
+)
+
 -- m.go --
 package main
 import (
@@ -61,6 +65,7 @@ import (
        _ "example.com/x/v3"
        _ "example.com/y/z/w"
        _ "example.com/v"
+       _ "example.com/i"
 )
 func main() {}
 
@@ -115,6 +120,11 @@ module v.localhost
 -- v/v.go --
 package v
 
+-- i2/go.mod --
+module example.com/i
+-- i2/i.go --
+package i
+
 -- fail/m.go --
 package main