# Regression test for https://go.dev/issue/56494: # 'go get' in module mode was failing to prune out dependencies # through modules whose versions are too low to be selected. # Initially, modules "a", "b", and "c" are unrelated. # # The package import graph at v1 of everything looks like: # # m --- a # | # + --- b # | # + --- c # # At v2, package "a" adds imports of "b" and "c" # (and a requirement on "c" v2): # # a --- b # | # + --- c # # And "b" adds an import of "a/sub" (in module "a"): # # b --- a/sub # # At v3, "a" no longer imports (nor requires) "c": # # a --- b # So upgrading to a3 adds a dependency on b2, # b2 adds a dependency on a2 (for "a/sub"), # and a2 (but not a3) would add a dependency on c2. # Since a2 is lower than a3 it cannot possibly be selected when # upgrading to a3: normally a2 is pruned out of a3's module graph, # so 'go get' should prune it out too, and c should remain at c1 # without error. go get a@v0.3.0 go list -m c stdout '^c v0.1.0 ' -- go.mod -- module m go 1.19 require ( a v0.1.0 b v0.1.0 c v0.1.0 ) replace ( a v0.1.0 => ./a1 a v0.2.0 => ./a2 a v0.3.0 => ./a3 b v0.1.0 => ./b1 b v0.2.0 => ./b2 c v0.1.0 => ./c1 c v0.2.0 => ./c2 ) -- m.go -- package m import ( _ "a" _ "b" _ "c" ) -- a1/go.mod -- module a go 1.19 -- a1/a.go -- package a -- a2/go.mod -- module a go 1.19 require ( b v0.1.0 c v0.2.0 ) -- a2/a.go -- package a import ( _ "b" _ "c" ) -- a2/sub/sub.go -- package sub -- a3/go.mod -- module a go 1.19 require b v0.2.0 -- a3/a.go -- package a import _ "b" -- a3/sub/sub.go -- package sub -- b1/go.mod -- module b go 1.19 -- b1/b.go -- package b -- b2/go.mod -- module b go 1.19 require a v0.2.0 -- b2/b.go -- package b import "a/sub" -- c1/go.mod -- module c go 1.19 -- c1/c.go -- package c -- c2/go.mod -- module c go 1.19 -- c2/c.go -- package c