1
0
mirror of https://github.com/golang/go synced 2024-11-24 16:10:10 -07:00

cmd/api: compare multiple contexts

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5626045
This commit is contained in:
Brad Fitzpatrick 2012-02-07 18:13:11 -08:00
parent bb7b1a11d5
commit f23a6dba5e

View File

@ -34,6 +34,27 @@ var (
verbose = flag.Bool("v", false, "Verbose debugging") verbose = flag.Bool("v", false, "Verbose debugging")
) )
var contexts = []*build.Context{
{GOOS: "linux", GOARCH: "386", CgoEnabled: true},
{GOOS: "linux", GOARCH: "386"},
{GOOS: "linux", GOARCH: "amd64", CgoEnabled: true},
{GOOS: "linux", GOARCH: "amd64"},
{GOOS: "darwin", GOARCH: "386", CgoEnabled: true},
{GOOS: "darwin", GOARCH: "386"},
{GOOS: "darwin", GOARCH: "amd64", CgoEnabled: true},
{GOOS: "darwin", GOARCH: "amd64"},
{GOOS: "windows", GOARCH: "amd64"},
{GOOS: "windows", GOARCH: "386"},
}
func contextName(c *build.Context) string {
s := c.GOOS + "-" + c.GOARCH
if c.CgoEnabled {
return s + "-cgo"
}
return s
}
func main() { func main() {
flag.Parse() flag.Parse()
@ -48,28 +69,54 @@ func main() {
pkgs = strings.Fields(string(stds)) pkgs = strings.Fields(string(stds))
} }
w := NewWalker()
tree, _, err := build.FindTree("os") // some known package tree, _, err := build.FindTree("os") // some known package
if err != nil { if err != nil {
log.Fatalf("failed to find tree: %v", err) log.Fatalf("failed to find tree: %v", err)
} }
w.tree = tree
for _, pkg := range pkgs { var featureCtx = make(map[string]map[string]bool) // feature -> context name -> true
w.wantedPkg[pkg] = true for _, context := range contexts {
w := NewWalker()
w.context = context
w.tree = tree
for _, pkg := range pkgs {
w.wantedPkg[pkg] = true
}
for _, pkg := range pkgs {
if strings.HasPrefix(pkg, "cmd/") ||
strings.HasPrefix(pkg, "exp/") ||
strings.HasPrefix(pkg, "old/") {
continue
}
if !tree.HasSrc(pkg) {
log.Fatalf("no source in tree for package %q", pkg)
}
w.WalkPackage(pkg)
}
ctxName := contextName(context)
for _, f := range w.Features() {
if featureCtx[f] == nil {
featureCtx[f] = make(map[string]bool)
}
featureCtx[f][ctxName] = true
}
} }
for _, pkg := range pkgs { var features []string
if strings.HasPrefix(pkg, "cmd/") || for f, cmap := range featureCtx {
strings.HasPrefix(pkg, "exp/") || if len(cmap) == len(contexts) {
strings.HasPrefix(pkg, "old/") { features = append(features, f)
continue continue
} }
if !tree.HasSrc(pkg) { comma := strings.Index(f, ",")
log.Fatalf("no source in tree for package %q", pkg) for cname := range cmap {
f2 := fmt.Sprintf("%s (%s)%s", f[:comma], cname, f[comma:])
features = append(features, f2)
} }
w.WalkPackage(pkg)
} }
sort.Strings(features)
bw := bufio.NewWriter(os.Stdout) bw := bufio.NewWriter(os.Stdout)
defer bw.Flush() defer bw.Flush()
@ -81,7 +128,7 @@ func main() {
} }
v1 := strings.Split(string(bs), "\n") v1 := strings.Split(string(bs), "\n")
sort.Strings(v1) sort.Strings(v1)
v2 := w.Features() v2 := features
take := func(sl *[]string) string { take := func(sl *[]string) string {
s := (*sl)[0] s := (*sl)[0]
*sl = (*sl)[1:] *sl = (*sl)[1:]
@ -99,7 +146,7 @@ func main() {
} }
} }
} else { } else {
for _, f := range w.Features() { for _, f := range features {
fmt.Fprintf(bw, "%s\n", f) fmt.Fprintf(bw, "%s\n", f)
} }
} }
@ -112,6 +159,7 @@ type pkgSymbol struct {
} }
type Walker struct { type Walker struct {
context *build.Context
tree *build.Tree tree *build.Tree
fset *token.FileSet fset *token.FileSet
scope []string scope []string
@ -221,8 +269,17 @@ func (w *Walker) WalkPackage(name string) {
}() }()
dir := filepath.Join(w.tree.SrcDir(), filepath.FromSlash(name)) dir := filepath.Join(w.tree.SrcDir(), filepath.FromSlash(name))
info, err := build.ScanDir(dir) var info *build.DirInfo
var err error
if ctx := w.context; ctx != nil {
info, err = ctx.ScanDir(dir)
} else {
info, err = build.ScanDir(dir)
}
if err != nil { if err != nil {
if strings.Contains(err.Error(), "no Go source files") {
return
}
log.Fatalf("pkg %q, dir %q: ScanDir: %v", name, dir, err) log.Fatalf("pkg %q, dir %q: ScanDir: %v", name, dir, err)
} }