1 import { Command } from "./command.mjs";
2 import { ProgressLocation, window, workspace } from "vscode";
3 import type UI from "../ui.mjs";
4 import { updateVSCodeStaticConfigs } from "../utils/vscodeConfigUtil.mjs";
5 import { SDK_REPOSITORY_URL, getSDKReleases } from "../utils/githubREST.mjs";
8 downloadAndInstallToolchain,
9 downloadAndInstallTools,
10 } from "../utils/download.mjs";
11 import { cmakeUpdateSDK } from "../utils/cmakeUtil.mjs";
13 type SupportedToolchainVersion,
14 getSupportedToolchains,
15 } from "../utils/toolchainUtil.mjs";
16 import type Settings from "../settings.mjs";
18 export default class SwitchSDKCommand extends Command {
20 private _settings: Settings;
22 constructor(ui: UI, settings: Settings) {
26 this._settings = settings;
29 async execute(): Promise<void> {
31 workspace.workspaceFolders === undefined ||
32 workspace.workspaceFolders.length === 0
34 void window.showErrorMessage("Please open a Pico project folder first.");
39 const workspaceFolder = workspace.workspaceFolders[0];
41 const sdks = await getSDKReleases();
44 const selectedSDK = await window.showQuickPick(
46 label: `v${sdk.tagName}`,
50 placeHolder: "Select SDK version",
54 if (selectedSDK === undefined) {
58 let selectedToolchainVersion:
59 | { label: string; toolchain: SupportedToolchainVersion }
63 const supportedToolchainVersions = await getSupportedToolchains();
64 // show quick pick for toolchain version
65 selectedToolchainVersion = await window.showQuickPick(
66 supportedToolchainVersions.map(toolchain => ({
67 label: toolchain.version.replaceAll("_", "."),
71 placeHolder: "Select ARM Embeded Toolchain version",
75 void window.showErrorMessage(
76 "Failed to get supported toolchain versions. " +
77 "Make sure you are connected to the internet."
83 if (selectedToolchainVersion === undefined) {
87 // show progress bar while installing
88 const result = await window.withProgress(
91 `Installing SDK ${selectedSDK.label} and ` +
92 `toolchain ${selectedToolchainVersion.label}...`,
93 location: ProgressLocation.Notification,
96 // download and install selected SDK
98 await downloadAndInstallSDK(
99 selectedSDK.sdk.tagName,
103 (await downloadAndInstallTools(
104 selectedSDK.sdk.tagName, process.platform === "win32")
112 await downloadAndInstallToolchain(
113 selectedToolchainVersion!.toolchain
120 await updateVSCodeStaticConfigs(
121 workspaceFolder.uri.fsPath,
122 selectedSDK.sdk.tagName,
123 selectedToolchainVersion!.toolchain.version
130 await cmakeUpdateSDK(
133 selectedSDK.sdk.tagName,
134 selectedToolchainVersion!.toolchain.version
138 // show sdk installed notification
139 message: `Successfully installed SDK ${selectedSDK.label}.`,
147 "Failed to install " +
148 `toolchain ${selectedToolchainVersion!.label}.`,
157 // show sdk install failed notification
159 `Failed to install SDK ${selectedSDK.label}.` +
160 "Make sure all requirements are met.",
169 this._ui.updateSDKVersion(selectedSDK.label);