提交 4b2a13aa 编写于 作者: D Dirk Baeumer

Make the workspace build / test task win over contributed tasks

上级 4c71f96c
......@@ -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 };
......
......@@ -740,21 +740,21 @@ class TaskService extends EventEmitter implements ITaskService {
let uuidMap: IStringDictionary<Task> = Object.create(null);
let identifierMap: IStringDictionary<Task> = 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 };
......
......@@ -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) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册