Skip to content

Commit e0adfb8

Browse files
authored
fix: improve openDevContainer support with local workspace folder (#544)
1 parent 0c73c83 commit e0adfb8

File tree

3 files changed

+43
-9
lines changed

3 files changed

+43
-9
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Unreleased
44

5+
- Update `/openDevContainer` to support all dev container features when hostPath
6+
and configFile are provided.
7+
58
## [v1.9.2](https://github.com/coder/vscode-coder/releases/tag/v1.9.2) 2025-06-25
69

710
### Fixed

src/commands.ts

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -620,25 +620,29 @@ export class Commands {
620620
*
621621
* Throw if not logged into a deployment.
622622
*/
623-
public async openDevContainer(...args: string[]): Promise<void> {
623+
public async openDevContainer(
624+
workspaceOwner: string,
625+
workspaceName: string,
626+
workspaceAgent: string,
627+
devContainerName: string,
628+
devContainerFolder: string,
629+
localWorkspaceFolder: string = "",
630+
localConfigFile: string = "",
631+
): Promise<void> {
624632
const baseUrl = this.restClient.getAxiosInstance().defaults.baseURL;
625633
if (!baseUrl) {
626634
throw new Error("You are not logged in");
627635
}
628636

629-
const workspaceOwner = args[0] as string;
630-
const workspaceName = args[1] as string;
631-
const workspaceAgent = args[2] as string;
632-
const devContainerName = args[3] as string;
633-
const devContainerFolder = args[4] as string;
634-
635637
await openDevContainer(
636638
baseUrl,
637639
workspaceOwner,
638640
workspaceName,
639641
workspaceAgent,
640642
devContainerName,
641643
devContainerFolder,
644+
localWorkspaceFolder,
645+
localConfigFile,
642646
);
643647
}
644648

@@ -751,6 +755,8 @@ async function openDevContainer(
751755
workspaceAgent: string,
752756
devContainerName: string,
753757
devContainerFolder: string,
758+
localWorkspaceFolder: string = "",
759+
localConfigFile: string = "",
754760
) {
755761
const remoteAuthority = toRemoteAuthority(
756762
baseUrl,
@@ -759,11 +765,26 @@ async function openDevContainer(
759765
workspaceAgent,
760766
);
761767

768+
const hostPath = localWorkspaceFolder ? localWorkspaceFolder : undefined;
769+
const configFile =
770+
hostPath && localConfigFile
771+
? {
772+
path: localConfigFile,
773+
scheme: "vscode-fileHost",
774+
}
775+
: undefined;
762776
const devContainer = Buffer.from(
763-
JSON.stringify({ containerName: devContainerName }),
777+
JSON.stringify({
778+
containerName: devContainerName,
779+
hostPath,
780+
configFile,
781+
localDocker: false,
782+
}),
764783
"utf-8",
765784
).toString("hex");
766-
const devContainerAuthority = `attached-container+${devContainer}@${remoteAuthority}`;
785+
786+
const type = localWorkspaceFolder ? "dev-container" : "attached-container";
787+
const devContainerAuthority = `${type}+${devContainer}@${remoteAuthority}`;
767788

768789
let newWindow = true;
769790
if (!vscode.workspace.workspaceFolders?.length) {

src/extension.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ export async function activate(ctx: vscode.ExtensionContext): Promise<void> {
165165
const workspaceAgent = params.get("agent");
166166
const devContainerName = params.get("devContainerName");
167167
const devContainerFolder = params.get("devContainerFolder");
168+
const localWorkspaceFolder = params.get("localWorkspaceFolder");
169+
const localConfigFile = params.get("localConfigFile");
168170

169171
if (!workspaceOwner) {
170172
throw new Error(
@@ -190,6 +192,12 @@ export async function activate(ctx: vscode.ExtensionContext): Promise<void> {
190192
);
191193
}
192194

195+
if (localConfigFile && !localWorkspaceFolder) {
196+
throw new Error(
197+
"local workspace folder must be specified as a query parameter if local config file is provided",
198+
);
199+
}
200+
193201
// We are not guaranteed that the URL we currently have is for the URL
194202
// this workspace belongs to, or that we even have a URL at all (the
195203
// queries will default to localhost) so ask for it if missing.
@@ -228,6 +236,8 @@ export async function activate(ctx: vscode.ExtensionContext): Promise<void> {
228236
workspaceAgent,
229237
devContainerName,
230238
devContainerFolder,
239+
localWorkspaceFolder,
240+
localConfigFile,
231241
);
232242
} else {
233243
throw new Error(`Unknown path ${uri.path}`);

0 commit comments

Comments
 (0)