]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: diagnose go.mod and vendor out of sync in std and cmd
authorRuss Cox <rsc@golang.org>
Tue, 30 Apr 2019 20:04:50 +0000 (16:04 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 9 May 2019 00:01:25 +0000 (00:01 +0000)
The most common failure mode of the current std/cmd setup is
going to be people running "go get m@latest" and then not running
"go mod vendor" and being confused about getting the old m.
Diagnose and report what to do.

Also, having done the check, when in the standard library,
switch the go command to -mod=vendor mode.
This avoids some network accesses I saw when running
'go clean -modcache' before doing some work in cmd.

Change-Id: I0ba4a66637b67225a9b97a1c89f26f9015b41673
Reviewed-on: https://go-review.googlesource.com/c/go/+/174528
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/modload/init.go
src/go.mod
src/go.sum
src/vendor/modules.txt

index 65046fd3c3d07333902f12ea938d0c3841b59ce7..ba90756346b40fe52ce76a0282a20563b8326d2b 100644 (file)
@@ -376,6 +376,7 @@ func InitMod() {
                excluded[x.Mod] = true
        }
        modFileToBuildList()
+       stdVendorMode()
        WriteGoMod()
 }
 
@@ -383,7 +384,7 @@ func InitMod() {
 func modFileToBuildList() {
        Target = modFile.Module.Mod
        targetPrefix = Target.Path
-       if search.InDir(cwd, cfg.GOROOTsrc) != "" {
+       if rel := search.InDir(cwd, cfg.GOROOTsrc); rel != "" && rel != filepath.FromSlash("cmd/vet/all") {
                targetInGorootSrc = true
                if Target.Path == "std" {
                        targetPrefix = ""
@@ -397,6 +398,42 @@ func modFileToBuildList() {
        buildList = list
 }
 
+// stdVendorMode applies inside $GOROOT/src.
+// It checks that the go.mod matches vendor/modules.txt
+// and then sets -mod=vendor unless this is a command
+// that has to do explicitly with modules.
+func stdVendorMode() {
+       if !targetInGorootSrc {
+               return
+       }
+       if cfg.CmdName == "get" || strings.HasPrefix(cfg.CmdName, "mod ") {
+               return
+       }
+
+       readVendorList()
+BuildList:
+       for _, m := range buildList {
+               if m.Path == "cmd" || m.Path == "std" {
+                       continue
+               }
+               for _, v := range vendorList {
+                       if m.Path == v.Path {
+                               if m.Version != v.Version {
+                                       base.Fatalf("go: inconsistent vendoring in %s:\n"+
+                                               "\tgo.mod requires %s %s but vendor/modules.txt has %s.\n"+
+                                               "\trun 'go mod tidy; go mod vendor' to sync",
+                                               modRoot, m.Path, m.Version, v.Version)
+                               }
+                               continue BuildList
+                       }
+               }
+               base.Fatalf("go: inconsistent vendoring in %s:\n"+
+                       "\tgo.mod requires %s %s but vendor/modules.txt does not include it.\n"+
+                       "\trun 'go mod tidy; go mod vendor' to sync", modRoot, m.Path, m.Version)
+       }
+       cfg.BuildMod = "vendor"
+}
+
 // Allowed reports whether module m is allowed (not excluded) by the main module's go.mod.
 func Allowed(m module.Version) bool {
        return !excluded[m]
index a527f9a24428a057b062ca69e3f74652a5024eec..0d2bd16284dd080bb9da7758ddfaca2f074886cc 100644 (file)
@@ -7,5 +7,4 @@ require (
        golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6
        golang.org/x/sys v0.0.0-20190425145619-16072639606e // indirect
        golang.org/x/text v0.3.2 // indirect
-       golang.org/x/tools v0.0.0-20190425214124-2d660fb8a000 // indirect
 )
index 9745969900fa29c471a971b62a380cb85c6f6939..f1c600348c376db586f297d8e67a93d1feb31c24 100644 (file)
@@ -1,25 +1,14 @@
-golang.org/x/crypto v0.0.0-20181025213731-e84da0312774 h1:a4tQYYYuK9QdeO/+kEvNYyuR21S+7ve5EANok6hABhI=
-golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d h1:adrbvkTDn9rGnXg2IJDKozEpXXLZN89pdIA+Syt4/u0=
 golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/net v0.0.0-20181213202711-891ebc4b82d6 h1:gT0Y6H7hbVPUtvtk0YGxMXPgN+p8fYlqWkgJeUCZcaQ=
-golang.org/x/net v0.0.0-20181213202711-891ebc4b82d6/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6 h1:FP8hkuE6yUEaJnK7O2eTuejKWwW+Rhfj80dQ2JcKxCU=
 golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e h1:UndnRDGP/JcdZX1LBubo1fJ3Jt6GnKREteLJvysiiPE=
-golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190425145619-16072639606e h1:4ktJgTV34+N3qOZUc5fAaG3Pb11qzMm3PkAoTAgUZ2I=
 golang.org/x/sys v0.0.0-20190425145619-16072639606e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/text v0.1.1-0.20171102144821-8253218a5ec6 h1:j8pkdn+8tJbBXIFRILFAB5MDo/hAZg4TnknVwnhU6bI=
-golang.org/x/text v0.1.1-0.20171102144821-8253218a5ec6/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190425214124-2d660fb8a000/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
index 75eb2a6e8d2e5d35b0720663d45cce690ae0051d..9c4dee7beaa5e36697611a24ce247dd4b4bdebdd 100644 (file)
@@ -1,26 +1,26 @@
 # golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d
 golang.org/x/crypto/chacha20poly1305
 golang.org/x/crypto/cryptobyte
+golang.org/x/crypto/cryptobyte/asn1
 golang.org/x/crypto/curve25519
 golang.org/x/crypto/hkdf
-golang.org/x/crypto/cryptobyte/asn1
 golang.org/x/crypto/internal/chacha20
 golang.org/x/crypto/internal/subtle
 golang.org/x/crypto/poly1305
 # golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6
 golang.org/x/net/dns/dnsmessage
-golang.org/x/net/lif
-golang.org/x/net/route
 golang.org/x/net/http/httpguts
 golang.org/x/net/http/httpproxy
 golang.org/x/net/http2/hpack
 golang.org/x/net/idna
+golang.org/x/net/lif
 golang.org/x/net/nettest
+golang.org/x/net/route
 # golang.org/x/sys v0.0.0-20190425145619-16072639606e
 golang.org/x/sys/cpu
 golang.org/x/sys/unix
 # golang.org/x/text v0.3.2
 golang.org/x/text/secure/bidirule
+golang.org/x/text/transform
 golang.org/x/text/unicode/bidi
 golang.org/x/text/unicode/norm
-golang.org/x/text/transform