package cmd import ( "fmt" "os" "github.com/rs/zerolog" "orus.io/orus-io/beaver/lib/logging" "orus.io/orus-io/beaver/runner" ) type BuildCmd struct { Args struct { DryRun bool `short:"d" long:"dry-run" description:"if set only prints commands but do not run them"` Keep bool `short:"k" long:"keep" description:"Keep the temporary files"` Output string `short:"o" long:"output" description:"output directory, use \"stdout\" to print to stdout"` } PositionalArgs struct { DirName string `required:"yes" positional-arg-name:"directory"` } `positional-args:"yes"` log zerolog.Logger `no-flag:"t"` } // NewBuildCmd ... func NewBuildCmd(loggingOptions *logging.Options) *BuildCmd { cmd := BuildCmd{log: loggingOptions.Logger()} return &cmd } // Execute ... func (cmd *BuildCmd) Execute([]string) error { cmd.log.Debug().Str("directory", cmd.PositionalArgs.DirName).Msg("starting beaver") config := runner.NewCmdConfig(cmd.log, ".", cmd.PositionalArgs.DirName, cmd.Args.DryRun, cmd.Args.Output) path, err := os.Getwd() if err != nil { cmd.log.Fatal().Err(err).Msg("cannot get current working directory") } tmpDir, err := os.MkdirTemp(path, ".beaver-") if err != nil { return fmt.Errorf("failed to create temp dir: %w", err) } if !cmd.Args.Keep { defer func() { if err := os.RemoveAll(tmpDir); err != nil { cmd.log.Err(err).Str("tempdir", tmpDir).Msg("failed to remove temp dir") } }() } if err := config.Initialize(tmpDir); err != nil { return fmt.Errorf("failed to prepare config: %w", err) } r := runner.NewRunner(config) return r.Build(tmpDir) } func init() { buildCmd := NewBuildCmd(LoggingOptions) _, err := parser.AddCommand("build", "Build new environment", "", buildCmd) if err != nil { Logger.Fatal().Msg(err.Error()) } g, err := parser.AddGroup("Logging", "Logging options", LoggingOptions) if err != nil { panic(err) } g.Namespace = "log" }