Skip to content

Commit f983193

Browse files
committed
Pass arguments to disable sandboxing when enabled
New disableSandbox setting (only intended for testing right now) These particular commands (or subcommands) use sandboxing. To get our tests to run in a sandbox, we need to disable sandboxing because you cannot create a new sandbox when you're already running under a sandbox
1 parent 66c715b commit f983193

File tree

6 files changed

+55
-3
lines changed

6 files changed

+55
-3
lines changed

package.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,11 @@
281281
},
282282
"markdownDescription": "Additional arguments to pass to swift commands that do package resolution, such as `swift package resolve`, `swift package update`, `swift build` and `swift test`. Keys and values should be provided as individual entries in the list."
283283
},
284+
"swift.disableSandbox": {
285+
"type": "boolean",
286+
"default": false,
287+
"markdownDescription": "Disable sandboxing when running SwiftPM commands."
288+
},
284289
"swift.additionalTestArguments": {
285290
"type": "array",
286291
"default": [],
@@ -689,7 +694,12 @@
689694
"swift.swiftSDK": {
690695
"type": "string",
691696
"default": "",
692-
"markdownDescription": "The [Swift SDK](https://github.com/swiftlang/swift-evolution/blob/main/proposals/0387-cross-compilation-destinations.md) to compile against (`--swift-sdk` parameter).",
697+
"markdownDescription": "The [Swift SDK](https://github.com/swiftlang/swift-evolution/blob/main/proposals/0387-cross-compilation-destinations.md) to compile against (`--swift-sdk` parameter)."
698+
},
699+
"swift.disableSandox": {
700+
"type": "boolean",
701+
"default": false,
702+
"markdownDescription": "Disable sandboxing when running SwiftPM commands. You will almost always want this setting disabled.",
693703
"order": 4
694704
},
695705
"swift.diagnostics": {

src/configuration.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,10 @@ const configuration = {
362362
.getConfiguration("swift")
363363
.get<boolean>("enableTerminalEnvironment", true);
364364
},
365+
/** Whether or not to disable SwiftPM sandboxing */
366+
get disableSandbox(): boolean {
367+
return vscode.workspace.getConfiguration("swift").get<boolean>("disableSandbox", false);
368+
},
365369
};
366370

367371
export default configuration;

src/tasks/SwiftTaskProvider.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,9 @@ export function createSwiftTask(
271271
cmdEnv: { [key: string]: string } = {}
272272
): SwiftTask {
273273
const swift = toolchain.getToolchainExecutable("swift");
274-
args = toolchain.buildFlags.withSwiftPackageFlags(toolchain.buildFlags.withSwiftSDKFlags(args));
274+
args = toolchain.buildFlags.withSwiftSDKFlags(args);
275+
args = toolchain.buildFlags.withSwiftPackageFlags(args);
276+
args = toolchain.buildFlags.withDisableSandboxFlags(args);
275277

276278
// Add relative path current working directory
277279
const cwd = config.cwd.fsPath;

src/toolchain/BuildFlags.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,38 @@ export class BuildFlags {
192192
return indirect ? args.flatMap(arg => ["-Xswiftc", arg]) : args;
193193
}
194194

195+
/**
196+
* Get modified swift arguments with new arguments for disabling
197+
* sandboxing if the `swift.disableSandbox` setting is enabled.
198+
*
199+
* @param args original commandline arguments
200+
*/
201+
withDisableSandboxFlags(args: string[]): string[] {
202+
if (!configuration.disableSandbox) {
203+
return args;
204+
}
205+
switch (args[0]) {
206+
case "package": {
207+
return [args[0], ...BuildFlags.disableSandboxFlags(), ...args.slice(1)];
208+
}
209+
case "build":
210+
case "run":
211+
case "test": {
212+
return [...args, ...BuildFlags.disableSandboxFlags()];
213+
}
214+
default:
215+
// Do nothing for other commands
216+
return args;
217+
}
218+
}
219+
220+
/**
221+
* Get flags for disabling sandboxing when running SwiftPM
222+
*/
223+
static disableSandboxFlags(): string[] {
224+
return ["--disable-sandbox", "-Xswiftc", "-disable-sandbox"];
225+
}
226+
195227
/**
196228
* Filter argument list
197229
* @param args argument list

src/toolchain/toolchain.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,10 @@ export class SwiftToolchain {
813813
private static async getSwiftTargetInfo(): Promise<SwiftTargetInfo> {
814814
try {
815815
try {
816-
const { stdout } = await execSwift(["-print-target-info"], "default");
816+
const { stdout } = await execSwift(
817+
["-print-target-info", ...BuildFlags.disableSandboxFlags()],
818+
"default"
819+
);
817820
const targetInfo = JSON.parse(stdout.trimEnd()) as SwiftTargetInfo;
818821
if (targetInfo.compilerVersion) {
819822
return targetInfo;

src/utilities/utilities.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ export async function execSwift(
188188
}
189189
if (toolchain !== "default") {
190190
args = toolchain.buildFlags.withSwiftSDKFlags(args);
191+
args = toolchain.buildFlags.withDisableSandboxFlags(args);
191192
}
192193
if (Object.keys(configuration.swiftEnvironmentVariables).length > 0) {
193194
// when adding environment vars we either combine with vars passed

0 commit comments

Comments
 (0)