@@ -20,6 +20,7 @@ import { computeSSHProperties, sshSupportsSetEnv } from "./sshSupport"
20
20
import { Storage } from "./storage"
21
21
import { AuthorityPrefix , expandPath , parseRemoteAuthority } from "./util"
22
22
import { WorkspaceMonitor } from "./workspaceMonitor"
23
+ import { write } from "fs"
23
24
24
25
export interface RemoteDetails extends vscode . Disposable {
25
26
url : string
@@ -50,7 +51,11 @@ export class Remote {
50
51
/**
51
52
* Try to get the workspace running. Return undefined if the user canceled.
52
53
*/
53
- private async maybeWaitForRunning ( restClient : Api , workspace : Workspace ) : Promise < Workspace | undefined > {
54
+ private async maybeWaitForRunning (
55
+ restClient : Api ,
56
+ workspace : Workspace ,
57
+ binPath : string ,
58
+ ) : Promise < Workspace | undefined > {
54
59
// Maybe already running?
55
60
if ( workspace . latest_build . status === "running" ) {
56
61
return workspace
@@ -63,6 +68,28 @@ export class Remote {
63
68
let terminal : undefined | vscode . Terminal
64
69
let attempts = 0
65
70
71
+ function initWriteEmitterAndTerminal ( ) : vscode . EventEmitter < string > {
72
+ if ( ! writeEmitter ) {
73
+ writeEmitter = new vscode . EventEmitter < string > ( )
74
+ }
75
+ if ( ! terminal ) {
76
+ terminal = vscode . window . createTerminal ( {
77
+ name : "Build Log" ,
78
+ location : vscode . TerminalLocation . Panel ,
79
+ // Spin makes this gear icon spin!
80
+ iconPath : new vscode . ThemeIcon ( "gear~spin" ) ,
81
+ pty : {
82
+ onDidWrite : writeEmitter . event ,
83
+ close : ( ) => undefined ,
84
+ open : ( ) => undefined ,
85
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
+ } as Partial < vscode . Pseudoterminal > as any ,
87
+ } )
88
+ terminal . show ( true )
89
+ }
90
+ return writeEmitter
91
+ }
92
+
66
93
try {
67
94
// Show a notification while we wait.
68
95
return await this . vscodeProposed . window . withProgress (
@@ -78,33 +105,17 @@ export class Remote {
78
105
case "pending" :
79
106
case "starting" :
80
107
case "stopping" :
81
- if ( ! writeEmitter ) {
82
- writeEmitter = new vscode . EventEmitter < string > ( )
83
- }
84
- if ( ! terminal ) {
85
- terminal = vscode . window . createTerminal ( {
86
- name : "Build Log" ,
87
- location : vscode . TerminalLocation . Panel ,
88
- // Spin makes this gear icon spin!
89
- iconPath : new vscode . ThemeIcon ( "gear~spin" ) ,
90
- pty : {
91
- onDidWrite : writeEmitter . event ,
92
- close : ( ) => undefined ,
93
- open : ( ) => undefined ,
94
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
95
- } as Partial < vscode . Pseudoterminal > as any ,
96
- } )
97
- terminal . show ( true )
98
- }
108
+ writeEmitter = initWriteEmitterAndTerminal ( )
99
109
this . storage . writeToCoderOutputChannel ( `Waiting for ${ workspaceName } ...` )
100
110
workspace = await waitForBuild ( restClient , writeEmitter , workspace )
101
111
break
102
112
case "stopped" :
103
113
if ( ! ( await this . confirmStart ( workspaceName ) ) ) {
104
114
return undefined
105
115
}
116
+ writeEmitter = initWriteEmitterAndTerminal ( )
106
117
this . storage . writeToCoderOutputChannel ( `Starting ${ workspaceName } ...` )
107
- workspace = await startWorkspaceIfStoppedOrFailed ( restClient , workspace )
118
+ workspace = await startWorkspaceIfStoppedOrFailed ( restClient , binPath , workspace , writeEmitter )
108
119
break
109
120
case "failed" :
110
121
// On a first attempt, we will try starting a failed workspace
@@ -113,8 +124,9 @@ export class Remote {
113
124
if ( ! ( await this . confirmStart ( workspaceName ) ) ) {
114
125
return undefined
115
126
}
127
+ writeEmitter = initWriteEmitterAndTerminal ( )
116
128
this . storage . writeToCoderOutputChannel ( `Starting ${ workspaceName } ...` )
117
- workspace = await startWorkspaceIfStoppedOrFailed ( restClient , workspace )
129
+ workspace = await startWorkspaceIfStoppedOrFailed ( restClient , binPath , workspace , writeEmitter )
118
130
break
119
131
}
120
132
// Otherwise fall through and error.
@@ -292,7 +304,7 @@ export class Remote {
292
304
disposables . push ( this . registerLabelFormatter ( remoteAuthority , workspace . owner_name , workspace . name ) )
293
305
294
306
// If the workspace is not in a running state, try to get it running.
295
- const updatedWorkspace = await this . maybeWaitForRunning ( workspaceRestClient , workspace )
307
+ const updatedWorkspace = await this . maybeWaitForRunning ( workspaceRestClient , workspace , binaryPath )
296
308
if ( ! updatedWorkspace ) {
297
309
// User declined to start the workspace.
298
310
await this . closeRemote ( )
0 commit comments