Feature: Tasks (core) (#12184)

* initial

* string sanitize

* hygiene

* build task

* added build task

* hygiene

* initial tasks view

* finished tasks

* add sql carbon tags and undo changes

* remove task message

* fix tasks tests

* removed extension stuff

* add problem matcher

* remove extra space

* undo extension changes

* add problem matcher to mssql
This commit is contained in:
Aditya Bist
2020-11-04 13:07:20 -08:00
committed by GitHub
parent 4af67c9734
commit 6b2c409cff
11 changed files with 90 additions and 36 deletions

View File

@@ -82,6 +82,12 @@ import { isWorkspaceFolder, TaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, TaskQui
import { ILogService } from 'vs/platform/log/common/log';
import { once } from 'vs/base/common/functional';
// {{ SQL CARBON EDIT }}
// integration with tasks view panel
import { ITaskService as ISqlTaskService, TaskStatusChangeArgs } from 'sql/workbench/services/tasks/common/tasksService';
import { TaskStatus } from 'sql/workbench/api/common/extHostBackgroundTaskManagement';
import { TaskInfo } from 'azdata';
const QUICKOPEN_HISTORY_LIMIT_CONFIG = 'task.quickOpen.history';
const PROBLEM_MATCHER_NEVER_CONFIG = 'task.problemMatchers.neverPrompt';
const USE_SLOW_PICKER = 'task.quickOpen.showAll';
@@ -227,6 +233,9 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
private _waitForSupportedExecutions: Promise<void>;
private _onDidRegisterSupportedExecutions: Emitter<void> = new Emitter();
// {{SQL CARBON EDIT}}
private lastRunTasksViewTask: TaskInfo;
constructor(
@IConfigurationService private readonly configurationService: IConfigurationService,
@IMarkerService protected readonly markerService: IMarkerService,
@@ -258,7 +267,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
@ITextModelService private readonly textModelResolverService: ITextModelService,
@IPreferencesService private readonly preferencesService: IPreferencesService,
@IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService,
@ILogService private readonly logService: ILogService
@ILogService private readonly logService: ILogService,
@ISqlTaskService private readonly sqlTaskService: ISqlTaskService
) {
super();
@@ -882,7 +892,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (!task) {
throw new TaskError(Severity.Info, nls.localize('TaskServer.noTask', 'Task to execute is undefined'), TaskErrors.TaskNotFound);
}
return new Promise<ITaskSummary | undefined>(async (resolve) => {
let resolver = this.createResolver();
if (options && options.attachProblemMatcher && this.shouldAttachProblemMatcher(task) && !InMemoryTask.is(task)) {
@@ -1473,8 +1482,25 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
const execTask = async (task: Task, resolver: ITaskResolver): Promise<ITaskSummary> => {
return ProblemMatcherRegistry.onReady().then(() => {
// {{ SQL CARBON EDIT }}
const taskNodeId = UUID.generateUuid();
let taskInfo: TaskInfo = {
databaseName: undefined,
serverName: undefined,
description: undefined,
isCancelable: false,
name: task._label,
providerName: undefined,
taskExecutionMode: 0,
taskId: taskNodeId,
status: TaskStatus.NotStarted
};
this.sqlTaskService.createNewTask(taskInfo);
this.lastRunTasksViewTask = taskInfo;
let executeResult = this.getTaskSystem().run(task, resolver);
return this.handleExecuteResult(executeResult, runSource);
// {{ SQL CARBON EDIT }}
return this.handleExecuteResult(executeResult, runSource, taskNodeId);
});
};
@@ -1511,7 +1537,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
}
private async handleExecuteResult(executeResult: ITaskExecuteResult, runSource?: TaskRunSource): Promise<ITaskSummary> {
// {{SQL CARBON EDIT}}
private async handleExecuteResult(executeResult: ITaskExecuteResult, runSource?: TaskRunSource, taskNodeId?: string): Promise<ITaskSummary> {
if (executeResult.task.taskLoadMessages && executeResult.task.taskLoadMessages.length > 0) {
executeResult.task.taskLoadMessages.forEach(loadMessage => {
this._outputChannel.append(loadMessage + '\n');
@@ -1546,6 +1573,19 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
throw new TaskError(Severity.Warning, nls.localize('TaskSystem.active', 'There is already a task running. Terminate it first before executing another task.'), TaskErrors.RunningTask);
}
}
// {{ SQL CARBON EDIT }}
executeResult.promise.then((summary: ITaskSummary) => {
let args: TaskStatusChangeArgs = {
taskId: taskNodeId ? taskNodeId : executeResult.task._id,
status: undefined
};
if (summary.exitCode === 0) {
args.status = TaskStatus.Succeeded;
} else if (summary.exitCode === 1) {
args.status = TaskStatus.Failed;
}
this.sqlTaskService.handleTaskComplete(args);
});
return executeResult.promise;
}
@@ -2555,9 +2595,16 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
ProblemMatcherRegistry.onReady().then(() => {
return this.editorService.saveAll({ reason: SaveReason.AUTO }).then(() => { // make sure all dirty editors are saved
// {{SQL CARBON EDIT}}
let lastRunTasksViewTask = this.lastRunTasksViewTask;
lastRunTasksViewTask.taskId = UUID.generateUuid();
this.sqlTaskService.createNewTask(lastRunTasksViewTask);
this.lastRunTasksViewTask = lastRunTasksViewTask;
let executeResult = this.getTaskSystem().rerun();
if (executeResult) {
return this.handleExecuteResult(executeResult);
// {{SQL CARBON EDIT}}
return this.handleExecuteResult(executeResult, undefined, lastRunTasksViewTask.taskId);
} else {
this.doRunTaskCommand();
return Promise.resolve(undefined);