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  }