From e332993cc99157e95b97cde84155f68f1ad3996c Mon Sep 17 00:00:00 2001 From: Sanjula Ganepola Date: Fri, 22 Nov 2024 21:51:05 -0500 Subject: [PATCH] Add payload support Signed-off-by: Sanjula Ganepola --- package.json | 50 +++++++++++++++---- src/act.ts | 10 ++-- src/settingsManager.ts | 6 ++- src/storageManager.ts | 1 + src/views/settings/payloads.ts | 33 ++++++++++++ src/views/settings/settingFile.ts | 12 +++++ .../settings/settingsTreeDataProvider.ts | 27 ++++++++++ src/views/settings/workspaceFolderSettings.ts | 4 +- 8 files changed, 127 insertions(+), 16 deletions(-) create mode 100644 src/views/settings/payloads.ts diff --git a/package.json b/package.json index 17944a4..3c863b5 100644 --- a/package.json +++ b/package.json @@ -276,6 +276,12 @@ "title": "Locate Variable Files", "icon": "$(search)" }, + { + "category": "GitHub Local Actions", + "command": "githubLocalActions.importFromGithub", + "title": "Import from GitHub", + "icon": "$(github)" + }, { "category": "GitHub Local Actions", "command": "githubLocalActions.createInputFile", @@ -290,9 +296,15 @@ }, { "category": "GitHub Local Actions", - "command": "githubLocalActions.importFromGithub", - "title": "Import from GitHub", - "icon": "$(github)" + "command": "githubLocalActions.createPayloadFile", + "title": "Create Payload File", + "icon": "$(add)" + }, + { + "category": "GitHub Local Actions", + "command": "githubLocalActions.locatePayloadFiles", + "title": "Locate Payload Files", + "icon": "$(search)" }, { "category": "GitHub Local Actions", @@ -430,6 +442,10 @@ "command": "githubLocalActions.locateVariableFiles", "when": "never" }, + { + "command": "githubLocalActions.importFromGithub", + "when": "never" + }, { "command": "githubLocalActions.createInputFile", "when": "never" @@ -439,7 +455,11 @@ "when": "never" }, { - "command": "githubLocalActions.importFromGithub", + "command": "githubLocalActions.createPayloadFile", + "when": "never" + }, + { + "command": "githubLocalActions.locatePayloadFiles", "when": "never" }, { @@ -615,6 +635,11 @@ "when": "view == settings && viewItem =~ /^githubLocalActions.variables.*/", "group": "inline@1" }, + { + "command": "githubLocalActions.importFromGithub", + "when": "view == settings && viewItem =~ /^githubLocalActions.variables.*/", + "group": "inline@2" + }, { "command": "githubLocalActions.createInputFile", "when": "view == settings && viewItem =~ /^githubLocalActions.inputs.*/", @@ -626,23 +651,28 @@ "group": "inline@1" }, { - "command": "githubLocalActions.importFromGithub", - "when": "view == settings && viewItem =~ /^githubLocalActions.variables.*/", - "group": "inline@2" + "command": "githubLocalActions.createPayloadFile", + "when": "view == settings && viewItem =~ /^githubLocalActions.payloads.*/", + "group": "inline@0" + }, + { + "command": "githubLocalActions.locatePayloadFiles", + "when": "view == settings && viewItem =~ /^githubLocalActions.payloads.*/", + "group": "inline@1" }, { "command": "githubLocalActions.openSettingFile", - "when": "view == settings && viewItem =~ /^githubLocalActions.(secret|variable|input)File.*/", + "when": "view == settings && viewItem =~ /^githubLocalActions.(secret|variable|input|payload)File.*/", "group": "inline@0" }, { "command": "githubLocalActions.removeSettingFile", - "when": "view == settings && viewItem =~ /^githubLocalActions.(secret|variable|input)File.*/", + "when": "view == settings && viewItem =~ /^githubLocalActions.(secret|variable|input|payload)File.*/", "group": "inline@1" }, { "command": "githubLocalActions.deleteSettingFile", - "when": "view == settings && viewItem =~ /^githubLocalActions.(secret|variable|input)File.*/", + "when": "view == settings && viewItem =~ /^githubLocalActions.(secret|variable|input|payload)File.*/", "group": "inline@2" }, { diff --git a/src/act.ts b/src/act.ts index 7aca230..dc84b68 100644 --- a/src/act.ts +++ b/src/act.ts @@ -46,15 +46,16 @@ export enum Event { } export enum Option { - Workflows = '-W', - Job = '-j', - Platform = '-P', + Workflows = '--workflows', + Job = '--job', + Platform = '--platform', Secret = '--secret', SecretFile = '--secret-file', Variable = '--var', VariableFile = '--var-file', Input = '--input', - InputFile = '--input-file' + InputFile = '--input-file', + PayloadFile = '--eventpath' } export interface CommandArgs { @@ -315,6 +316,7 @@ export class Act { (settings.inputs.length > 0 ? ` ${Option.Input} ${settings.inputs.map(input => `${input.key}=${input.value}`).join(` ${Option.Input} `)}` : ``) + (settings.inputFiles.length > 0 ? ` ${Option.InputFile} "${settings.inputFiles[0].path}"` : ` ${Option.InputFile} ""`) + (settings.runners.length > 0 ? ` ${Option.Platform} ${settings.runners.map(runner => `${runner.key}=${runner.value}`).join(` ${Option.Platform} `)}` : ``) + + (settings.payloadFiles.length > 0 ? ` ${Option.PayloadFile} "${settings.payloadFiles[0].path}"` : ` ${Option.PayloadFile} ""`) + ` 2>&1 | tee "${logPath}"`; // Execute task diff --git a/src/settingsManager.ts b/src/settingsManager.ts index 6f71337..a470936 100644 --- a/src/settingsManager.ts +++ b/src/settingsManager.ts @@ -13,6 +13,7 @@ export interface Settings { inputs: Setting[]; inputFiles: SettingFile[]; runners: Setting[]; + payloadFiles: SettingFile[]; environments: Setting[]; } @@ -38,7 +39,8 @@ export enum Visibility { export enum SettingFileName { secretFile = '.secrets', variableFile = '.env', - inputFile = '.input' + inputFile = '.input', + payloadFile = 'payload.json' } export class SettingsManager { @@ -64,6 +66,7 @@ export class SettingsManager { const inputs = (await this.getSetting(workspaceFolder, SettingsManager.inputsRegExp, StorageKey.Inputs, false, Visibility.show)).filter(input => !isUserSelected || (input.selected && input.value)); const inputFiles = (await this.getSettingFiles(workspaceFolder, StorageKey.InputFiles)).filter(inputFile => !isUserSelected || inputFile.selected); const runners = (await this.getSetting(workspaceFolder, SettingsManager.runnersRegExp, StorageKey.Runners, false, Visibility.show)).filter(runner => !isUserSelected || (runner.selected && runner.value)); + const payloadFiles = (await this.getSettingFiles(workspaceFolder, StorageKey.PayloadFiles)).filter(payloadFile => !isUserSelected || payloadFile.selected); const environments = await this.getEnvironments(workspaceFolder); return { @@ -74,6 +77,7 @@ export class SettingsManager { inputs: inputs, inputFiles: inputFiles, runners: runners, + payloadFiles: payloadFiles, environments: environments }; } diff --git a/src/storageManager.ts b/src/storageManager.ts index 739246c..be5c7f5 100644 --- a/src/storageManager.ts +++ b/src/storageManager.ts @@ -8,6 +8,7 @@ export enum StorageKey { VariableFiles = 'variableFiles', Inputs = 'inputs', InputFiles = 'inputFiles', + PayloadFiles = 'PayloadFiles', Runners = 'runners' } diff --git a/src/views/settings/payloads.ts b/src/views/settings/payloads.ts new file mode 100644 index 0000000..906e796 --- /dev/null +++ b/src/views/settings/payloads.ts @@ -0,0 +1,33 @@ +import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode"; +import { act } from "../../extension"; +import { SettingFile } from "../../settingsManager"; +import { StorageKey } from "../../storageManager"; +import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; +import SettingFileTreeItem from "./settingFile"; + +export default class PayloadsTreeItem extends TreeItem implements GithubLocalActionsTreeItem { + static contextValue = 'githubLocalActions.payloads'; + storageKey = StorageKey.PayloadFiles; + + constructor(public workspaceFolder: WorkspaceFolder, payloadFiles: SettingFile[]) { + super('Payloads', TreeItemCollapsibleState.Collapsed); + const selectedPayloadFiles = payloadFiles.filter(payloadFile => payloadFile.selected); + this.description = selectedPayloadFiles.length > 0 ? `${selectedPayloadFiles[0].name}` : ``; + this.contextValue = PayloadsTreeItem.contextValue; + this.iconPath = new ThemeIcon('json'); + } + + async getChildren(): Promise { + const items: GithubLocalActionsTreeItem[] = []; + + const settings = await act.settingsManager.getSettings(this.workspaceFolder, false); + + const payloadFileTreeItems: GithubLocalActionsTreeItem[] = []; + for (const payloadFile of settings.payloadFiles) { + payloadFileTreeItems.push(SettingFileTreeItem.getPayloadTreeItem(this.workspaceFolder, payloadFile)); + } + items.push(...payloadFileTreeItems.sort((a, b) => a.label!.toString().localeCompare(b.label!.toString()))); + + return items; + } +} \ No newline at end of file diff --git a/src/views/settings/settingFile.ts b/src/views/settings/settingFile.ts index 2caf6e9..847d1d7 100644 --- a/src/views/settings/settingFile.ts +++ b/src/views/settings/settingFile.ts @@ -55,6 +55,18 @@ export default class SettingFileTreeItem extends TreeItem implements GithubLocal ); } + static getPayloadTreeItem(workspaceFolder: WorkspaceFolder, payloadFile: SettingFile): SettingFileTreeItem { + return new SettingFileTreeItem( + workspaceFolder, + payloadFile, + StorageKey.PayloadFiles, + { + contextValue: 'githubLocalActions.payloadFile', + iconPath: new ThemeIcon('file') + } + ); + } + async getChildren(): Promise { return []; } diff --git a/src/views/settings/settingsTreeDataProvider.ts b/src/views/settings/settingsTreeDataProvider.ts index 1de0022..5eb1913 100644 --- a/src/views/settings/settingsTreeDataProvider.ts +++ b/src/views/settings/settingsTreeDataProvider.ts @@ -4,6 +4,7 @@ import { SettingFileName, Visibility } from "../../settingsManager"; import { StorageKey } from "../../storageManager"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import InputsTreeItem from "./inputs"; +import PayloadsTreeItem from "./payloads"; import SecretsTreeItem from "./secrets"; import SettingTreeItem from "./setting"; import SettingFileTreeItem from "./settingFile"; @@ -98,6 +99,32 @@ export default class SettingsTreeDataProvider implements TreeDataProvider { + const payloadFileName = await window.showInputBox({ + prompt: `Enter the name for the payload file`, + placeHolder: `Payload File Name`, + value: SettingFileName.payloadFile + }); + + if (payloadFileName) { + await act.settingsManager.createSettingFile(payloadsTreeItem.workspaceFolder, payloadsTreeItem.storageKey, payloadFileName); + this.refresh(); + } + }), + commands.registerCommand('githubLocalActions.locatePayloadFiles', async (payloadsTreeItem: PayloadsTreeItem) => { + const payloadFilesUris = await window.showOpenDialog({ + title: 'Locate Payload Files', + canSelectFiles: true, + canSelectFolders: false, + canSelectMany: true, + defaultUri: payloadsTreeItem.workspaceFolder.uri + }); + + if (payloadFilesUris) { + await act.settingsManager.locateSettingFile(payloadsTreeItem.workspaceFolder, payloadsTreeItem.storageKey, payloadFilesUris); + this.refresh(); + } + }), commands.registerCommand('githubLocalActions.openSettingFile', async (settingFileTreeItem: SettingFileTreeItem) => { const document = await workspace.openTextDocument(settingFileTreeItem.settingFile.path); await window.showTextDocument(document); diff --git a/src/views/settings/workspaceFolderSettings.ts b/src/views/settings/workspaceFolderSettings.ts index 02379ba..c017589 100644 --- a/src/views/settings/workspaceFolderSettings.ts +++ b/src/views/settings/workspaceFolderSettings.ts @@ -2,6 +2,7 @@ import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from " import { act } from "../../extension"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import InputsTreeItem from "./inputs"; +import PayloadsTreeItem from "./payloads"; import RunnersTreeItem from "./runners"; import SecretsTreeItem from "./secrets"; import VariablesTreeItem from "./variables"; @@ -23,7 +24,8 @@ export default class WorkspaceFolderSettingsTreeItem extends TreeItem implements new SecretsTreeItem(this.workspaceFolder, settings.secrets, settings.secretFiles), new VariablesTreeItem(this.workspaceFolder, settings.variables, settings.variableFiles), new InputsTreeItem(this.workspaceFolder, settings.inputs, settings.inputFiles), - new RunnersTreeItem(this.workspaceFolder, settings.runners) + new RunnersTreeItem(this.workspaceFolder, settings.runners), + new PayloadsTreeItem(this.workspaceFolder, settings.payloadFiles) ]); return items;