@@ -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"
@@ -142,11 +143,7 @@ func runCommand(ctx context.Context, envName string, command string, args []stri
142
143
Env : cmdEnv ,
143
144
})
144
145
if err != nil {
145
- var closeErr websocket.CloseError
146
- if xerrors .As (err , & closeErr ) {
147
- return xerrors .Errorf ("network error, is %q online?" , envName )
148
- }
149
- return err
146
+ return prettyShellExitError (ctx , err , entClient , env .Name )
150
147
}
151
148
152
149
if tty {
@@ -178,15 +175,36 @@ func runCommand(ctx context.Context, envName string, command string, args []stri
178
175
}()
179
176
err = process .Wait ()
180
177
if err != nil {
181
- var closeErr websocket.CloseError
182
- if xerrors .Is (err , ctx .Err ()) || xerrors .As (err , & closeErr ) {
183
- return xerrors .Errorf ("network error, is %q online?" , envName )
184
- }
185
- return err
178
+ return prettyShellExitError (ctx , err , entClient , env .Name )
186
179
}
187
180
return nil
188
181
}
189
182
183
+ func prettyShellExitError (ctx context.Context , err error , client * coder.Client , envName string ) error {
184
+ var closeErr websocket.CloseError
185
+ if xerrors .Is (err , ctx .Err ()) || xerrors .As (err , & closeErr ) {
186
+ if err != nil {
187
+ return xerrors .Errorf ("network error, %s" , envErrorMessage (ctx , client , envName ))
188
+ }
189
+ }
190
+ return err
191
+ }
192
+
193
+ func envErrorMessage (ctx context.Context , client * coder.Client , envName string ) string {
194
+ env , err := client .EnvironmentByName (ctx , envName )
195
+ if err != nil {
196
+ return fmt .Sprintf ("failed to fetch environment status: %v" , err )
197
+ }
198
+ if env .LatestStat .ContainerStatus == "" {
199
+ return "environment status not found"
200
+ }
201
+ if env .LatestStat .ContainerStatus == coder .EnvironmentOn {
202
+ return fmt .Sprintf (`environment status is "%s", please try again` , env .LatestStat .ContainerStatus )
203
+ }
204
+
205
+ return fmt .Sprintf (`environment "%s" has a status of "%s"` , envName , env .LatestStat .ContainerStatus )
206
+ }
207
+
190
208
func heartbeat (ctx context.Context , c * websocket.Conn , interval time.Duration ) {
191
209
ticker := time .NewTicker (interval )
192
210
defer ticker .Stop ()
0 commit comments