From 5ce73d2fc584a29fc458800eda097bdb681f6cd6 Mon Sep 17 00:00:00 2001 From: Mikhail Klementev Date: Thu, 6 Apr 2023 18:14:24 +0000 Subject: [PATCH] Add stdout trace for sh commands --- pew.go | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/pew.go b/pew.go index 1d253cb..d5dddae 100644 --- a/pew.go +++ b/pew.go @@ -5,6 +5,7 @@ package main import ( + "bufio" "database/sql" "errors" "fmt" @@ -146,13 +147,38 @@ func successRate(state runstate) float64 { const pathDevNull = "/dev/null" -func sh(workdir, cmd string) (output string, err error) { - command := exec.Command("sh", "-c", "cd "+workdir+" && "+cmd) +func sh(workdir, command string) (output string, err error) { + flog := log.With(). + Str("workdir", workdir). + Str("command", command). + Logger() - log.Debug().Msgf("%v", command) + cmd := exec.Command("sh", "-c", "cd "+workdir+" && "+command) + + flog.Debug().Msgf("%v", cmd) + + stdout, err := cmd.StdoutPipe() + if err != nil { + return + } + cmd.Stderr = cmd.Stdout + + err = cmd.Start() + if err != nil { + return + } + + go func() { + scanner := bufio.NewScanner(stdout) + for scanner.Scan() { + m := scanner.Text() + output += m + "\n" + flog.Trace().Str("stdout", m).Msg("") + } + }() + + err = cmd.Wait() - raw, err := command.CombinedOutput() - output = string(raw) if err != nil { e := fmt.Sprintf("%v %v output: %v", cmd, err, output) err = errors.New(e)