func()

in cli/cli.go [68:125]


func (g *Go2ChefCLI) Run(argv []string) int {
	// Set early config flags and parse. As we build our
	// own pflag.FlagSet plugins using pflag.*Var() functions
	// won't be able to pollute this.
	go2chef.InitializeConfigSourceFlags(g.flags)
	if err := g.flags.Parse(argv); err != nil {
		return 1
	}

	// Pull in early log level config from flags
	logLevel, err := go2chef.StringToLogLevel(g.logLevel)
	if err != nil {
		go2chef.EarlyLogger.Printf("--log-level/-l value `%s` is invalid: %s", g.logLevel, err)
		return 1
	}

	// Add stdlib early logger
	early := stdlib.NewFromLogger(go2chef.EarlyLogger, logLevel, g.logDebugLevel)

	// Load actual configuration
	cfg, err := go2chef.GetConfig(g.configSourceName, early)
	if err != nil {
		early.Errorf("config error: %s", err)
		return 1
	}

	// Wire up central logging
	go2chef.InitGlobalLogger(cfg.Loggers)
	logger = go2chef.GetGlobalLogger()

	logger.WriteEvent(&go2chef.Event{
		Event:     "LOGGING_INITIALIZED",
		Component: "go2chef.cli",
	})

	defer temp.Cleanup(g.preserveTemp)
	defer go2chef.ShutdownGlobalLogger()

	all_start := time.Now()
	for i, step := range cfg.Steps {
		start := time.Now()
		eventStartStep(i, step.Name(), step.Type())
		if err := step.Download(); err != nil {
			eventFailStep(i, err, step.Name(), step.Type())
			return 1
		}
		if err := step.Execute(); err != nil {
			eventFailStep(i, err, step.Name(), step.Type())
			return 1
		}
		elapsed := int(time.Since(start).Seconds())
		eventFinishStep(i, elapsed, step.Name(), step.Type())
	}

	all_elapsed := int(time.Since(all_start).Seconds())
	eventFinishAllSteps(len(cfg.Steps), all_elapsed)
	return 0
}