func run()

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)
}