11import * as vscode from "vscode"
22import * as cp from "child_process"
33import * as path from "path"
4- import { mediaDir } from "./utils"
4+ import { exec , mediaDir , execJSON } from "./utils"
55
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
1112
1213 constructor ( ) {
1314 this . refresh ( )
@@ -17,87 +18,53 @@ export class CoderWorkspacesProvider implements vscode.TreeDataProvider<CoderWor
1718 this . _onDidChangeTreeData . fire ( )
1819 }
1920
20- getTreeItem ( element : CoderWorkspace ) : vscode . TreeItem {
21+ getTreeItem ( element : CoderWorkspaceListItem ) : vscode . TreeItem {
2122 return element
2223 }
2324
24- getChildren ( element ?: CoderWorkspace ) : Thenable < CoderWorkspace [ ] > {
25- return getWorkspaces ( )
25+ getChildren ( element ?: CoderWorkspaceListItem ) : Thenable < CoderWorkspaceListItem [ ] > {
26+ return getWorkspaceItems ( )
2627 }
2728}
2829
2930export 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+ }
4137}
4238
4339export 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+ }
5546}
5647
5748export 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
7256}
7357
74- const getWorkspaces = async ( ) : Promise < CoderWorkspace [ ] > => {
58+ const getWorkspaceItems = async ( ) : Promise < CoderWorkspaceListItem [ ] > => {
7559 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 ) )
8762}
8863
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` )
10168
10269export interface CoderWorkspace {
10370 id : string
@@ -108,6 +75,7 @@ export interface CoderWorkspace {
10875 image_tag : string
10976 image_id : string
11077 gpus : number
78+ updating : boolean
11179 latest_stat : {
11280 container_status : string
11381 }
@@ -118,7 +86,7 @@ export interface CoderImage {
11886 repository : string
11987}
12088
121- export class CoderWorkspace extends vscode . TreeItem {
89+ export class CoderWorkspaceListItem extends vscode . TreeItem {
12290 constructor (
12391 public readonly workspace : CoderWorkspace ,
12492 public readonly images : CoderImage [ ] ,
0 commit comments