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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy