1
1
import * as vscode from "vscode"
2
2
import * as cp from "child_process"
3
3
import * as path from "path"
4
- import { mediaDir } from "./utils"
4
+ import { exec , mediaDir , execJSON } from "./utils"
5
5
6
- export class CoderWorkspacesProvider implements vscode . TreeDataProvider < CoderWorkspace > {
7
- private _onDidChangeTreeData : vscode . EventEmitter < CoderWorkspace | undefined | void > = new vscode . EventEmitter <
8
- CoderWorkspace | undefined | void
9
- > ( )
10
- readonly onDidChangeTreeData : vscode . Event < CoderWorkspace | undefined | void > = this . _onDidChangeTreeData . event
6
+ export class CoderWorkspacesProvider implements vscode . TreeDataProvider < CoderWorkspaceListItem > {
7
+ private _onDidChangeTreeData : vscode . EventEmitter <
8
+ CoderWorkspaceListItem | undefined | void
9
+ > = new vscode . EventEmitter < CoderWorkspaceListItem | undefined | void > ( )
10
+ readonly onDidChangeTreeData : vscode . Event < CoderWorkspaceListItem | undefined | void > = this . _onDidChangeTreeData
11
+ . event
11
12
12
13
constructor ( ) {
13
14
this . refresh ( )
@@ -17,87 +18,53 @@ export class CoderWorkspacesProvider implements vscode.TreeDataProvider<CoderWor
17
18
this . _onDidChangeTreeData . fire ( )
18
19
}
19
20
20
- getTreeItem ( element : CoderWorkspace ) : vscode . TreeItem {
21
+ getTreeItem ( element : CoderWorkspaceListItem ) : vscode . TreeItem {
21
22
return element
22
23
}
23
24
24
- getChildren ( element ?: CoderWorkspace ) : Thenable < CoderWorkspace [ ] > {
25
- return getWorkspaces ( )
25
+ getChildren ( element ?: CoderWorkspaceListItem ) : Thenable < CoderWorkspaceListItem [ ] > {
26
+ return getWorkspaceItems ( )
26
27
}
27
28
}
28
29
29
30
export const rebuildWorkspace = async ( name : string ) : Promise < void > => {
30
- return new Promise ( ( res , rej ) => {
31
- cp . exec ( `coder envs rebuild ${ name } --force` , ( err , stdout , stderr ) => {
32
- if ( err ) {
33
- vscode . window . showErrorMessage ( `Failed to rebuild Coder Workspaces: ${ err } ` )
34
- rej ( err )
35
- return
36
- }
37
- res ( )
38
- vscode . window . showInformationMessage ( `Rebuilding Coder Workspace "${ name } "` )
39
- } )
40
- } )
31
+ try {
32
+ await exec ( `coder envs rebuild ${ name } --force` )
33
+ vscode . window . showInformationMessage ( `Rebuilding Coder Workspace "${ name } "` )
34
+ } catch ( e ) {
35
+ vscode . window . showErrorMessage ( `Failed to rebuild Coder Workspaces: ${ e } ` )
36
+ }
41
37
}
42
38
43
39
export const shutdownWorkspace = async ( name : string ) : Promise < void > => {
44
- return new Promise ( ( res , rej ) => {
45
- cp . exec ( `coder envs stop ${ name } ` , ( err , stdout , stderr ) => {
46
- if ( err ) {
47
- vscode . window . showErrorMessage ( `Failed to shutdown Coder Workspaces: ${ err } ` )
48
- rej ( err )
49
- return
50
- }
51
- res ( )
52
- vscode . window . showInformationMessage ( `Shutting down Coder Workspace "${ name } "` )
53
- } )
54
- } )
40
+ try {
41
+ await exec ( `coder envs stop ${ name } ` )
42
+ vscode . window . showInformationMessage ( `Shutting down Coder Workspace "${ name } "` )
43
+ } catch ( e ) {
44
+ vscode . window . showErrorMessage ( `Failed to shutdown Coder Workspaces: ${ e } ` )
45
+ }
55
46
}
56
47
57
48
export const openWorkspace = async ( name : string ) : Promise < void > => {
58
- return new Promise ( ( res , rej ) => {
59
- cp . exec (
60
- `coder config-ssh && code --remote "ssh-remote+coder.${ name } " $(coder sh ${ name } pwd | head -n 1)` ,
61
- ( err , stdout , stderr ) => {
62
- if ( err ) {
63
- vscode . window . showErrorMessage ( `Failed to open Coder Workspaces: ${ err } ` )
64
- rej ( err )
65
- return
66
- }
67
- res ( )
68
- vscode . window . showInformationMessage ( `Opening Coder Workspace "${ name } "` )
69
- } ,
70
- )
71
- } )
49
+ try {
50
+ await exec ( `coder config-ssh && code --remote "ssh-remote+coder.${ name } " $(coder sh ${ name } pwd | head -n 1)` )
51
+ vscode . window . showInformationMessage ( `Opening Coder Workspace ${ name } ` )
52
+ } catch ( e ) {
53
+ vscode . window . showErrorMessage ( `Failed to open Coder Workspace ${ name } : ${ e } ` )
54
+ }
55
+ return
72
56
}
73
57
74
- const getWorkspaces = async ( ) : Promise < CoderWorkspace [ ] > => {
58
+ const getWorkspaceItems = async ( ) : Promise < CoderWorkspaceListItem [ ] > => {
75
59
const images = await getImages ( )
76
- return new Promise ( ( res , rej ) => {
77
- cp . exec ( "coder envs ls --output json" , ( err , stdout , stderr ) => {
78
- if ( err ) {
79
- vscode . window . showErrorMessage ( "Failed to fetch Coder Workspaces" )
80
- res ( [ ] )
81
- return
82
- }
83
- const workspaces : CoderWorkspace [ ] = JSON . parse ( stdout )
84
- res ( workspaces . map ( ( w ) => new CoderWorkspace ( w , images , vscode . TreeItemCollapsibleState . None ) ) )
85
- } )
86
- } )
60
+ const envs = await getWorkspaces ( )
61
+ return envs . map ( ( w ) => new CoderWorkspaceListItem ( w , images , vscode . TreeItemCollapsibleState . None ) )
87
62
}
88
63
89
- const getImages = ( ) : Promise < CoderImage [ ] > => {
90
- return new Promise ( ( res , rej ) => {
91
- cp . exec ( "coder images ls --output json" , ( err , stdout , stderr ) => {
92
- if ( err ) {
93
- vscode . window . showErrorMessage ( "Failed to fetch Coder Images" )
94
- res ( [ ] )
95
- return
96
- }
97
- res ( JSON . parse ( stdout ) )
98
- } )
99
- } )
100
- }
64
+ const getWorkspaces = async ( ) : Promise < CoderWorkspace [ ] > =>
65
+ await execJSON < CoderWorkspace [ ] > ( "coder envs ls --output json" )
66
+
67
+ const getImages = ( ) : Promise < CoderImage [ ] > => execJSON < CoderImage [ ] > ( `coder images ls --output json` )
101
68
102
69
export interface CoderWorkspace {
103
70
id : string
@@ -108,6 +75,7 @@ export interface CoderWorkspace {
108
75
image_tag : string
109
76
image_id : string
110
77
gpus : number
78
+ updating : boolean
111
79
latest_stat : {
112
80
container_status : string
113
81
}
@@ -118,7 +86,7 @@ export interface CoderImage {
118
86
repository : string
119
87
}
120
88
121
- export class CoderWorkspace extends vscode . TreeItem {
89
+ export class CoderWorkspaceListItem extends vscode . TreeItem {
122
90
constructor (
123
91
public readonly workspace : CoderWorkspace ,
124
92
public readonly images : CoderImage [ ] ,
0 commit comments