From e731071d31f9ccceba79526347673e4692c8f4b7 Mon Sep 17 00:00:00 2001 From: Sanjula Ganepola Date: Sat, 28 Sep 2024 19:36:09 -0400 Subject: [PATCH] Add check for version Signed-off-by: Sanjula Ganepola --- src/componentManager.ts | 46 ++++++++++++++++++++++--------- src/views/components/component.ts | 1 + src/views/decorationProvider.ts | 2 +- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/componentManager.ts b/src/componentManager.ts index fb5d795..17a34b0 100644 --- a/src/componentManager.ts +++ b/src/componentManager.ts @@ -4,6 +4,7 @@ import { extensions } from "vscode"; export interface Component { name: string, icon: string, + version?: string, status: T, required: boolean message?: string @@ -23,36 +24,42 @@ export class ComponentManager { static async getComponents(): Promise[]> { const components: Component[] = []; - const actCliStatus = await ComponentManager.getCliStatus('act'); + const actCliInfo = await ComponentManager.getCliInfo('act', /act version (.+)/); components.push({ name: 'nektos/act CLI', icon: 'terminal', - status: actCliStatus, + version: actCliInfo.version, + status: actCliInfo.status, required: true }); + // TODO: Fix docker status + const dockerEngineVersion = '2.0.0'; const dockerEngineStatus = CliStatus.Installed; components.push({ name: 'Docker Engine', icon: 'dashboard', + version: dockerEngineVersion, status: dockerEngineStatus, required: true }); - const githubActionsExtensionStatus = await ComponentManager.getExtensionStatus('github.vscode-github-actions'); + const githubActionsInfo = await ComponentManager.getExtensionInfo('github.vscode-github-actions'); components.push({ name: 'GitHub Actions Extension', icon: 'extensions', - status: githubActionsExtensionStatus, + version: githubActionsInfo.version, + status: githubActionsInfo.status, required: false, message: 'GitHub Actions extension is not required, but is recommended to take advantage of workflow editor features.' }); - const isGithubCliInstalled = await ComponentManager.getCliStatus('gh'); + const githubCliInfo = await ComponentManager.getCliInfo('gh', /gh version (.+)/); components.push({ name: 'GitHub CLI', icon: 'terminal', - status: isGithubCliInstalled, + version: githubCliInfo.version, + status: githubCliInfo.status, required: false, message: 'GitHub CLI is not required, but is recommended if you plan to use it to retrieve GitHub tokens.' }); @@ -65,29 +72,42 @@ export class ComponentManager { return components.filter(component => component.required && (component.status === CliStatus.NotInstalled || component.status === ExtensionStatus.NotActivated)); } - static async getCliStatus(component: string): Promise { - return new Promise((resolve, reject) => { + static async getCliInfo(component: string, versionRegex: RegExp): Promise<{ version?: string, status: CliStatus }> { + return new Promise<{ version?: string, status: CliStatus }>((resolve, reject) => { child_process.exec(`${component} --version`, (error, stdout, stderr) => { if (error) { - resolve(CliStatus.NotInstalled); + resolve({ + status: CliStatus.NotInstalled + }); } else { - resolve(CliStatus.Installed); + const version = stdout.match(versionRegex); + + resolve({ + version: version ? version[1] : undefined, + status: CliStatus.Installed + }); } }); }); } - static async getExtensionStatus(extensionId: string): Promise { + static async getExtensionInfo(extensionId: string): Promise<{ version?: string, status: ExtensionStatus }> { const allExtensions = extensions.all; const extension = allExtensions.find(extension => extension.id === extensionId); + if (extension) { if (!extension.isActive) { await extension.activate(); } - return ExtensionStatus.Activated; + return { + status: ExtensionStatus.Activated, + version: extension.packageJSON.version + } } else { - return ExtensionStatus.NotActivated; + return { + status: ExtensionStatus.NotActivated + } } } } \ No newline at end of file diff --git a/src/views/components/component.ts b/src/views/components/component.ts index 40cfd61..93dc199 100644 --- a/src/views/components/component.ts +++ b/src/views/components/component.ts @@ -9,6 +9,7 @@ export default class ComponentTreeItem extends TreeItem implements GithubLocalAc constructor(component: Component) { super(component.name, TreeItemCollapsibleState.None); this.component = component; + this.description = component.version; this.contextValue = ComponentTreeItem.contextValue; this.iconPath = new ThemeIcon(component.icon); this.resourceUri = Uri.parse(`${ComponentTreeItem.contextValue}:${component.name}?status=${component.status}&required=${component.required}`, true); diff --git a/src/views/decorationProvider.ts b/src/views/decorationProvider.ts index 7f7474e..b5900d7 100644 --- a/src/views/decorationProvider.ts +++ b/src/views/decorationProvider.ts @@ -10,7 +10,7 @@ export class DecorationProvider implements FileDecorationProvider { if (uri.scheme === ComponentTreeItem.contextValue) { const status = params.get('status'); - const required = params.get('required'); + const required = params.get('required') === 'true'; if (status === CliStatus.Installed || status === ExtensionStatus.Activated) { return {