...
1
2
3
4
5 package packages
6
7 import (
8 "fmt"
9 "os"
10 "sort"
11 )
12
13
14
15
16
17
18
19 func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) {
20 seen := make(map[*Package]bool)
21 var visit func(*Package)
22 visit = func(pkg *Package) {
23 if !seen[pkg] {
24 seen[pkg] = true
25
26 if pre == nil || pre(pkg) {
27 paths := make([]string, 0, len(pkg.Imports))
28 for path := range pkg.Imports {
29 paths = append(paths, path)
30 }
31 sort.Strings(paths)
32 for _, path := range paths {
33 visit(pkg.Imports[path])
34 }
35 }
36
37 if post != nil {
38 post(pkg)
39 }
40 }
41 }
42 for _, pkg := range pkgs {
43 visit(pkg)
44 }
45 }
46
47
48
49
50 func PrintErrors(pkgs []*Package) int {
51 var n int
52 Visit(pkgs, nil, func(pkg *Package) {
53 for _, err := range pkg.Errors {
54 fmt.Fprintln(os.Stderr, err)
55 n++
56 }
57 })
58 return n
59 }
60
View as plain text