]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/go: test and fix missing deep dependencies in list Deps output
authorRuss Cox <rsc@golang.org>
Fri, 18 Aug 2017 15:44:21 +0000 (11:44 -0400)
committerRuss Cox <rsc@golang.org>
Sat, 19 Aug 2017 03:33:15 +0000 (03:33 +0000)
Fixes #21522.

Change-Id: Ifec1681b265576c47a4d736f6f124cc25485c593
Reviewed-on: https://go-review.googlesource.com/57011
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/dist/deps_test.go
src/cmd/go/go_test.go
src/cmd/go/internal/load/pkg.go

index 675ed557f5e58d9b0becad8a012692a47463d01b..15adafa606ed90977d34f88ed2e48fce576ac5f4 100644 (file)
@@ -53,7 +53,13 @@ func TestDeps(t *testing.T) {
                // Very simple minded diff.
                t.Log("-current +generated")
                clines := strings.Split(string(current), "\n")
+               for i, line := range clines {
+                       clines[i] = strings.Join(strings.Fields(line), " ")
+               }
                ulines := strings.Split(string(updated), "\n")
+               for i, line := range ulines {
+                       ulines[i] = strings.Join(strings.Fields(line), " ")
+               }
                for len(clines) > 0 {
                        cl := clines[0]
                        switch {
index 3aecc75f8758c7c922b22697cbf1b4d63d74f78c..65b7aa4de2ec4b08a42c88b026160c660b91b883 100644 (file)
@@ -1703,6 +1703,20 @@ func TestGoListDedupsPackages(t *testing.T) {
        }
 }
 
+func TestGoListDeps(t *testing.T) {
+       tg := testgo(t)
+       defer tg.cleanup()
+       tg.parallel()
+       tg.tempDir("src/p1/p2/p3/p4")
+       tg.setenv("GOPATH", tg.path("."))
+       tg.tempFile("src/p1/p.go", "package p1\nimport _ \"p1/p2\"\n")
+       tg.tempFile("src/p1/p2/p.go", "package p2\nimport _ \"p1/p2/p3\"\n")
+       tg.tempFile("src/p1/p2/p3/p.go", "package p3\nimport _ \"p1/p2/p3/p4\"\n")
+       tg.tempFile("src/p1/p2/p3/p4/p.go", "package p4\n")
+       tg.run("list", "-f", "{{.Deps}}", "p1")
+       tg.grepStdout("p1/p2/p3/p4", "Deps(p1) does not mention p4")
+}
+
 // Issue 4096. Validate the output of unsuccessful go install foo/quxx.
 func TestUnsuccessfulGoInstallShouldMentionMissingPackage(t *testing.T) {
        tg := testgo(t)
index 597f54cf596ebcb9c779216eb37d70a7733ee088..d3d19229641a68cbb076fcac6e953e9719b8321f 100644 (file)
@@ -1050,17 +1050,6 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) *Package
 
        // Build list of imported packages and full dependency list.
        imports := make([]*Package, 0, len(p.Imports))
-       deps := make(map[string]*Package)
-       save := func(path string, p1 *Package) {
-               // The same import path could produce an error or not,
-               // depending on what tries to import it.
-               // Prefer to record entries with errors, so we can report them.
-               p0 := deps[path]
-               if p0 == nil || p1.Error != nil && (p0.Error == nil || len(p0.Error.ImportStack) > len(p1.Error.ImportStack)) {
-                       deps[path] = p1
-               }
-       }
-
        for i, path := range importPaths {
                if path == "C" {
                        continue
@@ -1083,17 +1072,33 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) *Package
                        p.Imports[i] = path
                }
 
-               save(path, p1)
                imports = append(imports, p1)
-               for _, dep := range p1.Internal.Imports {
-                       save(dep.ImportPath, dep)
-               }
                if p1.Incomplete {
                        p.Incomplete = true
                }
        }
        p.Internal.Imports = imports
 
+       deps := make(map[string]*Package)
+       var q []*Package
+       q = append(q, imports...)
+       for i := 0; i < len(q); i++ {
+               p1 := q[i]
+               path := p1.ImportPath
+               // The same import path could produce an error or not,
+               // depending on what tries to import it.
+               // Prefer to record entries with errors, so we can report them.
+               p0 := deps[path]
+               if p0 == nil || p1.Error != nil && (p0.Error == nil || len(p0.Error.ImportStack) > len(p1.Error.ImportStack)) {
+                       deps[path] = p1
+                       for _, p2 := range p1.Internal.Imports {
+                               if deps[p2.ImportPath] != p2 {
+                                       q = append(q, p2)
+                               }
+                       }
+               }
+       }
+
        p.Deps = make([]string, 0, len(deps))
        for dep := range deps {
                p.Deps = append(p.Deps, dep)