]> Cypherpunks repositories - gostls13.git/commit
cmd/go/internal/mvs: recompute build list in Reqs before minimizing
authorBryan C. Mills <bcmills@google.com>
Wed, 4 Sep 2019 18:32:28 +0000 (14:32 -0400)
committerBryan C. Mills <bcmills@google.com>
Thu, 19 Sep 2019 15:51:38 +0000 (15:51 +0000)
commite53edafb664193e410089d3c2ac0aaca9c5982ff
treeb45d37eef8b2943efe31ca4273eeb094fc8d6a7c
parent5d548f1243df8d586a03df085b40299f1e427fb1
cmd/go/internal/mvs: recompute build list in Reqs before minimizing

modload.MinReqs was passing modload.buildList to mvs.Reqs explicitly,
apparently as an optimization. However, we do not always have the
invariant that modload.buildList is complete: in particular, 'go mod
tidy' begins by reducing modload.buildList to only the set of modules
that provide packages to the build, which may be substantially smaller
than the final build list.

Other operations, such as 'go mod graph', do not load the entire
import graph, and therefore call Reqs with the unreduced build list.

Since Reqs retains modules according to a post-order traversal of the
list, an incomplete list may produce a different traversal order — and
therefore a different minimal solution, when multiple minimal
solutions exist. That caused 'go mod tidy' to produce different output
from other 'go' subcommands when certain patterns of dependencies are
present.

Since passing in the build list is only an optimization anyway, remove
the parameter and recompute the actual (complete) list at the
beginning of mvs.Reqs itself. That way, it is guaranteed to be
complete and in canonical order.

Fixes #34086

Change-Id: I3101bb81a1853c4a5e773010da3e44d2d90a570c
Reviewed-on: https://go-review.googlesource.com/c/go/+/193397
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
src/cmd/go/internal/modload/init.go
src/cmd/go/internal/mvs/mvs.go
src/cmd/go/internal/mvs/mvs_test.go
src/cmd/go/testdata/script/mod_tidy_cycle.txt [new file with mode: 0644]