@@ -2,6 +2,7 @@ package cmd
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"io"
6
7
"os"
7
8
"strings"
@@ -15,6 +16,7 @@ import (
15
16
16
17
"cdr.dev/coder-cli/coder-sdk"
17
18
"cdr.dev/coder-cli/internal/activity"
19
+ "cdr.dev/coder-cli/internal/clog"
18
20
"cdr.dev/coder-cli/internal/x/xterminal"
19
21
"cdr.dev/wsep"
20
22
@@ -153,7 +155,7 @@ func runCommand(ctx context.Context, envName, command string, args []string) err
153
155
if err != nil {
154
156
var closeErr websocket.CloseError
155
157
if xerrors .As (err , & closeErr ) {
156
- return xerrors . Errorf ( "network error, is %q online?" , envName )
158
+ return networkErr ( client , env )
157
159
}
158
160
return xerrors .Errorf ("start remote command: %w" , err )
159
161
}
@@ -179,7 +181,6 @@ func runCommand(ctx context.Context, envName, command string, args []string) err
179
181
}
180
182
}()
181
183
go func () {
182
-
183
184
if _ , err := io .Copy (os .Stderr , process .Stderr ()); err != nil {
184
185
cancel ()
185
186
}
@@ -188,13 +189,26 @@ func runCommand(ctx context.Context, envName, command string, args []string) err
188
189
if err := process .Wait (); err != nil {
189
190
var closeErr websocket.CloseError
190
191
if xerrors .Is (err , ctx .Err ()) || xerrors .As (err , & closeErr ) {
191
- return xerrors . Errorf ( "network error, is %q online?" , envName )
192
+ return networkErr ( client , env )
192
193
}
193
194
return err
194
195
}
195
196
return nil
196
197
}
197
198
199
+ func networkErr (client * coder.Client , env * coder.Environment ) error {
200
+ if env .LatestStat .ContainerStatus != coder .EnvironmentOn {
201
+ return clog .Fatal (
202
+ "environment is not running" ,
203
+ fmt .Sprintf ("environment %q is not running" , env .Name ),
204
+ fmt .Sprintf ("its current status is %q" ,env .LatestStat .ContainerStatus ),
205
+ "" ,
206
+ clog .Bold ("tip: " )+ fmt .Sprintf ("run \" coder envs rebuild %s --follow\" to start the environment" , env .Name ),
207
+ )
208
+ }
209
+ return xerrors .Errorf ("network error, is %q online?" , env .Name )
210
+ }
211
+
198
212
func heartbeat (ctx context.Context , conn * websocket.Conn , interval time.Duration ) {
199
213
ticker := time .NewTicker (interval )
200
214
defer ticker .Stop ()
0 commit comments