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:
parent
bb7b1a11d5
commit
f23a6dba5e
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user