| # This test illustrates the use of a deepening scan to resolve transitive |
| # imports of imports of new packages from within existing dependencies. |
| |
| # The package import graph used in this test looks like: |
| # |
| # lazy ---- a/x ---- b |
| # \ |
| # ---- a/y (new) ---- c |
| # |
| # Where a/x and x/y are disjoint packages, but both contained in module a. |
| # |
| # The module dependency graph initially looks like: |
| # |
| # lazy ---- a.1 ---- b.1 |
| # \ |
| # c.1 |
| |
| |
| cp go.mod go.mod.old |
| cp lazy.go lazy.go.old |
| go mod tidy |
| cmp go.mod go.mod.old |
| |
| # Before adding a new import, the go.mod file should |
| # enumerate modules for all packages already imported. |
| go list all |
| cmp go.mod go.mod.old |
| |
| # When we add a new import of a package in an existing dependency, |
| # and that dependency is already tidy, its transitive dependencies |
| # should already be present. |
| cp lazy.go.new lazy.go |
| go list all |
| go list -m all |
| stdout '^example.com/c v0.1.0' # not v0.2.0 as would be resolved by 'latest' |
| cmp go.mod go.mod.old |
| |
| # Now, we repeat the test with a lazy main module. |
| cp lazy.go.old lazy.go |
| cp go.mod.117 go.mod |
| |
| # Before adding a new import, the go.mod file should |
| # enumerate modules for all packages already imported. |
| go list all |
| cmp go.mod go.mod.117 |
| |
| # When a new import is found, we should perform a deepening scan of the existing |
| # dependencies and add a requirement on the version required by those |
| # dependencies — not re-resolve 'latest'. |
| cp lazy.go.new lazy.go |
| |
| ! go list all |
| stderr '^go: updates to go.mod needed; to update it:\n\tgo mod tidy$' |
| |
| go mod tidy |
| go list all |
| go list -m all |
| stdout '^example.com/c v0.1.0' # not v0.2.0 as would be resolved by 'latest' |
| |
| cmp go.mod go.mod.new |
| |
| |
| -- go.mod -- |
| module example.com/lazy |
| |
| go 1.15 |
| |
| require example.com/a v0.1.0 |
| |
| replace ( |
| example.com/a v0.1.0 => ./a |
| example.com/b v0.1.0 => ./b |
| example.com/c v0.1.0 => ./c1 |
| example.com/c v0.2.0 => ./c2 |
| ) |
| -- go.mod.117 -- |
| module example.com/lazy |
| |
| go 1.17 |
| |
| require example.com/a v0.1.0 |
| |
| require example.com/b v0.1.0 // indirect |
| |
| replace ( |
| example.com/a v0.1.0 => ./a |
| example.com/b v0.1.0 => ./b |
| example.com/c v0.1.0 => ./c1 |
| example.com/c v0.2.0 => ./c2 |
| ) |
| -- go.mod.new -- |
| module example.com/lazy |
| |
| go 1.17 |
| |
| require example.com/a v0.1.0 |
| |
| require ( |
| example.com/b v0.1.0 // indirect |
| example.com/c v0.1.0 // indirect |
| ) |
| |
| replace ( |
| example.com/a v0.1.0 => ./a |
| example.com/b v0.1.0 => ./b |
| example.com/c v0.1.0 => ./c1 |
| example.com/c v0.2.0 => ./c2 |
| ) |
| -- lazy.go -- |
| package lazy |
| |
| import ( |
| _ "example.com/a/x" |
| ) |
| -- lazy.go.new -- |
| package lazy |
| |
| import ( |
| _ "example.com/a/x" |
| _ "example.com/a/y" |
| ) |
| -- a/go.mod -- |
| module example.com/a |
| |
| go 1.15 |
| |
| require ( |
| example.com/b v0.1.0 |
| example.com/c v0.1.0 |
| ) |
| -- a/x/x.go -- |
| package x |
| import _ "example.com/b" |
| -- a/y/y.go -- |
| package y |
| import _ "example.com/c" |
| -- b/go.mod -- |
| module example.com/b |
| |
| go 1.15 |
| -- b/b.go -- |
| package b |
| -- c1/go.mod -- |
| module example.com/c |
| |
| go 1.15 |
| -- c1/c.go -- |
| package c |
| -- c2/go.mod -- |
| module example.com/c |
| |
| go 1.15 |
| -- c2/c.go -- |
| package c |
| This file should not be used, so this syntax error should be ignored. |