diff --git a/vscode/src/common.ts b/vscode/src/common.ts index 68233b670..227995ce4 100644 --- a/vscode/src/common.ts +++ b/vscode/src/common.ts @@ -19,6 +19,7 @@ export enum Command { DebugTest = "rubyLsp.debugTest", ShowSyntaxTree = "rubyLsp.showSyntaxTree", DisplayAddons = "rubyLsp.displayAddons", + RunTask = "rubyLsp.runTask", } export interface RubyInterface { diff --git a/vscode/src/rubyLsp.ts b/vscode/src/rubyLsp.ts index c31c0fac5..168748d99 100644 --- a/vscode/src/rubyLsp.ts +++ b/vscode/src/rubyLsp.ts @@ -370,6 +370,30 @@ export class RubyLsp { Command.DebugTest, this.testController.debugTest.bind(this.testController), ), + vscode.commands.registerCommand( + Command.RunTask, + async (command: string) => { + let workspace = this.currentActiveWorkspace(); + + if (!workspace) { + workspace = await this.showWorkspacePick(); + } + + if (!workspace) { + return; + } + + workspace.outputChannel.show(); + workspace.outputChannel.info(`Running task: ${command}`); + const { stdout, stderr } = await workspace.execute(command); + + if (stderr.length > 0) { + workspace.outputChannel.error(stderr); + } else { + workspace.outputChannel.info(stdout); + } + }, + ), ); } diff --git a/vscode/src/workspace.ts b/vscode/src/workspace.ts index 54d003346..355bf7fc8 100644 --- a/vscode/src/workspace.ts +++ b/vscode/src/workspace.ts @@ -18,9 +18,9 @@ export class Workspace implements WorkspaceInterface { public readonly ruby: Ruby; public readonly createTestItems: (response: CodeLens[]) => void; public readonly workspaceFolder: vscode.WorkspaceFolder; + public readonly outputChannel: WorkspaceChannel; private readonly context: vscode.ExtensionContext; private readonly telemetry: Telemetry; - private readonly outputChannel: WorkspaceChannel; private readonly isMainWorkspace: boolean; private needsRestart = false; #rebaseInProgress = false; @@ -263,6 +263,13 @@ export class Workspace implements WorkspaceInterface { return this.#rebaseInProgress; } + async execute(command: string) { + return asyncExec(command, { + env: this.ruby.env, + cwd: this.workspaceFolder.uri.fsPath, + }); + } + private registerRestarts(context: vscode.ExtensionContext) { this.createRestartWatcher(context, "Gemfile.lock"); this.createRestartWatcher(context, "gems.locked");