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(selectedSDK.sdk.tagName))
110 await downloadAndInstallToolchain(
111 selectedToolchainVersion!.toolchain
118 await updateVSCodeStaticConfigs(
119 workspaceFolder.uri.fsPath,
120 selectedSDK.sdk.tagName,
121 selectedToolchainVersion!.toolchain.version
128 await cmakeUpdateSDK(
131 selectedSDK.sdk.tagName,
132 selectedToolchainVersion!.toolchain.version
136 // show sdk installed notification
137 message: `Successfully installed SDK ${selectedSDK.label}.`,
145 "Failed to install " +
146 `toolchain ${selectedToolchainVersion!.label}.`,
155 // show sdk install failed notification
157 `Failed to install SDK ${selectedSDK.label}.` +
158 "Make sure all requirements are met.",
167 this._ui.updateSDKVersion(selectedSDK.label);