package main import ( "fmt" "os" "os/exec" "path/filepath" "strings" "github.com/logrusorgru/aurora" ) // goVet executes "go vet" recursively for each module in the git repo. As of // go 1.13, "go vet ./..." is required to recurse but does not straddle // module boundaries. It must be run in a valid package directory. It is // significantly faster than running individual "go vet ." in each dir. func goVet() error { return filepath.Walk(".", goVetW) } func goVetW(path string, info os.FileInfo, err error) error { switch { case err != nil: return err case info.Mode().IsDir() && strings.HasPrefix(info.Name(), "."): return filepath.SkipDir case info.Mode().IsRegular() && info.Name() == "go.mod": dir := filepath.Dir(path) Info(" running %q in %s", aurora.Blue("go vet"), aurora.Green(dir)) cmd := exec.Command("go", "vet", "./...") cmd.Dir = path op, err := cmd.CombinedOutput() switch { case len(op) > 0 && err != nil: return fmt.Errorf("go vet failed: %s\n%s\n", aurora.Red(err), op) case len(op) > 0: return fmt.Errorf("%s:\n%s\n", aurora.Red("go vet reports"), op) case err != nil: return err } } return nil }