Fix cli and extension status

Signed-off-by: Sanjula Ganepola <sanjulagane@gmail.com>
This commit is contained in:
Sanjula Ganepola
2024-09-28 19:15:53 -04:00
parent e5e1c06701
commit 440e729f29
4 changed files with 99 additions and 49 deletions

View File

@@ -1,51 +1,93 @@
export interface Component {
import * as child_process from "child_process";
import { extensions } from "vscode";
export interface Component<T extends CliStatus | ExtensionStatus> {
name: string,
icon: string,
status: ComponentStatus,
status: T,
required: boolean
message?: string
}
export enum ComponentStatus {
Enabled = 'Enabled',
Warning = 'Warning',
Disabled = 'Disabled'
export enum CliStatus {
Installed = 'Installed',
NotInstalled = 'Not Installed'
}
export enum ExtensionStatus {
Activated = 'Activated',
NotActivated = 'Not Activated'
}
export class ComponentManager {
static async getComponents(): Promise<Component[]> {
return [
{
name: 'nektos/act',
icon: 'package',
status: ComponentStatus.Enabled,
required: true
},
{
name: 'Docker Engine',
icon: 'dashboard',
status: ComponentStatus.Enabled,
required: true
},
{
name: 'GitHub Actions Extension',
icon: 'extensions',
status: ComponentStatus.Warning,
required: false,
message: 'GitHub Actions extension is not required, but is recommended to take advantage of workflow editor features.'
},
{
name: 'GitHub CLI',
icon: 'terminal',
status: ComponentStatus.Warning,
required: false,
message: 'GitHub CLI is not required, but is recommended if you plan to use it to retrieve GitHub tokens.'
}
];
static async getComponents(): Promise<Component<CliStatus | ExtensionStatus>[]> {
const components: Component<CliStatus | ExtensionStatus>[] = [];
const actCliStatus = await ComponentManager.getCliStatus('act');
components.push({
name: 'nektos/act CLI',
icon: 'terminal',
status: actCliStatus,
required: true
});
const dockerEngineStatus = CliStatus.Installed;
components.push({
name: 'Docker Engine',
icon: 'dashboard',
status: dockerEngineStatus,
required: true
});
const githubActionsExtensionStatus = await ComponentManager.getExtensionStatus('github.vscode-github-actions');
components.push({
name: 'GitHub Actions Extension',
icon: 'extensions',
status: githubActionsExtensionStatus,
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');
components.push({
name: 'GitHub CLI',
icon: 'terminal',
status: isGithubCliInstalled,
required: false,
message: 'GitHub CLI is not required, but is recommended if you plan to use it to retrieve GitHub tokens.'
});
return components;
}
static async getUnreadyComponents(): Promise<Component[]> {
static async getUnreadyComponents(): Promise<Component<CliStatus | ExtensionStatus>[]> {
const components = await ComponentManager.getComponents();
return components.filter(component => component.required && component.status !== ComponentStatus.Enabled);
return components.filter(component => component.required && (component.status === CliStatus.NotInstalled || component.status === ExtensionStatus.NotActivated));
}
static async getCliStatus(component: string): Promise<CliStatus> {
return new Promise<CliStatus>((resolve, reject) => {
child_process.exec(`${component} --version`, (error, stdout, stderr) => {
if (error) {
resolve(CliStatus.NotInstalled);
} else {
resolve(CliStatus.Installed);
}
});
});
}
static async getExtensionStatus(extensionId: string): Promise<ExtensionStatus> {
const allExtensions = extensions.all;
const extension = allExtensions.find(extension => extension.id === extensionId);
if (extension) {
if (!extension.isActive) {
await extension.activate();
}
return ExtensionStatus.Activated;
} else {
return ExtensionStatus.NotActivated;
}
}
}