in sweet/cmd/sweet/gen.go [93:179]
func (c *genCmd) Run(args []string) error {
if len(args) != 0 {
return fmt.Errorf("unexpected arguments")
}
log.SetActivityLog(!c.quiet)
// Ensure all provided directories are absolute paths. This avoids problems with
// benchmarks potentially changing their current working directory.
var err error
c.assetsDir, err = filepath.Abs(c.assetsDir)
if err != nil {
return fmt.Errorf("creating absolute path from assets path: %v", err)
}
c.sourceAssetsDir, err = filepath.Abs(c.sourceAssetsDir)
if err != nil {
return fmt.Errorf("creating absolute path from source assets path: %v", err)
}
c.outputDir, err = filepath.Abs(c.outputDir)
if err != nil {
return fmt.Errorf("creating absolute path from output path: %v", err)
}
// Make sure the assets directory is there.
if info, err := os.Stat(c.assetsDir); os.IsNotExist(err) {
return fmt.Errorf("assets not found at %q: forgot to run `sweet get (-copy)`?", c.assetsDir)
} else if err != nil {
return fmt.Errorf("stat assets %q: %v", c.assetsDir, err)
} else if !info.IsDir() {
return fmt.Errorf("%q is not a directory", c.assetsDir)
}
// Decide which benchmarks to gen assets for, based on the -gen flag.
var benchmarks []*benchmark
var unknown []string
switch len(c.toGen) {
case 0:
benchmarks = benchmarkGroups["all"]
case 1:
if grp, ok := benchmarkGroups[c.toGen[0]]; ok {
benchmarks = grp
break
}
fallthrough
default:
for _, name := range c.toGen {
if benchmark, ok := allBenchmarksMap[name]; ok {
benchmarks = append(benchmarks, benchmark)
} else {
unknown = append(unknown, name)
}
}
}
if len(unknown) != 0 {
return fmt.Errorf("unknown benchmarks: %s", strings.Join(unknown, ", "))
}
// Find the go tool.
goTool, err := common.SystemGoTool()
if err != nil {
return err
}
log.Printf("Using Go: %s", goTool.Tool)
// Execute each generator.
for _, b := range benchmarks {
log.Printf("Generating assets: %s", b.name)
outputDir := filepath.Join(c.outputDir, b.name)
if err := mkdirAll(outputDir); err != nil {
return err
}
// Make a copy of the Go tool so that the generator
// is free to manipulate it without it leaking between
// generators.
gt := *goTool
cfg := common.GenConfig{
AssetsDir: filepath.Join(c.assetsDir, b.name),
SourceAssetsDir: filepath.Join(c.sourceAssetsDir, b.name),
OutputDir: outputDir,
GoTool: >,
}
if err := b.generator.Generate(&cfg); err != nil {
return err
}
}
return nil
}