From 38459d709d7d07350fff99d47fd4e9a7e9d8a91d Mon Sep 17 00:00:00 2001 From: dan9186 Date: Tue, 14 Apr 2026 18:08:37 -0700 Subject: [PATCH] capture the output and format it more --- cmd/root.go | 9 +++++++++ confile/step.go | 29 ++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 3546b3a..7d4eff9 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,9 +1,11 @@ package cmd import ( + "errors" "fmt" "io" "os" + "os/exec" "sort" "github.com/gomicro/forge/cmd/config" @@ -61,12 +63,19 @@ reference sub-steps, or define pre/post hooks. Pass --verbose to see each comman Args: cobra.MinimumNArgs(1), RunE: rootFunc, ValidArgsFunction: validArgsFunc, + SilenceUsage: true, + SilenceErrors: true, } // Execute adds all child commands to the root command and sets flags appropriately. // This is called by main.main(). It only needs to happen once to the rootCmd. func Execute() { if err := RootCmd.Execute(); err != nil { + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + os.Exit(exitErr.ExitCode()) + } + os.Exit(1) } } diff --git a/confile/step.go b/confile/step.go index 1a1aa14..0deb62a 100644 --- a/confile/step.go +++ b/confile/step.go @@ -1,6 +1,7 @@ package confile import ( + "bytes" "fmt" "os" "os/exec" @@ -125,14 +126,36 @@ func executeCmd(cmdString string, stepEnvs, projectEnvs map[string]string, vars cmd.Env = append(cmd.Env, os.Environ()...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err := cmd.Start() if err != nil { return fmt.Errorf("execute: %w", err) } - return cmd.Wait() + waitErr := cmd.Wait() + + if stdout.Len() > 0 { + scrb.PrintLines(&stdout) + } + + if stderr.Len() > 0 { + if viper.GetBool("verbose") { + scrb.BeginDescribe("\033[1;31mstderr\033[0m") + scrb.PrintLines(&stderr) + scrb.EndDescribe() + } else { + fmt.Fprintf(os.Stderr, "\033[1;31mstderr\033[0m\n%s", stderr.String()) + } + } + + if waitErr != nil { + return fmt.Errorf("execute: %w", waitErr) + } + + return nil } func toSlice(e map[string]string) []string {