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  }