Skip to content

Commit 52e3871

Browse files
committed
Allow workspace tasks to be executed through API
Fixes microsoft#104408
1 parent a1b6553 commit 52e3871

3 files changed

Lines changed: 32 additions & 12 deletions

File tree

src/vs/workbench/api/browser/mainThreadTask.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55

66
import * as nls from 'vs/nls';
77

8-
import { URI } from 'vs/base/common/uri';
8+
import { URI, UriComponents } from 'vs/base/common/uri';
99
import { generateUuid } from 'vs/base/common/uuid';
1010
import * as Types from 'vs/base/common/types';
1111
import * as Platform from 'vs/base/common/platform';
1212
import { IStringDictionary, forEach } from 'vs/base/common/collections';
1313
import { IDisposable } from 'vs/base/common/lifecycle';
1414

15-
import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
15+
import { IWorkspace, IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
1616

1717
import {
1818
ContributedTask, ConfiguringTask, KeyedTaskIdentifier, TaskExecution, Task, TaskEvent, TaskEventKind,
@@ -509,11 +509,27 @@ export class MainThreadTask implements MainThreadTaskShape {
509509
});
510510
}
511511

512+
private getWorkspace(value: UriComponents | string): string | IWorkspace | IWorkspaceFolder | null {
513+
let workspace;
514+
if (typeof value === 'string') {
515+
workspace = value;
516+
} else {
517+
const workspaceObject = this._workspaceContextServer.getWorkspace();
518+
const uri = URI.revive(value);
519+
if (workspaceObject.configuration?.toString() === uri.toString()) {
520+
workspace = workspaceObject;
521+
} else {
522+
workspace = this._workspaceContextServer.getWorkspaceFolder(uri);
523+
}
524+
}
525+
return workspace;
526+
}
527+
512528
public async $getTaskExecution(value: TaskHandleDTO | TaskDTO): Promise<TaskExecutionDTO> {
513529
if (TaskHandleDTO.is(value)) {
514-
const workspaceFolder = typeof value.workspaceFolder === 'string' ? value.workspaceFolder : this._workspaceContextServer.getWorkspaceFolder(URI.revive(value.workspaceFolder));
515-
if (workspaceFolder) {
516-
const task = await this._taskService.getTask(workspaceFolder, value.id, true);
530+
const workspace = this.getWorkspace(value.workspaceFolder);
531+
if (workspace) {
532+
const task = await this._taskService.getTask(workspace, value.id, true);
517533
if (task) {
518534
return {
519535
id: task._id,
@@ -538,9 +554,9 @@ export class MainThreadTask implements MainThreadTaskShape {
538554
public $executeTask(value: TaskHandleDTO | TaskDTO): Promise<TaskExecutionDTO> {
539555
return new Promise<TaskExecutionDTO>((resolve, reject) => {
540556
if (TaskHandleDTO.is(value)) {
541-
const workspaceFolder = typeof value.workspaceFolder === 'string' ? value.workspaceFolder : this._workspaceContextServer.getWorkspaceFolder(URI.revive(value.workspaceFolder));
542-
if (workspaceFolder) {
543-
this._taskService.getTask(workspaceFolder, value.id, true).then((task: Task | undefined) => {
557+
const workspace = this.getWorkspace(value.workspaceFolder);
558+
if (workspace) {
559+
this._taskService.getTask(workspace, value.id, true).then((task: Task | undefined) => {
544560
if (!task) {
545561
reject(new Error('Task not found'));
546562
} else {

src/vs/workbench/api/common/extHostTask.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,12 +192,16 @@ export namespace CustomExecutionDTO {
192192

193193

194194
export namespace TaskHandleDTO {
195-
export function from(value: types.Task): tasks.TaskHandleDTO {
195+
export function from(value: types.Task, workspaceService?: IExtHostWorkspace): tasks.TaskHandleDTO {
196196
let folder: UriComponents | string;
197197
if (value.scope !== undefined && typeof value.scope !== 'number') {
198198
folder = value.scope.uri;
199199
} else if (value.scope !== undefined && typeof value.scope === 'number') {
200-
folder = USER_TASKS_GROUP_KEY;
200+
if ((value.scope === types.TaskScope.Workspace) && workspaceService && workspaceService.workspaceFile) {
201+
folder = workspaceService.workspaceFile;
202+
} else {
203+
folder = USER_TASKS_GROUP_KEY;
204+
}
201205
}
202206
return {
203207
id: value._id!,

src/vs/workbench/api/node/extHostTask.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export class ExtHostTask extends ExtHostTaskBase {
3232
constructor(
3333
@IExtHostRpcService extHostRpc: IExtHostRpcService,
3434
@IExtHostInitDataService initData: IExtHostInitDataService,
35-
@IExtHostWorkspace workspaceService: IExtHostWorkspace,
35+
@IExtHostWorkspace private readonly workspaceService: IExtHostWorkspace,
3636
@IExtHostDocumentsAndEditors editorService: IExtHostDocumentsAndEditors,
3737
@IExtHostConfiguration configurationService: IExtHostConfiguration,
3838
@IExtHostTerminalService extHostTerminalService: IExtHostTerminalService,
@@ -55,7 +55,7 @@ export class ExtHostTask extends ExtHostTaskBase {
5555
// We have a preserved ID. So the task didn't change.
5656
if (tTask._id !== undefined) {
5757
// Always get the task execution first to prevent timing issues when retrieving it later
58-
const handleDto = TaskHandleDTO.from(tTask);
58+
const handleDto = TaskHandleDTO.from(tTask, this.workspaceService);
5959
const executionDTO = await this._proxy.$getTaskExecution(handleDto);
6060
if (executionDTO.task === undefined) {
6161
throw new Error('Task from execution DTO is undefined');

0 commit comments

Comments
 (0)