github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/cmd/chore/e2e/run/command.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "context" 6 "fmt" 7 "io" 8 "os/exec" 9 "strings" 10 11 "github.com/pkg/errors" 12 ) 13 14 func runCommand(settings programSettings, logPrefix *string, write io.Writer, scan func(line string), cmd *exec.Cmd, args ...string) error { 15 16 cmd.Args = append(cmd.Args, args...) 17 18 errWriter, errWrite := logWriter(settings.logger.Warnf) 19 defer errWrite() 20 cmd.Stderr = errWriter 21 22 stdoutReader, err := cmd.StdoutPipe() 23 if err != nil { 24 panic(err) 25 } 26 27 var scanReader io.Reader = stdoutReader 28 29 if write != nil { 30 scanReader = io.TeeReader(stdoutReader, write) 31 } 32 33 settings.logger.Debugf(fmt.Sprintf(`'%s'`, strings.Join(cmd.Args, `' '`))) 34 35 if err := cmd.Start(); err != nil { 36 if errors.Is(err, context.Canceled) { 37 return nil 38 } 39 panic(err) 40 } 41 scanner := bufio.NewScanner(scanReader) 42 for scanner.Scan() { 43 line := scanner.Text() 44 if line == "" { 45 continue 46 } 47 if scan != nil { 48 scan(line) 49 } 50 51 if logPrefix != nil { 52 logStdout(settings, *logPrefix+line) 53 } 54 } 55 if err := scanner.Err(); err != nil { 56 return err 57 } 58 return cmd.Wait() 59 }