@@ -17,7 +17,7 @@ import (
1717 "sync"
1818 "time"
1919
20- "github.com/creack/pty"
20+ "github.com/creack/pty/v2 "
2121 "github.com/vito/midterm"
2222)
2323
@@ -68,6 +68,8 @@ func WithTerm() (exitCode int) {
6868 "capture a snapshot on exit with the given name" )
6969
7070 log .SetFlags (0 )
71+ log .SetOutput (os .Stderr )
72+ log .SetPrefix ("term: " )
7173 flag .Parse ()
7274
7375 args := flag .Args ()
@@ -254,14 +256,14 @@ func WithTerm() (exitCode int) {
254256type terminalEmulator struct {
255257 mu sync.Mutex
256258 cmd * exec.Cmd
257- pty * os. File
259+ pty pty. Pty
258260 logf func (string , ... any )
259261
260262 term * midterm.Terminal
261263}
262264
263265func newVT100Emulator (
264- f * os. File ,
266+ f pty. Pty ,
265267 cmd * exec.Cmd ,
266268 rows , cols int ,
267269 autoResize bool ,
@@ -307,29 +309,36 @@ loop:
307309
308310func (m * terminalEmulator ) Close () error {
309311 _ , writeErr := m .pty .Write ([]byte {4 }) // EOT
312+ if writeErr != nil {
313+ writeErr = fmt .Errorf ("send EOT: %w" , writeErr )
314+ }
310315
311316 waitErrc := make (chan error , 1 )
312317 go func () {
313- waitErrc <- m .cmd .Wait ()
318+ err := m .cmd .Wait ()
319+ if err != nil {
320+ err = fmt .Errorf ("command %v: %w" , m .cmd , err )
321+ }
322+ waitErrc <- err
314323 }()
315324
316325 var waitErr error
317326 select {
318327 case waitErr = <- waitErrc :
319328 // ok
320- case <- time .After (3 * time .Second ):
329+ case <- time .After (10 * time .Second ):
321330 waitErr = fmt .Errorf ("timeout waiting for %v" , m .cmd )
322331 _ = m .cmd .Process .Kill ()
323332 }
324333
325- closeErr := m .pty .Close ()
326-
327- return errors .Join (waitErr , closeErr , writeErr )
334+ // On Windows, pty.Close may fail with invalid handle or access denied.
335+ // It's not really a problem, so we ignore the error.
336+ _ = m .pty .Close ()
337+ return errors .Join (waitErr , writeErr )
328338}
329339
330340func (m * terminalEmulator ) FeedKeys (s string ) error {
331341 _ , err := io .WriteString (m .pty , s )
332- _ = m .pty .Sync ()
333342 return err
334343}
335344
0 commit comments