]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: verify lazy-loading invariants when loading the vendor list for a lazy module
authorBryan C. Mills <bcmills@google.com>
Thu, 29 Apr 2021 14:27:43 +0000 (10:27 -0400)
committerBryan C. Mills <bcmills@google.com>
Fri, 30 Apr 2021 18:05:30 +0000 (18:05 +0000)
For #36460

Change-Id: Ib4b1baea35826c3e359456f8dba09a49283e7fee
Reviewed-on: https://go-review.googlesource.com/c/go/+/315069
Trust: Bryan C. Mills <bcmills@google.com>
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Michael Matloob <matloob@golang.org>
src/cmd/go/internal/modload/buildlist.go

index 46aee45bd53acbf0f3a638e70dd470867bfde26d..4b83ede541c58c5cc47e133a67a327918e0ea992 100644 (file)
@@ -140,12 +140,21 @@ func (rs *Requirements) initVendor(vendorList []module.Version) {
                        // The roots of a lazy module should already include every module in the
                        // vendor list, because the vendored modules are the same as those
                        // maintained as roots by the lazy loading “import invariant”.
-                       if go117LazyTODO {
-                               // Double-check here that that invariant holds.
+                       //
+                       // Just to be sure, we'll double-check that here.
+                       inconsistent := false
+                       for _, m := range vendorList {
+                               if v, ok := rs.rootSelected(m.Path); !ok || v != m.Version {
+                                       base.Errorf("go: vendored module %v should be required explicitly in go.mod", m)
+                                       inconsistent = true
+                               }
+                       }
+                       if inconsistent {
+                               base.Fatalf("go: %v", errGoModDirty)
                        }
 
-                       // So we can just treat the rest of the module graph as effectively
-                       // “pruned out”, like a more aggressive version of lazy loading:
+                       // Now we can treat the rest of the module graph as effectively “pruned
+                       // out”, like a more aggressive version of lazy loading: in vendor mode,
                        // the root requirements *are* the complete module graph.
                        mg.g.Require(Target, rs.rootModules)
                } else {