aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2018-08-09 16:16:43 -0400
committerRuss Cox <rsc@golang.org>2018-08-10 00:47:20 +0000
commitcb7d0efc2380b1231bc858058ac9f0032a8002ea (patch)
tree12a0a9da77e2f19aa73749292e8453aaa6b4776d
parent7aa9855704a766a1a16fbed79f9f6e34fc83bdf0 (diff)
downloadgo-cb7d0efc2380b1231bc858058ac9f0032a8002ea.tar.gz
go-cb7d0efc2380b1231bc858058ac9f0032a8002ea.zip
cmd/go: fix go.mod corruption using -mod=vendor
If we're using -mod=vendor then we effectively load a fake build list from vendor/modules.txt. Do not write it back to go.mod. Fixes #26704. Change-Id: Ie79f2103dc16d0b7fe0c884e77ba726c7e04f2e4 Reviewed-on: https://go-review.googlesource.com/128899 Reviewed-by: Bryan C. Mills <bcmills@google.com>
-rw-r--r--src/cmd/go/internal/modload/init.go5
-rw-r--r--src/cmd/go/testdata/script/mod_vendor_build.txt27
2 files changed, 31 insertions, 1 deletions
diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go
index 8ce0c32fd5..5e9db0f9ea 100644
--- a/src/cmd/go/internal/modload/init.go
+++ b/src/cmd/go/internal/modload/init.go
@@ -521,7 +521,10 @@ func MinReqs() mvs.Reqs {
// WriteGoMod writes the current build list back to go.mod.
func WriteGoMod() {
- if !allowWriteGoMod {
+ // If we're using -mod=vendor we basically ignored
+ // go.mod, so definitely don't try to write back our
+ // incomplete view of the world.
+ if !allowWriteGoMod || cfg.BuildMod == "vendor" {
return
}
diff --git a/src/cmd/go/testdata/script/mod_vendor_build.txt b/src/cmd/go/testdata/script/mod_vendor_build.txt
new file mode 100644
index 0000000000..7b304dbb70
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_vendor_build.txt
@@ -0,0 +1,27 @@
+env GO111MODULE=on
+
+# initial conditions: using sampler v1.3.0, not listed in go.mod.
+go list -deps
+stdout rsc.io/sampler
+! grep 'rsc.io/sampler v1.3.0' go.mod
+
+# update to v1.3.1, now indirect in go.mod.
+go get rsc.io/sampler@v1.3.1
+grep 'rsc.io/sampler v1.3.1 // indirect' go.mod
+cp go.mod go.mod.good
+
+# vendoring can but should not need to make changes.
+go mod vendor
+cmp go.mod go.mod.good
+
+# go list -mod=vendor (or go build -mod=vendor) must not modify go.mod.
+# golang.org/issue/26704
+go list -mod=vendor
+cmp go.mod go.mod.good
+
+-- go.mod --
+module m
+
+-- x.go --
+package x
+import _ "rsc.io/quote"