package main import ( "go/build" "regexp" "strings" ) // Package represents a Go package. type Package struct { Dir string Root string ImportPath string Deps []string Standard bool Processed bool GoFiles []string CgoFiles []string IgnoredGoFiles []string TestGoFiles []string TestImports []string XTestGoFiles []string XTestImports []string Error struct { Err string } // --- New stuff for now Imports []string Dependencies []build.Package } // LoadPackages loads the named packages // Unlike the go tool, an empty argument list is treated as an empty list; "." // must be given explicitly if desired. // IgnoredGoFiles will be processed and their dependencies resolved recursively func LoadPackages(names ...string) (a []*Package, err error) { debugln("LoadPackages", names) if len(names) == 0 { return nil, nil } for _, i := range importPaths(names) { p, err := listPackage(i) if err != nil { return nil, err } a = append(a, p) } return a, nil } func (p *Package) allGoFiles() []string { var a []string a = append(a, p.GoFiles...) a = append(a, p.CgoFiles...) a = append(a, p.TestGoFiles...) a = append(a, p.XTestGoFiles...) a = append(a, p.IgnoredGoFiles...) return a } // matchPattern(pattern)(name) reports whether // name matches pattern. Pattern is a limited glob // pattern in which '...' means 'any string' and there // is no other special syntax. // Taken from $GOROOT/src/cmd/go/main.go. func matchPattern(pattern string) func(name string) bool { re := regexp.QuoteMeta(pattern) re = strings.Replace(re, `\.\.\.`, `.*`, -1) // Special case: foo/... matches foo too. if strings.HasSuffix(re, `/.*`) { re = re[:len(re)-len(`/.*`)] + `(/.*)?` } reg := regexp.MustCompile(`^` + re + `$`) return func(name string) bool { return reg.MatchString(name) } }