@@ -16,6 +16,7 @@ import (
16
16
"go.coder.com/flog"
17
17
18
18
"cdr.dev/coder-cli/internal/activity"
19
+ "cdr.dev/coder-cli/internal/xterminal"
19
20
"cdr.dev/wsep"
20
21
)
21
22
@@ -30,19 +31,6 @@ func (cmd *shellCmd) Spec() cli.CommandSpec {
30
31
}
31
32
}
32
33
33
- func enableTerminal (fd int ) (restore func (), err error ) {
34
- state , err := terminal .MakeRaw (fd )
35
- if err != nil {
36
- return restore , xerrors .Errorf ("make raw term: %w" , err )
37
- }
38
- return func () {
39
- err := terminal .Restore (fd , state )
40
- if err != nil {
41
- flog .Error ("restore term state: %v" , err )
42
- }
43
- }, nil
44
- }
45
-
46
34
type resizeEvent struct {
47
35
height , width uint16
48
36
}
@@ -54,25 +42,6 @@ func (s resizeEvent) equal(s2 *resizeEvent) bool {
54
42
return s .height == s2 .height && s .width == s2 .width
55
43
}
56
44
57
- func sendResizeEvents (ctx context.Context , termfd int , process wsep.Process ) {
58
- events := resizeEvents (ctx , termfd )
59
-
60
- // Limit the frequency of resizes to prevent a stuttering effect.
61
- resizeLimiter := rate .NewLimiter (rate .Every (time .Millisecond * 100 ), 1 )
62
- for {
63
- select {
64
- case newsize := <- events :
65
- err := process .Resize (ctx , newsize .height , newsize .width )
66
- if err != nil {
67
- return
68
- }
69
- _ = resizeLimiter .Wait (ctx )
70
- case <- ctx .Done ():
71
- return
72
- }
73
- }
74
- }
75
-
76
45
func (cmd * shellCmd ) Run (fl * pflag.FlagSet ) {
77
46
if len (fl .Args ()) < 1 {
78
47
exitUsage (fl )
@@ -103,21 +72,45 @@ func (cmd *shellCmd) Run(fl *pflag.FlagSet) {
103
72
}
104
73
}
105
74
75
+ func sendResizeEvents (ctx context.Context , termfd uintptr , process wsep.Process ) {
76
+ events := resizeEvents (ctx , termfd )
77
+
78
+ // Limit the frequency of resizes to prevent a stuttering effect.
79
+ resizeLimiter := rate .NewLimiter (rate .Every (time .Millisecond * 100 ), 1 )
80
+ for {
81
+ select {
82
+ case newsize := <- events :
83
+ err := process .Resize (ctx , newsize .height , newsize .width )
84
+ if err != nil {
85
+ return
86
+ }
87
+ _ = resizeLimiter .Wait (ctx )
88
+ case <- ctx .Done ():
89
+ return
90
+ }
91
+ }
92
+ }
93
+
106
94
func runCommand (ctx context.Context , envName string , command string , args []string ) error {
107
95
var (
108
96
entClient = requireAuth ()
109
97
env = findEnv (entClient , envName )
110
98
)
111
99
112
- termfd := int ( os .Stdin .Fd () )
100
+ termfd := os .Stdin .Fd ()
113
101
114
- tty := terminal .IsTerminal (termfd )
102
+ tty := terminal .IsTerminal (int ( termfd ) )
115
103
if tty {
116
- restore , err := enableTerminal (termfd )
104
+ state , err := xterminal . MakeRaw (termfd )
117
105
if err != nil {
118
106
return err
119
107
}
120
- defer restore ()
108
+ defer func () {
109
+ err := xterminal .Restore (termfd , state )
110
+ if err != nil {
111
+ flog .Error ("restore term state: %v" , err )
112
+ }
113
+ }()
121
114
}
122
115
123
116
ctx , cancel := context .WithCancel (ctx )
0 commit comments