func RunCmdWithTimeout()

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)
}