diff --git a/go/tools/builders/compile.go b/go/tools/builders/compile.go index 81c8afa9cf..59337d8321 100644 --- a/go/tools/builders/compile.go +++ b/go/tools/builders/compile.go @@ -17,6 +17,7 @@ package main import ( + "bytes" "flag" "fmt" "go/build" @@ -128,6 +129,8 @@ func run(args []string) error { } func main() { + log.SetFlags(0) // no timestamp + log.SetPrefix("GoCompile: ") if err := run(os.Args[1:]); err != nil { log.Fatal(err) } @@ -151,7 +154,7 @@ func checkDirectDeps(bctx build.Context, files []*goMetadata, deps []string, pac depSet[d] = true } - var errs depsError + derr := depsError{known: deps} for _, f := range files { for _, path := range f.imports { if path == "C" || stdlib[path] || isRelative(path) { @@ -161,26 +164,43 @@ func checkDirectDeps(bctx build.Context, files []*goMetadata, deps []string, pac continue } if !depSet[path] { - errs = append(errs, fmt.Errorf("%s: import of %s, which is not a direct dependency", f.filename, path)) + derr.missing = append(derr.missing, missingDep{f.filename, path}) } } } - if len(errs) > 0 { - return errs + if len(derr.missing) > 0 { + return derr } return nil } -type depsError []error +type depsError struct { + missing []missingDep + known []string +} + +type missingDep struct { + filename, imp string +} -var _ error = depsError(nil) +var _ error = depsError{} func (e depsError) Error() string { - errorStrings := make([]string, len(e)) - for i, err := range e { - errorStrings[i] = err.Error() + buf := bytes.NewBuffer(nil) + fmt.Fprintf(buf, "missing strict dependencies:\n") + for _, dep := range e.missing { + fmt.Fprintf(buf, "\t%s: import of %q\n", dep.filename, dep.imp) + } + if len(e.known) == 0 { + fmt.Fprintln(buf, "No dependencies were provided.") + } else { + fmt.Fprintln(buf, "Known dependencies are:") + for _, imp := range e.known { + fmt.Fprintf(buf, "\t%s\n", imp) + } } - return "missing strict dependencies:\n\t" + strings.Join(errorStrings, "\n\t") + fmt.Fprint(buf, "Check that imports in Go sources match importpath attributes in deps.") + return buf.String() } func isRelative(path string) bool {