Add check for version

Signed-off-by: Sanjula Ganepola <sanjulagane@gmail.com>
This commit is contained in:
Sanjula Ganepola
2024-09-28 19:36:09 -04:00
parent 440e729f29
commit e731071d31
3 changed files with 35 additions and 14 deletions

View File

@@ -4,6 +4,7 @@ import { extensions } from "vscode";
export interface Component<T extends CliStatus | ExtensionStatus> { export interface Component<T extends CliStatus | ExtensionStatus> {
name: string, name: string,
icon: string, icon: string,
version?: string,
status: T, status: T,
required: boolean required: boolean
message?: string message?: string
@@ -23,36 +24,42 @@ export class ComponentManager {
static async getComponents(): Promise<Component<CliStatus | ExtensionStatus>[]> { static async getComponents(): Promise<Component<CliStatus | ExtensionStatus>[]> {
const components: Component<CliStatus | ExtensionStatus>[] = []; const components: Component<CliStatus | ExtensionStatus>[] = [];
const actCliStatus = await ComponentManager.getCliStatus('act'); const actCliInfo = await ComponentManager.getCliInfo('act', /act version (.+)/);
components.push({ components.push({
name: 'nektos/act CLI', name: 'nektos/act CLI',
icon: 'terminal', icon: 'terminal',
status: actCliStatus, version: actCliInfo.version,
status: actCliInfo.status,
required: true required: true
}); });
// TODO: Fix docker status
const dockerEngineVersion = '2.0.0';
const dockerEngineStatus = CliStatus.Installed; const dockerEngineStatus = CliStatus.Installed;
components.push({ components.push({
name: 'Docker Engine', name: 'Docker Engine',
icon: 'dashboard', icon: 'dashboard',
version: dockerEngineVersion,
status: dockerEngineStatus, status: dockerEngineStatus,
required: true required: true
}); });
const githubActionsExtensionStatus = await ComponentManager.getExtensionStatus('github.vscode-github-actions'); const githubActionsInfo = await ComponentManager.getExtensionInfo('github.vscode-github-actions');
components.push({ components.push({
name: 'GitHub Actions Extension', name: 'GitHub Actions Extension',
icon: 'extensions', icon: 'extensions',
status: githubActionsExtensionStatus, version: githubActionsInfo.version,
status: githubActionsInfo.status,
required: false, required: false,
message: 'GitHub Actions extension is not required, but is recommended to take advantage of workflow editor features.' 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({ components.push({
name: 'GitHub CLI', name: 'GitHub CLI',
icon: 'terminal', icon: 'terminal',
status: isGithubCliInstalled, version: githubCliInfo.version,
status: githubCliInfo.status,
required: false, required: false,
message: 'GitHub CLI is not required, but is recommended if you plan to use it to retrieve GitHub tokens.' 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)); return components.filter(component => component.required && (component.status === CliStatus.NotInstalled || component.status === ExtensionStatus.NotActivated));
} }
static async getCliStatus(component: string): Promise<CliStatus> { static async getCliInfo(component: string, versionRegex: RegExp): Promise<{ version?: string, status: CliStatus }> {
return new Promise<CliStatus>((resolve, reject) => { return new Promise<{ version?: string, status: CliStatus }>((resolve, reject) => {
child_process.exec(`${component} --version`, (error, stdout, stderr) => { child_process.exec(`${component} --version`, (error, stdout, stderr) => {
if (error) { if (error) {
resolve(CliStatus.NotInstalled); resolve({
status: CliStatus.NotInstalled
});
} else { } else {
resolve(CliStatus.Installed); const version = stdout.match(versionRegex);
resolve({
version: version ? version[1] : undefined,
status: CliStatus.Installed
});
} }
}); });
}); });
} }
static async getExtensionStatus(extensionId: string): Promise<ExtensionStatus> { static async getExtensionInfo(extensionId: string): Promise<{ version?: string, status: ExtensionStatus }> {
const allExtensions = extensions.all; const allExtensions = extensions.all;
const extension = allExtensions.find(extension => extension.id === extensionId); const extension = allExtensions.find(extension => extension.id === extensionId);
if (extension) { if (extension) {
if (!extension.isActive) { if (!extension.isActive) {
await extension.activate(); await extension.activate();
} }
return ExtensionStatus.Activated; return {
status: ExtensionStatus.Activated,
version: extension.packageJSON.version
}
} else { } else {
return ExtensionStatus.NotActivated; return {
status: ExtensionStatus.NotActivated
}
} }
} }
} }

View File

@@ -9,6 +9,7 @@ export default class ComponentTreeItem extends TreeItem implements GithubLocalAc
constructor(component: Component<CliStatus | ExtensionStatus>) { constructor(component: Component<CliStatus | ExtensionStatus>) {
super(component.name, TreeItemCollapsibleState.None); super(component.name, TreeItemCollapsibleState.None);
this.component = component; this.component = component;
this.description = component.version;
this.contextValue = ComponentTreeItem.contextValue; this.contextValue = ComponentTreeItem.contextValue;
this.iconPath = new ThemeIcon(component.icon); this.iconPath = new ThemeIcon(component.icon);
this.resourceUri = Uri.parse(`${ComponentTreeItem.contextValue}:${component.name}?status=${component.status}&required=${component.required}`, true); this.resourceUri = Uri.parse(`${ComponentTreeItem.contextValue}:${component.name}?status=${component.status}&required=${component.required}`, true);

View File

@@ -10,7 +10,7 @@ export class DecorationProvider implements FileDecorationProvider {
if (uri.scheme === ComponentTreeItem.contextValue) { if (uri.scheme === ComponentTreeItem.contextValue) {
const status = params.get('status'); const status = params.get('status');
const required = params.get('required'); const required = params.get('required') === 'true';
if (status === CliStatus.Installed || status === ExtensionStatus.Activated) { if (status === CliStatus.Installed || status === ExtensionStatus.Activated) {
return { return {