From ed60ff43c607065b8da4aad4884bff1eae146490 Mon Sep 17 00:00:00 2001 From: Sanjula Ganepola <32170854+SanjulaGanepola@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:10:00 -0500 Subject: [PATCH] Add keybinding to run workflow in active editor (#141) Signed-off-by: Sanjula Ganepola --- package.json | 7 ++++ src/act.ts | 6 +-- src/extension.ts | 3 +- .../workflows/workflowsTreeDataProvider.ts | 39 ++++++++++++++++++- src/workflowsManager.ts | 6 ++- 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 6977faf..f84ebf0 100644 --- a/package.json +++ b/package.json @@ -131,6 +131,13 @@ "when": "githubLocalActions:noSettings && workspaceFolderCount > 0" } ], + "keybindings": [ + { + "command": "githubLocalActions.runWorkflow", + "key": "ctrl+g", + "mac": "cmd+g" + } + ], "commands": [ { "category": "GitHub Local Actions", diff --git a/src/act.ts b/src/act.ts index 2faa894..c56a273 100644 --- a/src/act.ts +++ b/src/act.ts @@ -267,7 +267,7 @@ export class Act { path: workspaceFolder.uri.fsPath, workflow: workflow, options: [ - `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}"` + `${Option.Workflows} "${WorkflowsManager.WORKFLOWS_DIRECTORY}/${path.parse(workflow.uri.fsPath).base}"` ], name: workflow.name, extraHeader: [ @@ -281,7 +281,7 @@ export class Act { path: workspaceFolder.uri.fsPath, workflow: workflow, options: [ - `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}"`, + `${Option.Workflows} "${WorkflowsManager.WORKFLOWS_DIRECTORY}/${path.parse(workflow.uri.fsPath).base}"`, `${Option.Job} "${job.id}"` ], name: `${workflow.name}/${job.name}`, @@ -304,7 +304,7 @@ export class Act { path: workspaceFolder.uri.fsPath, workflow: workflow, options: [ - `${event} ${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}"` + `${event} ${Option.Workflows} "${WorkflowsManager.WORKFLOWS_DIRECTORY}/${path.parse(workflow.uri.fsPath).base}"` ], name: `${workflow.name} (${event})`, extraHeader: [ diff --git a/src/extension.ts b/src/extension.ts index 7aa315c..b182798 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -9,6 +9,7 @@ import HistoryTreeDataProvider from './views/history/historyTreeDataProvider'; import SettingTreeItem from './views/settings/setting'; import SettingsTreeDataProvider from './views/settings/settingsTreeDataProvider'; import WorkflowsTreeDataProvider from './views/workflows/workflowsTreeDataProvider'; +import { WorkflowsManager } from './workflowsManager'; export let act: Act; export let componentsTreeDataProvider: ComponentsTreeDataProvider; @@ -36,7 +37,7 @@ export function activate(context: vscode.ExtensionContext) { }); // Create file watcher - const workflowsFileWatcher = workspace.createFileSystemWatcher('**/.github/workflows/*.{yml,yaml}'); + const workflowsFileWatcher = workspace.createFileSystemWatcher(`**/${WorkflowsManager.WORKFLOWS_DIRECTORY}/*.{${WorkflowsManager.YML_EXTENSION},${WorkflowsManager.YAML_EXTENSION}}`); workflowsFileWatcher.onDidCreate(() => { workflowsTreeDataProvider.refresh(); settingsTreeDataProvider.refresh(); diff --git a/src/views/workflows/workflowsTreeDataProvider.ts b/src/views/workflows/workflowsTreeDataProvider.ts index 48e6f00..05c0967 100644 --- a/src/views/workflows/workflowsTreeDataProvider.ts +++ b/src/views/workflows/workflowsTreeDataProvider.ts @@ -3,6 +3,7 @@ import { CancellationToken, commands, EventEmitter, ExtensionContext, TreeDataPr import { Event } from "../../act"; import { act } from "../../extension"; import { Utils } from "../../utils"; +import { WorkflowsManager } from "../../workflowsManager"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import JobTreeItem from "./job"; import WorkflowTreeItem from "./workflow"; @@ -51,7 +52,43 @@ export default class WorkflowsTreeDataProvider implements TreeDataProvider { - await act.runWorkflow(workflowTreeItem.workspaceFolder, workflowTreeItem.workflow); + if (workflowTreeItem) { + await act.runWorkflow(workflowTreeItem.workspaceFolder, workflowTreeItem.workflow); + } else { + let errorMessage: string | undefined; + + const activeTextEditor = window.activeTextEditor; + if (activeTextEditor) { + const uri = activeTextEditor.document.uri; + const fileName = path.parse(uri.fsPath).base; + if (uri.path.match(`.*/${WorkflowsManager.WORKFLOWS_DIRECTORY}/.*\\.(${WorkflowsManager.YAML_EXTENSION}|${WorkflowsManager.YML_EXTENSION})`)) { + const workspaceFolder = workspace.getWorkspaceFolder(uri); + if (workspaceFolder) { + const workflows = await act.workflowsManager.getWorkflows(workspaceFolder); + const workflow = workflows.find(workflow => workflow.uri.fsPath === uri.fsPath); + if (workflow) { + await act.runWorkflow(workspaceFolder, workflow); + } else { + errorMessage = `Workflow not found in workflow directory (${WorkflowsManager.WORKFLOWS_DIRECTORY}).`; + } + } else { + errorMessage = `${fileName} must be opened in a workspace folder to be executed locally.`; + } + } else { + errorMessage = `${fileName} is not a workflow that can be executed locally.`; + } + } else { + errorMessage = 'No workflow opened to execute locally.'; + } + + if (errorMessage) { + window.showErrorMessage(errorMessage, 'View Workflows').then(async value => { + if (value === 'View Workflows') { + await commands.executeCommand('workflows.focus'); + } + }); + } + } }), commands.registerCommand('githubLocalActions.runJob', async (jobTreeItem: JobTreeItem) => { await act.runJob(jobTreeItem.workspaceFolder, jobTreeItem.workflow, jobTreeItem.job); diff --git a/src/workflowsManager.ts b/src/workflowsManager.ts index c487d33..67a2b8c 100644 --- a/src/workflowsManager.ts +++ b/src/workflowsManager.ts @@ -17,10 +17,14 @@ export interface Job { } export class WorkflowsManager { + static WORKFLOWS_DIRECTORY: string = '.github/workflows'; + static YAML_EXTENSION: string = 'yaml'; + static YML_EXTENSION: string = 'yml'; + async getWorkflows(workspaceFolder: WorkspaceFolder): Promise { const workflows: Workflow[] = []; - const workflowFileUris = await workspace.findFiles(new RelativePattern(workspaceFolder, `.github/workflows/*.{yml,yaml}`)); + const workflowFileUris = await workspace.findFiles(new RelativePattern(workspaceFolder, `${WorkflowsManager.WORKFLOWS_DIRECTORY}/*.{${WorkflowsManager.YAML_EXTENSION},${WorkflowsManager.YML_EXTENSION}}`)); for await (const workflowFileUri of workflowFileUris) { let yamlContent: any | undefined;