in go/tools/bazel_benchmark/bazel_benchmark.go [102:170]
func run(args []string) error {
fs := flag.NewFlagSet(programName, flag.ExitOnError)
var rulesGoDir, outPath string
fs.StringVar(&rulesGoDir, "rules_go_dir", "", "directory where rules_go is checked out")
fs.StringVar(&outPath, "out", "", "csv file to append results to")
var keep bool
fs.BoolVar(&keep, "keep", false, "if true, the workspace directory won't be deleted at the end")
if err := fs.Parse(args); err != nil {
return err
}
if rulesGoDir == "" {
return errors.New("-rules_go_dir not set")
}
if abs, err := filepath.Abs(rulesGoDir); err != nil {
return err
} else {
rulesGoDir = abs
}
if outPath == "" {
return errors.New("-out not set")
}
if abs, err := filepath.Abs(outPath); err != nil {
return err
} else {
outPath = abs
}
commit, err := getCommit(rulesGoDir)
if err != nil {
return err
}
dir, err := setupWorkspace(rulesGoDir)
if err != nil {
return err
}
if !keep {
defer cleanupWorkspace(dir)
}
bazelVersion, err := getBazelVersion()
if err != nil {
return err
}
log.Printf("running benchmarks in %s", dir)
targetSet := make(map[string]bool)
for _, b := range benchmarks {
for _, t := range b.targets {
targetSet[t] = true
}
}
allTargets := make([]string, 0, len(targetSet))
for t := range targetSet {
allTargets = append(allTargets, t)
}
fetch(allTargets)
for i := range benchmarks {
b := &benchmarks[i]
log.Printf("running benchmark %d/%d: %s", i+1, len(benchmarks), b.desc)
if err := runBenchmark(b); err != nil {
return fmt.Errorf("error running benchmark %s: %v", b.desc, err)
}
}
log.Printf("writing results to %s", outPath)
return recordResults(outPath, time.Now().UTC(), bazelVersion, commit, benchmarks)
}