in internal/platform/utils/cmd.go [81:128]
func RunCmdWithTimeout(
cwd string,
stdout *os.File,
stderr *os.File,
timeout time.Duration,
timeoutExitCode int,
args ...string,
) (int, error) {
log.Debugf("Running command: %v", args)
cmd := exec.Command("bash", "-c", strings.Join(args, " ")) // TODO : Viktor told about set -e
var stdoutPipe, stderrPipe io.ReadCloser
var err error
if //goland:noinspection GoBoolExpressions
runtime.GOOS == "windows" {
cmd = prepareWinCmd(args...)
stdoutPipe, err = cmd.StdoutPipe()
if err != nil {
return 1, fmt.Errorf("failed to get stdout pipe: %w", err)
}
stderrPipe, err = cmd.StderrPipe()
if err != nil {
return 1, fmt.Errorf("failed to get stderr pipe: %w", err)
}
} else {
cmd.Stdout = stdout
cmd.Stderr = stderr
}
if cmd.Dir, err = getCwdPath(cwd); err != nil {
return 1, err
}
cmd.Stdin = bt.NewBuffer([]byte{})
if err := cmd.Start(); err != nil {
return 1, fmt.Errorf("failed to start command: %w", err)
}
waitCh := make(chan error, 1)
go func() {
waitCh <- cmd.Wait()
close(waitCh)
}()
if //goland:noinspection GoBoolExpressions
runtime.GOOS == "windows" {
go readAndWrite(stdoutPipe, stdout)
go readAndWrite(stderrPipe, stderr)
}
return handleSignals(cmd, waitCh, timeout, timeoutExitCode)
}