Add check for version
Signed-off-by: Sanjula Ganepola <sanjulagane@gmail.com>
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user