Skip to content

Commit b3bedd4

Browse files
committed
chore: cleanup
1 parent 69e34b9 commit b3bedd4

File tree

4 files changed

+68
-79
lines changed

4 files changed

+68
-79
lines changed

.prettierrc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
"overrides": [
66
{
77
"files": [
8-
"./README.md",
9-
"./reports/**/*.md",
10-
"./rfcs/**/*.md"
8+
"./README.md"
119
],
1210
"options": {
1311
"printWidth": 80,

src/extension.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,28 @@ import {
1010
rebuildWorkspace,
1111
openWorkspace,
1212
shutdownWorkspace,
13+
CoderWorkspaceListItem,
1314
} from "./workspaces"
1415
import { coderWorkspaceLogsDocumentProvider, handleShowLogsCommand } from "./logs"
1516

1617
export function activate(context: vscode.ExtensionContext) {
1718
preflightCheckCoderInstalled()
19+
1820
const workspaceProvider = new CoderWorkspacesProvider()
1921

2022
vscode.commands.registerCommand("coderWorkspaces.showWorkspaceLogs", handleShowLogsCommand)
2123
vscode.window.registerTreeDataProvider("coderWorkspaces", workspaceProvider)
2224
vscode.window.registerTreeDataProvider("coderHelpFeedback", new CoderHelpProvider())
23-
vscode.commands.registerCommand("coderWorkspaces.openWorkspace", (ws: CoderWorkspace) => {
24-
const { name } = ws.workspace
25+
vscode.commands.registerCommand("coderWorkspaces.openWorkspace", (item: CoderWorkspaceListItem) => {
26+
const { name } = item.workspace
2527
openWorkspace(name)
2628
})
27-
vscode.commands.registerCommand("coderWorkspaces.rebuildWorkspace", (ws: CoderWorkspace) => {
28-
const { name } = ws.workspace
29+
vscode.commands.registerCommand("coderWorkspaces.rebuildWorkspace", (item: CoderWorkspaceListItem) => {
30+
const { name } = item.workspace
2931
rebuildWorkspace(name).then(() => workspaceProvider.refresh())
3032
})
31-
vscode.commands.registerCommand("coderWorkspaces.shutdownWorkspace", (ws: CoderWorkspace) => {
32-
const { name } = ws.workspace
33+
vscode.commands.registerCommand("coderWorkspaces.shutdownWorkspace", (item: CoderWorkspaceListItem) => {
34+
const { name } = item.workspace
3335
shutdownWorkspace(name).then(() => workspaceProvider.refresh())
3436
})
3537

src/utils.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,24 @@
11
import * as path from "path"
2+
import * as cp from "child_process"
3+
import * as vscode from "vscode"
24

35
export const mediaDir = path.join(__filename, "..", "..", "media")
6+
7+
export const exec = async (command: string): Promise<string> => {
8+
return new Promise((res, rej) => {
9+
cp.exec(command, (err, stdout) => (err ? rej(err) : res(stdout)))
10+
})
11+
}
12+
13+
export const execJSON = async <T>(command: string): Promise<T> => {
14+
const output = await exec(command)
15+
return JSON.parse(output)
16+
}
17+
18+
export const bubbleError = (f: () => void) => {
19+
try {
20+
f()
21+
} catch (e) {
22+
vscode.window.showErrorMessage(JSON.stringify(e))
23+
}
24+
}

src/workspaces.ts

Lines changed: 38 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import * as vscode from "vscode"
22
import * as cp from "child_process"
33
import * 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

2930
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+
}
4137
}
4238

4339
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+
}
5546
}
5647

5748
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
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

10269
export 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

Comments
 (0)