github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/vndr/pkg.go (about) 1 package main 2 3 import ( 4 "log" 5 "os" 6 "path/filepath" 7 "runtime" 8 9 "github.com/LK4D4/vndr/build" 10 ) 11 12 var ( 13 ctx = &build.Context{ 14 UseAllFiles: true, 15 Compiler: runtime.Compiler, 16 CgoEnabled: true, 17 GOROOT: runtime.GOROOT(), 18 GOPATH: os.Getenv("GOPATH"), 19 } 20 ) 21 22 func collectAllDeps(wd string, initPkgs ...*build.Package) ([]*build.Package, error) { 23 pkgCache := make(map[string]*build.Package) 24 var deps []*build.Package 25 initPkgsMap := make(map[*build.Package]bool) 26 for _, pkg := range initPkgs { 27 initPkgsMap[pkg] = true 28 pkgCache[pkg.ImportPath] = pkg 29 deps = append(deps, pkg) 30 } 31 for { 32 var newDeps []*build.Package 33 for _, pkg := range deps { 34 if pkg.Goroot { 35 continue 36 } 37 handleImports := func(pkgs []string) { 38 for _, imp := range pkgs { 39 if imp == "C" { 40 continue 41 } 42 ipkg, err := ctx.Import(imp, wd, 0) 43 if ipkg.Goroot { 44 continue 45 } 46 if err != nil { 47 if _, ok := err.(*build.MultiplePackageError); !ok && verbose { 48 log.Printf("\tWARNING %s: %v", ipkg.ImportPath, err) 49 } 50 } 51 if _, ok := pkgCache[ipkg.ImportPath]; ok { 52 continue 53 } 54 newDeps = append(newDeps, ipkg) 55 } 56 pkgCache[pkg.ImportPath] = pkg 57 } 58 handleImports(pkg.Imports) 59 if initPkgsMap[pkg] { 60 handleImports(pkg.TestImports) 61 handleImports(pkg.XTestImports) 62 } 63 } 64 if len(newDeps) == 0 { 65 break 66 } 67 deps = newDeps 68 } 69 var pkgs []*build.Package 70 for _, pkg := range pkgCache { 71 pkgs = append(pkgs, pkg) 72 } 73 return pkgs, nil 74 } 75 76 func collectPkgs(dir string) ([]*build.Package, error) { 77 var pkgs []*build.Package 78 err := filepath.Walk(dir, func(path string, i os.FileInfo, err error) error { 79 if i == nil { 80 return err 81 } 82 if !i.IsDir() { 83 return nil 84 } 85 // skip vendoring directory itself 86 if path == filepath.Join(dir, vendorDir) { 87 return filepath.SkipDir 88 } 89 pkg, err := ctx.ImportDir(path, build.ImportMode(0)) 90 if err != nil { 91 if _, ok := err.(*build.MultiplePackageError); !ok { 92 // not a package 93 if _, ok := err.(*build.NoGoError); ok { 94 return nil 95 } 96 return err 97 } 98 } 99 pkgs = append(pkgs, pkg) 100 return nil 101 }) 102 return pkgs, err 103 }