From 90da6715e1bdc04750b1f6d8eb5da4d772a2c45b Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Thu, 18 Feb 2016 10:32:57 +0100 Subject: [PATCH] Fixes #3110: Expose ConfigureTaskSystem action --- .../parts/tasks/common/taskService.ts | 2 ++ .../parts/tasks/common/taskSystem.ts | 19 +++++++++++---- .../electron-browser/task.contribution.ts | 24 ++++++++++++------- .../parts/tasks/node/processRunnerSystem.ts | 14 +++++------ 4 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/parts/tasks/common/taskService.ts b/src/vs/workbench/parts/tasks/common/taskService.ts index 73e6428218e..eb77a0482cd 100644 --- a/src/vs/workbench/parts/tasks/common/taskService.ts +++ b/src/vs/workbench/parts/tasks/common/taskService.ts @@ -5,6 +5,7 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; +import { Action } from 'vs/base/common/actions'; import { IEventEmitter } from 'vs/base/common/eventEmitter'; import { TerminateResponse } from 'vs/base/common/processes'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; @@ -23,6 +24,7 @@ export namespace TaskServiceEvents { export interface ITaskService extends IEventEmitter { serviceId: ServiceIdentifier; + configureAction(): Action; build(): TPromise; rebuild(): TPromise; clean(): TPromise; diff --git a/src/vs/workbench/parts/tasks/common/taskSystem.ts b/src/vs/workbench/parts/tasks/common/taskSystem.ts index 07e38db1a1b..2a944ce3336 100644 --- a/src/vs/workbench/parts/tasks/common/taskSystem.ts +++ b/src/vs/workbench/parts/tasks/common/taskSystem.ts @@ -11,12 +11,23 @@ import { IEventEmitter } from 'vs/base/common/eventEmitter'; import { ProblemMatcher } from 'vs/platform/markers/common/problemMatcher'; +export enum TaskErrors { + NotConfigured, + RunningTask, + NoBuildTask, + NoTestTask, + ConfigValidationError, + TaskNotFound, + NoValidTaskRunner, + UnknownError +} + export class TaskError { - public severity:Severity; - public message:string; - public code:number; + public severity: Severity; + public message: string; + public code: TaskErrors; - constructor(severity:Severity, message:string, code:number = -1) { + constructor(severity: Severity, message: string, code: TaskErrors) { this.severity = severity; this.message = message; this.code = code; 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 d6f8e5e2f0f..baab42c50f2 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -60,7 +60,7 @@ import { SystemVariables } from 'vs/workbench/parts/lib/node/systemVariables'; import { ITextFileService, EventType } from 'vs/workbench/parts/files/common/files'; import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt } from 'vs/workbench/parts/output/common/output'; -import { ITaskSystem, ITaskSummary, ITaskRunResult, TaskError, TaskConfiguration, TaskDescription, TaskSystemEvents } from 'vs/workbench/parts/tasks/common/taskSystem'; +import { ITaskSystem, ITaskSummary, ITaskRunResult, TaskError, TaskErrors, TaskConfiguration, TaskDescription, TaskSystemEvents } from 'vs/workbench/parts/tasks/common/taskSystem'; import { ITaskService, TaskServiceEvents } from 'vs/workbench/parts/tasks/common/taskService'; import { LanguageServiceTaskSystem, LanguageServiceTaskConfiguration } from 'vs/workbench/parts/tasks/common/languageServiceTaskSystem'; @@ -570,7 +570,7 @@ class TaskService extends EventEmitter implements ITaskService { return configPromise.then((config) => { if (!config) { this._taskSystemPromise = null; - throw new TaskError(Severity.Info, nls.localize('TaskSystem.noConfiguration', 'No task runner configured.'), 1); + throw new TaskError(Severity.Info, nls.localize('TaskSystem.noConfiguration', 'No task runner configured.'), TaskErrors.NotConfigured); } let result: ITaskSystem = null; if (config.buildSystem === 'service') { @@ -580,7 +580,7 @@ class TaskService extends EventEmitter implements ITaskService { } if (result === null) { this._taskSystemPromise = null; - throw new TaskError(Severity.Info, nls.localize('TaskSystem.noBuildType', "No valid task runner configured. Supported task runners are 'service' and 'program'.")); + throw new TaskError(Severity.Info, nls.localize('TaskSystem.noBuildType', "No valid task runner configured. Supported task runners are 'service' and 'program'."), TaskErrors.NoValidTaskRunner); } this.taskSystemListeners.push(result.addListener(TaskSystemEvents.Active, (event) => this.emit(TaskServiceEvents.Active, event))); this.taskSystemListeners.push(result.addListener(TaskSystemEvents.Inactive, (event) => this.emit(TaskServiceEvents.Inactive, event))); @@ -618,6 +618,12 @@ class TaskService extends EventEmitter implements ITaskService { return ProcessRunnerDetector.supports(config.command); } + public configureAction(): Action { + return new ConfigureTaskRunnerAction(ConfigureTaskRunnerAction.ID, ConfigureTaskRunnerAction.TEXT, + this.configurationService, this.editorService, this.fileService, this.contextService, + this.outputService, this.messageService); + } + public build(): TPromise { return this.executeTarget(taskSystem => taskSystem.build()); } @@ -634,11 +640,11 @@ class TaskService extends EventEmitter implements ITaskService { return this.executeTarget(taskSystem => taskSystem.runTest()); } - public run(taskIdentifier:string): TPromise { + public run(taskIdentifier: string): TPromise { return this.executeTarget(taskSystem => taskSystem.run(taskIdentifier)); } - private executeTarget(fn:(taskSystem:ITaskSystem) => ITaskRunResult): TPromise { + private executeTarget(fn: (taskSystem: ITaskSystem) => ITaskRunResult): TPromise { return this.textFileService.saveAll().then((value) => { return this.taskSystemPromise. then((taskSystem) => { @@ -646,7 +652,7 @@ class TaskService extends EventEmitter implements ITaskService { if (!active) { return fn(taskSystem); } else { - throw new TaskError(Severity.Warning, nls.localize('TaskSystem.active', 'There is an active running task right now. Terminate it first before executing another task.'), 2); + throw new TaskError(Severity.Warning, nls.localize('TaskSystem.active', 'There is an active running task right now. Terminate it first before executing another task.'), TaskErrors.RunningTask); } }); }). @@ -739,9 +745,11 @@ class TaskService extends EventEmitter implements ITaskService { let showOutput = true; if (err instanceof TaskError) { let buildError = err; - if (buildError.code === 1 || buildError.code === 2) { + let needsConfig = buildError.code === TaskErrors.NotConfigured || buildError.code === TaskErrors.NoBuildTask || buildError.code === TaskErrors.NoTestTask; + let needsTerminate = buildError.code === TaskErrors.RunningTask; + if (needsConfig || needsTerminate) { let closeAction = new CloseMessageAction(); - let action = buildError.code === 1 + let action = needsConfig ? new ConfigureTaskRunnerAction(ConfigureTaskRunnerAction.ID, ConfigureTaskRunnerAction.TEXT, this.configurationService, this.editorService, this.fileService, this.contextService, this.outputService, this.messageService) : new TerminateAction(TerminateAction.ID, TerminateAction.TEXT, this, this.telemetryService); diff --git a/src/vs/workbench/parts/tasks/node/processRunnerSystem.ts b/src/vs/workbench/parts/tasks/node/processRunnerSystem.ts index 7ecaf80082d..ce8c1167f93 100644 --- a/src/vs/workbench/parts/tasks/node/processRunnerSystem.ts +++ b/src/vs/workbench/parts/tasks/node/processRunnerSystem.ts @@ -26,7 +26,7 @@ import { ProblemMatcher } from 'vs/platform/markers/common/problemMatcher'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEvents } from 'vs/workbench/parts/tasks/common/problemCollectors'; -import { ITaskSystem, ITaskSummary, ITaskRunResult, TaskError, TaskRunnerConfiguration, TaskDescription, CommandOptions, ShowOutput, TelemetryEvent, Triggers, TaskSystemEvents, TaskEvent, TaskType } from 'vs/workbench/parts/tasks/common/taskSystem'; +import { ITaskSystem, ITaskSummary, ITaskRunResult, TaskError, TaskErrors, TaskRunnerConfiguration, TaskDescription, CommandOptions, ShowOutput, TelemetryEvent, Triggers, TaskSystemEvents, TaskEvent, TaskType } from 'vs/workbench/parts/tasks/common/taskSystem'; import * as FileConfig from './processRunnerConfiguration'; export class ProcessRunnerSystem extends EventEmitter implements ITaskSystem { @@ -83,7 +83,7 @@ export class ProcessRunnerSystem extends EventEmitter implements ITaskSystem { public build(): ITaskRunResult { if (!this.defaultBuildTaskIdentifier) { - throw new TaskError(Severity.Info, nls.localize('TaskRunnerSystem.noBuildTask', 'No build task configured.'), 1); + throw new TaskError(Severity.Info, nls.localize('TaskRunnerSystem.noBuildTask', 'No build task configured.'), TaskErrors.NoBuildTask); } return this.executeTask(this.defaultBuildTaskIdentifier, Triggers.shortcut); } @@ -98,7 +98,7 @@ export class ProcessRunnerSystem extends EventEmitter implements ITaskSystem { public runTest(): ITaskRunResult { if (!this.defaultTestTaskIdentifier) { - throw new TaskError(Severity.Info, nls.localize('TaskRunnerSystem.noTestTask', 'No test task configured.'), 1); + throw new TaskError(Severity.Info, nls.localize('TaskRunnerSystem.noTestTask', 'No test task configured.'), TaskErrors.NoTestTask); } return this.executeTask(this.defaultTestTaskIdentifier, Triggers.shortcut); } @@ -147,11 +147,11 @@ export class ProcessRunnerSystem extends EventEmitter implements ITaskSystem { private executeTask(taskIdentifier: string, trigger: string = Triggers.command): ITaskRunResult { if (this.validationStatus.isFatal()) { - throw new TaskError(Severity.Error, nls.localize('TaskRunnerSystem.fatalError', 'The provided task configuration has validation errors. See tasks output log for details.')); + throw new TaskError(Severity.Error, nls.localize('TaskRunnerSystem.fatalError', 'The provided task configuration has validation errors. See tasks output log for details.'), TaskErrors.ConfigValidationError); } let task = this.configuration.tasks[taskIdentifier]; if (!task) { - throw new TaskError(Severity.Info, nls.localize('TaskRunnerSystem.norebuild', 'No task to execute found.')); + throw new TaskError(Severity.Info, nls.localize('TaskRunnerSystem.norebuild', 'No task to execute found.'), TaskErrors.TaskNotFound); } let telemetryEvent: TelemetryEvent = { trigger: trigger, @@ -177,10 +177,10 @@ export class ProcessRunnerSystem extends EventEmitter implements ITaskSystem { } else if (err instanceof Error) { let error = err; this.outputService.append(this.outputChannel, error.message); - throw new TaskError(Severity.Error, error.message); + throw new TaskError(Severity.Error, error.message, TaskErrors.UnknownError); } else { this.outputService.append(this.outputChannel, err.toString()); - throw new TaskError(Severity.Error, nls.localize('TaskRunnerSystem.unknownError', 'A unknown error has occurred while executing a task. See task output log for details.')); + throw new TaskError(Severity.Error, nls.localize('TaskRunnerSystem.unknownError', 'A unknown error has occurred while executing a task. See task output log for details.'), TaskErrors.UnknownError); } } } -- GitLab