@@ -50,7 +50,12 @@ export class Remote {
5050 /**
5151 * Try to get the workspace running. Return undefined if the user canceled.
5252 */
53- private async maybeWaitForRunning ( restClient : Api , workspace : Workspace ) : Promise < Workspace | undefined > {
53+ private async maybeWaitForRunning (
54+ restClient : Api ,
55+ workspace : Workspace ,
56+ label : string ,
57+ binPath : string ,
58+ ) : Promise < Workspace | undefined > {
5459 // Maybe already running?
5560 if ( workspace . latest_build . status === "running" ) {
5661 return workspace
@@ -63,6 +68,28 @@ export class Remote {
6368 let terminal : undefined | vscode . Terminal
6469 let attempts = 0
6570
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+
6693 try {
6794 // Show a notification while we wait.
6895 return await this . vscodeProposed . window . withProgress (
@@ -72,39 +99,30 @@ export class Remote {
7299 title : "Waiting for workspace build..." ,
73100 } ,
74101 async ( ) => {
102+ const globalConfigDir = path . dirname ( this . storage . getSessionTokenPath ( label ) )
75103 while ( workspace . latest_build . status !== "running" ) {
76104 ++ attempts
77105 switch ( workspace . latest_build . status ) {
78106 case "pending" :
79107 case "starting" :
80108 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- }
109+ writeEmitter = initWriteEmitterAndTerminal ( )
99110 this . storage . writeToCoderOutputChannel ( `Waiting for ${ workspaceName } ...` )
100111 workspace = await waitForBuild ( restClient , writeEmitter , workspace )
101112 break
102113 case "stopped" :
103114 if ( ! ( await this . confirmStart ( workspaceName ) ) ) {
104115 return undefined
105116 }
117+ writeEmitter = initWriteEmitterAndTerminal ( )
106118 this . storage . writeToCoderOutputChannel ( `Starting ${ workspaceName } ...` )
107- workspace = await startWorkspaceIfStoppedOrFailed ( restClient , workspace )
119+ workspace = await startWorkspaceIfStoppedOrFailed (
120+ restClient ,
121+ globalConfigDir ,
122+ binPath ,
123+ workspace ,
124+ writeEmitter ,
125+ )
108126 break
109127 case "failed" :
110128 // On a first attempt, we will try starting a failed workspace
@@ -113,8 +131,15 @@ export class Remote {
113131 if ( ! ( await this . confirmStart ( workspaceName ) ) ) {
114132 return undefined
115133 }
134+ writeEmitter = initWriteEmitterAndTerminal ( )
116135 this . storage . writeToCoderOutputChannel ( `Starting ${ workspaceName } ...` )
117- workspace = await startWorkspaceIfStoppedOrFailed ( restClient , workspace )
136+ workspace = await startWorkspaceIfStoppedOrFailed (
137+ restClient ,
138+ globalConfigDir ,
139+ binPath ,
140+ workspace ,
141+ writeEmitter ,
142+ )
118143 break
119144 }
120145 // Otherwise fall through and error.
@@ -156,6 +181,9 @@ export class Remote {
156181
157182 const workspaceName = `${ parts . username } /${ parts . workspace } `
158183
184+ // Migrate "session_token" file to "session", if needed.
185+ await this . storage . migrateSessionToken ( parts . label )
186+
159187 // Get the URL and token belonging to this host.
160188 const { url : baseUrlRaw , token } = await this . storage . readCliConfig ( parts . label )
161189
@@ -292,7 +320,7 @@ export class Remote {
292320 disposables . push ( this . registerLabelFormatter ( remoteAuthority , workspace . owner_name , workspace . name ) )
293321
294322 // If the workspace is not in a running state, try to get it running.
295- const updatedWorkspace = await this . maybeWaitForRunning ( workspaceRestClient , workspace )
323+ const updatedWorkspace = await this . maybeWaitForRunning ( workspaceRestClient , workspace , parts . label , binaryPath )
296324 if ( ! updatedWorkspace ) {
297325 // User declined to start the workspace.
298326 await this . closeRemote ( )
0 commit comments