diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2018-12-18 21:25:49 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2018-12-18 21:25:49 +1100 |
commit | c35255b7a9dd673db5efd28c83f618b6edff6289 (patch) | |
tree | 8b84f3594891ed62ca9024ad9bf75ed88a611077 /pkg | |
parent | 319064f040e028d75480ac0093225f23e81ec635 (diff) |
set stderr ourselves so that we only read the error output if there is any
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/commands/exec_live_default.go | 40 |
1 files changed, 10 insertions, 30 deletions
diff --git a/pkg/commands/exec_live_default.go b/pkg/commands/exec_live_default.go index 37e27625a..bce912160 100644 --- a/pkg/commands/exec_live_default.go +++ b/pkg/commands/exec_live_default.go @@ -4,14 +4,14 @@ package commands import ( "bufio" + "bytes" "errors" "os" "os/exec" "strings" - "sync" "unicode/utf8" - "github.com/kr/pty" + "github.com/jesseduffield/pty" "github.com/mgutz/str" ) @@ -21,57 +21,37 @@ import ( // NOTE: If the return data is empty it won't written anything to stdin // NOTE: You don't have to include a enter in the return data this function will do that for you func RunCommandWithOutputLiveWrapper(c *OSCommand, command string, output func(string) string) error { - cmdOutput := []string{} - cmdOutputOffset := 0 - splitCmd := str.ToArgv(command) cmd := exec.Command(splitCmd[0], splitCmd[1:]...) cmd.Env = os.Environ() cmd.Env = append(cmd.Env, "LANG=en_US.utf8", "LC_ALL=en_US.UTF-8") - tty, err := pty.Start(cmd) + var stderr bytes.Buffer + cmd.Stderr = &stderr + + ptmx, err := pty.Start(cmd) if err != nil { return err } - lastWritten := "" - - var waitForBufio sync.WaitGroup - waitForBufio.Add(1) - go func() { - scanner := bufio.NewScanner(tty) + scanner := bufio.NewScanner(ptmx) scanner.Split(scanWordsWithNewLines) for scanner.Scan() { toOutput := strings.Trim(scanner.Text(), " ") - cmdOutput = append(cmdOutput, toOutput) toWrite := output(toOutput) if len(toWrite) > 0 { - toWriteSplit := strings.Split(toWrite, " ") - lastWritten = toWriteSplit[len(toWriteSplit)-1] - // don't do len(cmdOutput)-1 because the next value is the username / password - cmdOutputOffset = len(cmdOutput) - _, _ = tty.WriteString(toWrite + "\n") + _, _ = ptmx.WriteString(toWrite + "\n") } } - waitForBufio.Done() }() err = cmd.Wait() - tty.Close() + ptmx.Close() if err != nil { - waitForBufio.Wait() - for i, item := range cmdOutput { - if lastWritten == item && cmdOutputOffset < i { - cmdOutputOffset = i + 1 - } - } - if cmdOutputOffset > len(cmdOutput)-1 { - cmdOutputOffset = len(cmdOutput) - 1 - } - return errors.New(err.Error() + ", " + strings.Join(cmdOutput[cmdOutputOffset:], " ")) + return errors.New(stderr.String()) } return nil |