From 4b2a13aae48e8cdc1485c31d1ac4ecfa37094b69 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 09:06:04 +0200 Subject: [PATCH] Make the workspace build / test task win over contributed tasks --- .../parts/tasks/common/taskConfiguration.ts | 39 +++++++++++++------ .../electron-browser/task.contribution.ts | 30 +++++++++----- .../tasks/test/node/configuration.test.ts | 25 +++++++++++- 3 files changed, 71 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts index 9af9833e240..09fa78dfd77 100644 --- a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts @@ -137,11 +137,18 @@ export interface TaskDescription extends PlatformTaskDescription { promptOnClose?: boolean; /** + * Defines the group the task belongs too. + */ + group?: string; + + /** + * @deprecated Use `group` instead. * Whether this task maps to the default build command. */ isBuildCommand?: boolean; /** + * @deprecated Use `group` instead. * Whether this task maps to the default test command. */ isTestCommand?: boolean; @@ -766,8 +773,8 @@ namespace TaskDescription { } let parsedTasks: Tasks.Task[] = []; let annotatingTasks: Tasks.Task[] = []; - let defaultBuildTask: { task: Tasks.Task; rank: number; } = { task: null, rank: -1 }; - let defaultTestTask: { task: Tasks.Task; rank: number; } = { task: null, rank: -1 }; + let defaultBuildTask: { task: Tasks.Task; rank: number; } = { task: undefined, rank: -1 }; + let defaultTestTask: { task: Tasks.Task; rank: number; } = { task: undefined, rank: -1 }; tasks.forEach((externalTask) => { let taskName = externalTask.taskName; if (!taskName) { @@ -800,6 +807,16 @@ namespace TaskDescription { if (externalTask.promptOnClose !== void 0) { task.promptOnClose = !!externalTask.promptOnClose; } + if (Tasks.TaskGroup.is(externalTask.group)) { + task.group = externalTask.group; + } + if (task.group === void 0) { + if (Types.isBoolean(externalTask.isBuildCommand) && externalTask.isBuildCommand) { + task.group = Tasks.TaskGroup.Build; + } else if (Types.isBoolean(externalTask.isTestCommand && externalTask.isTestCommand)) { + task.group = Tasks.TaskGroup.Test; + } + } if (externalTask.command !== void 0) { // if the task has its own command then we suppress the // task name by default. @@ -848,26 +865,24 @@ namespace TaskDescription { } if (addTask) { parsedTasks.push(task); - if (!Types.isUndefined(externalTask.isBuildCommand) && externalTask.isBuildCommand && defaultBuildTask.rank < 2) { + if (task.group === Tasks.TaskGroup.Build && defaultBuildTask.rank < 2) { defaultBuildTask.task = task; defaultBuildTask.rank = 2; - } else if (taskName === 'build' && defaultBuildTask.rank < 2) { - defaultBuildTask.task = task; - defaultBuildTask.rank = 1; - } - if (!Types.isUndefined(externalTask.isTestCommand) && externalTask.isTestCommand && defaultTestTask.rank < 2) { + } else if (task.group === Tasks.TaskGroup.Test && defaultTestTask.rank < 2) { defaultTestTask.task = task; defaultTestTask.rank = 2; - } else if (taskName === 'test' && defaultTestTask.rank < 2) { + } else if (task.name === 'build' && defaultBuildTask.rank < 1) { + defaultBuildTask.task = task; + defaultBuildTask.rank = 1; + } else if (task.name === 'test' && defaultTestTask.rank < 1) { defaultTestTask.task = task; defaultTestTask.rank = 1; } } }); - if (defaultBuildTask.task) { + if (defaultBuildTask.rank > -1 && defaultBuildTask.rank < 2) { defaultBuildTask.task.group = Tasks.TaskGroup.Build; - } - if (defaultTestTask.task) { + } else if (defaultTestTask.rank > -1 && defaultTestTask.rank < 2) { defaultTestTask.task.group = Tasks.TaskGroup.Test; } return parsedTasks.length === 0 && annotatingTasks.length === 0 ? undefined : { tasks: parsedTasks, annotatingTasks: annotatingTasks }; diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 49c14ca2110..68b32dfc244 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -740,21 +740,21 @@ class TaskService extends EventEmitter implements ITaskService { let uuidMap: IStringDictionary = Object.create(null); let identifierMap: IStringDictionary = Object.create(null); - let primaryTasks: Task[] = []; + let workspaceTasks: Task[] = []; + let extensionTasks: Task[] = []; sets.forEach((set) => { set.tasks.forEach((task) => { uuidMap[task._id] = task; identifierMap[task.identifier] = task; if (group && task.group === group) { - primaryTasks.push(task); + if (task._source.kind === TaskSourceKind.Workspace) { + workspaceTasks.push(task); + } else { + extensionTasks.push(task); + } } }); }); - if (primaryTasks.length === 0) { - return undefined; - } - // check for a WORKSPACE build task and use that onemptied.apply - let resolver: ITaskResolver = { resolve: (id: string) => { let result = uuidMap[id]; @@ -764,8 +764,18 @@ class TaskService extends EventEmitter implements ITaskService { return identifierMap[id]; } }; - if (primaryTasks.length === 1) { - return { task: primaryTasks[0], resolver }; + if (workspaceTasks.length > 0) { + if (workspaceTasks.length > 1) { + this._outputChannel.append(nls.localize('moreThanOneBuildTask', 'There are many build tasks defined in the tasks.json. Executing the first one.\n')); + } + return { task: workspaceTasks[0], resolver }; + } + if (extensionTasks.length === 0) { + return undefined; + } + + if (extensionTasks.length === 1) { + return { task: extensionTasks[0], resolver }; } else { let id: string = UUID.generateUuid(); let task: Task = { @@ -773,7 +783,7 @@ class TaskService extends EventEmitter implements ITaskService { _source: { kind: TaskSourceKind.Generic }, name: id, identifier: id, - dependsOn: primaryTasks.map(task => task._id), + dependsOn: extensionTasks.map(task => task._id), command: undefined, }; return { task, resolver }; diff --git a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts index 03610ad7ecc..cbccf978e9d 100644 --- a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts +++ b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts @@ -512,7 +512,7 @@ function assertProblemPattern(actual: ProblemPattern, expected: ProblemPattern) assert.strictEqual(actual.loop, expected.loop); } -suite('Tasks Configuration parsing tests', () => { +suite('Tasks version 0.1.0', () => { test('tasks: all default', () => { let builder = new ConfiguationBuilder(); builder.task('tsc', 'tsc'). @@ -1360,6 +1360,29 @@ suite('Tasks Configuration parsing tests', () => { }); }); +suite('Tasks version 2.0.0', () => { + test('Build workspace task', () => { + let external: ExternalTaskRunnerConfiguration = { + version: '2.0.0', + tasks: [ + { + taskName: 'dir', + command: 'dir', + type: 'shell', + group: 'build' + } + ] + }; + let builder = new ConfiguationBuilder(); + builder.task('dir', 'dir'). + suppressTaskName(true). + group(Tasks.TaskGroup.Build). + command().type(Tasks.CommandType.Shell); + testConfiguration(external, builder); + }); + +}); + suite('Bugs / regression tests', () => { test('Bug 19548', () => { if (Platform.isLinux) { -- GitLab