func()

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:          &gt,
		}
		if err := b.generator.Generate(&cfg); err != nil {
			return err
		}
	}
	return nil
}