Skip to content

Commit 8cf617b

Browse files
committed
Rename getCmdHandler to getCmdHandlerPty, and add getCmdHandlerNonPty
getCmdHandlerNonPty is defined for all platforms.
1 parent a400ef0 commit 8cf617b

File tree

3 files changed

+42
-43
lines changed

3 files changed

+42
-43
lines changed

pkg/commands/oscommands/cmd_obj_runner.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import (
44
"bufio"
55
"bytes"
66
"io"
7+
"os/exec"
78
"regexp"
89
"strings"
910
"time"
1011

1112
"github.com/go-errors/errors"
1213
"github.com/jesseduffield/gocui"
1314
"github.com/jesseduffield/lazygit/pkg/utils"
15+
"github.com/sasha-s/go-deadlock"
1416
"github.com/sirupsen/logrus"
1517
)
1618

@@ -236,7 +238,7 @@ func (self *cmdObjRunner) runAndStreamAux(
236238
var stderr bytes.Buffer
237239
cmd.Stderr = io.MultiWriter(cmdWriter, &stderr)
238240

239-
handler, err := self.getCmdHandler(cmd)
241+
handler, err := self.getCmdHandlerPty(cmd)
240242
if err != nil {
241243
return err
242244
}
@@ -410,3 +412,38 @@ func (self *cmdObjRunner) getCheckForCredentialRequestFunc() func([]byte) (Crede
410412
return 0, false
411413
}
412414
}
415+
416+
type Buffer struct {
417+
b bytes.Buffer
418+
m deadlock.Mutex
419+
}
420+
421+
func (b *Buffer) Read(p []byte) (n int, err error) {
422+
b.m.Lock()
423+
defer b.m.Unlock()
424+
return b.b.Read(p)
425+
}
426+
427+
func (b *Buffer) Write(p []byte) (n int, err error) {
428+
b.m.Lock()
429+
defer b.m.Unlock()
430+
return b.b.Write(p)
431+
}
432+
433+
func (self *cmdObjRunner) getCmdHandlerNonPty(cmd *exec.Cmd) (*cmdHandler, error) {
434+
stdoutReader, stdoutWriter := io.Pipe()
435+
cmd.Stdout = stdoutWriter
436+
437+
buf := &Buffer{}
438+
cmd.Stdin = buf
439+
440+
if err := cmd.Start(); err != nil {
441+
return nil, err
442+
}
443+
444+
return &cmdHandler{
445+
stdoutPipe: stdoutReader,
446+
stdinPipe: buf,
447+
close: func() error { return nil },
448+
}, nil
449+
}

pkg/commands/oscommands/cmd_obj_runner_default.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111

1212
// we define this separately for windows and non-windows given that windows does
1313
// not have great PTY support and we need a PTY to handle a credential request
14-
func (self *cmdObjRunner) getCmdHandler(cmd *exec.Cmd) (*cmdHandler, error) {
14+
func (self *cmdObjRunner) getCmdHandlerPty(cmd *exec.Cmd) (*cmdHandler, error) {
1515
ptmx, err := pty.Start(cmd)
1616
if err != nil {
1717
return nil, err

pkg/commands/oscommands/cmd_obj_runner_win.go

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,10 @@
44
package oscommands
55

66
import (
7-
"bytes"
8-
"io"
97
"os/exec"
10-
11-
"github.com/sasha-s/go-deadlock"
128
)
139

14-
type Buffer struct {
15-
b bytes.Buffer
16-
m deadlock.Mutex
17-
}
18-
19-
func (b *Buffer) Read(p []byte) (n int, err error) {
20-
b.m.Lock()
21-
defer b.m.Unlock()
22-
return b.b.Read(p)
23-
}
24-
25-
func (b *Buffer) Write(p []byte) (n int, err error) {
26-
b.m.Lock()
27-
defer b.m.Unlock()
28-
return b.b.Write(p)
29-
}
30-
31-
// TODO: Remove this hack and replace it with a proper way to run commands live on windows. We still have an issue where if a password is requested, the request for a password is written straight to stdout because we can't control the stdout of a subprocess of a subprocess. Keep an eye on https://github.com/creack/pty/pull/109
32-
func (self *cmdObjRunner) getCmdHandler(cmd *exec.Cmd) (*cmdHandler, error) {
33-
stdoutReader, stdoutWriter := io.Pipe()
34-
cmd.Stdout = stdoutWriter
35-
36-
buf := &Buffer{}
37-
cmd.Stdin = buf
38-
39-
if err := cmd.Start(); err != nil {
40-
return nil, err
41-
}
42-
43-
// because we don't yet have windows support for a pty, we instead just
44-
// pass our standard stream handlers and because there's no pty to close
45-
// we pass a no-op function for that.
46-
return &cmdHandler{
47-
stdoutPipe: stdoutReader,
48-
stdinPipe: buf,
49-
close: func() error { return nil },
50-
}, nil
10+
func (self *cmdObjRunner) getCmdHandlerPty(cmd *exec.Cmd) (*cmdHandler, error) {
11+
// We don't have PTY support on Windows yet, so we just return a non-PTY handler.
12+
return self.getCmdHandlerNonPty(cmd)
5113
}

0 commit comments

Comments
 (0)