]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go/internal/modload: follow dependencies of unpruned roots in dqTracker.path
authorBryan C. Mills <bcmills@google.com>
Thu, 14 Mar 2024 20:57:22 +0000 (16:57 -0400)
committerGopher Robot <gobot@golang.org>
Fri, 15 Mar 2024 21:46:32 +0000 (21:46 +0000)
For #65363.

Change-Id: I82ae1098b00c8772ef8d3aa92197e7d8c66d1b37
Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest,gotip-windows-amd64-longtest
Reviewed-on: https://go-review.googlesource.com/c/go/+/571800
Reviewed-by: Michael Matloob <matloob@golang.org>
Auto-Submit: Michael Matloob <matloob@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/cmd/go/internal/modload/edit.go
src/cmd/go/testdata/script/mod_get_issue65363.txt [new file with mode: 0644]

index 63ee15c76452016c828ed6cf96a2abdf16138390..4ecae27372b144df6eab8d3758c02c2ae89cec6a 100644 (file)
@@ -842,6 +842,12 @@ func (t *dqTracker) check(m module.Version, pruning modPruning) dqState {
 // If m is not disqualified, path returns (nil, nil).
 func (t *dqTracker) path(m module.Version, pruning modPruning) (path []module.Version, err error) {
        for {
+               if rootPruning, isRoot := t.extendedRootPruning[m]; isRoot && rootPruning == unpruned {
+                       // Since m is a root, any other module that requires it would cause
+                       // its full unpruned dependencies to be included in the module graph.
+                       // Those dependencies must also be considered as part of the path to the conflict.
+                       pruning = unpruned
+               }
                dq := t.dqReason[m].from(pruning)
                if !dq.isDisqualified() {
                        return path, nil
diff --git a/src/cmd/go/testdata/script/mod_get_issue65363.txt b/src/cmd/go/testdata/script/mod_get_issue65363.txt
new file mode 100644 (file)
index 0000000..d583561
--- /dev/null
@@ -0,0 +1,77 @@
+! go get -v example.net/a@v0.1.0
+! stderr panic
+stderr 'example.net/d@v0.1.0 requires\n\texample.net/invalid'
+
+-- go.mod --
+module example
+
+replace (
+       example.net/a v0.1.0 => ./a
+       example.net/b v0.1.0 => ./b1
+       example.net/b v0.2.0 => ./b2
+       example.net/c v0.1.0 => ./c1
+       example.net/c v0.2.0 => ./c2
+       example.net/d v0.1.0 => ./d
+)
+
+require (
+       example.net/b v0.1.0
+)
+-- a/go.mod --
+module example.net/a
+
+go 1.18
+
+require example.net/b v0.2.0
+-- a/a.go --
+package a
+
+import _ "example.net/b"
+-- b1/go.mod --
+module example.net/b
+
+go 1.16
+-- b1/b.go --
+package b
+-- b2/go.mod --
+module example.net/b
+
+go 1.16
+
+require example.net/c v0.2.0
+-- b2/b.go --
+package b
+-- b2/b_test.go --
+package b_test
+
+import _ "example.net/c"
+-- c1/go.mod --
+module example.net/c
+
+go 1.18
+-- c1/c.go --
+package c
+-- c2/go.mod --
+module example.net/c
+
+go 1.18
+
+require example.net/d v0.1.0
+-- c2/c.go --
+package c
+-- c2/c_test.go --
+package c_test
+
+import _ "example.net/d"
+-- d/go.mod --
+module example.net/d
+
+go 1.18
+
+require example.net/invalid v0.1.0
+-- d/d.go --
+package d
+-- d/d_test.go --
+package d
+
+import _ "example.net/invalid"