diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index b1febc8eb3dc8e5a1a7ebd186dd105b962089a9f..180bc9ffbf380b1119ed35020ca1a2a0ca00df4b 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -324,7 +324,6 @@ namespace Tasks { group: types.TaskGroup.is(task.group) ? task.group : undefined, command: command, isBackground: !!task.isBackground, - suppressTaskName: true, problemMatchers: task.problemMatchers.slice() }; return result; @@ -338,6 +337,7 @@ namespace Tasks { name: value.process, args: Strings.from(value.args), type: TaskSystem.CommandType.Process, + suppressTaskName: true, terminalBehavior: TerminalBehaviour.from(value.terminalBehavior) }; if (value.options) { diff --git a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts index 8d7903008c973849722c9d44c562619b32e02903..2419be66ba092d15a30f4e8c7a8810ecd974197e 100644 --- a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts @@ -337,12 +337,19 @@ enum ProblemMatcherKind { const EMPTY_ARRAY: any[] = []; Object.freeze(EMPTY_ARRAY); -function mergeProperty(target: T, source: T, key: K) { +function assignProperty(target: T, source: T, key: K) { if (source[key] !== void 0) { target[key] = source[key]; } } +function fillProperty(target: T, source: T, key: K) { + if (target[key] === void 0 && source[key] !== void 0) { + target[key] = source[key]; + } +} + + interface ParseContext { problemReporter: IProblemReporter; namedProblemMatchers: IStringDictionary; @@ -350,6 +357,62 @@ interface ParseContext { schemaVersion: Tasks.JsonSchemaVersion; } +namespace ShellConfiguration { + export function is(value: any): value is ShellConfiguration { + let candidate: ShellConfiguration = value; + return candidate && Types.isString(candidate.executable) && (candidate.args === void 0 || Types.isStringArray(candidate.args)); + } + + export function from(this: void, config: ShellConfiguration, context: ParseContext): Tasks.ShellConfiguration { + if (!is(config)) { + return undefined; + } + let result: ShellConfiguration = { executable: config.executable }; + if (config.args !== void 0) { + result.args = config.args.slice(); + } + return result; + } + + export function isEmpty(value: Tasks.ShellConfiguration): boolean { + return !value || value.executable === void 0 && (value.args === void 0 || value.args.length === 0); + } + + export function assignProperties(target: Tasks.ShellConfiguration, source: Tasks.ShellConfiguration): Tasks.ShellConfiguration { + if (isEmpty(source)) { + return target; + } + if (isEmpty(target)) { + return source; + } + assignProperty(target, source, 'executable'); + assignProperty(target, source, 'args'); + return target; + } + + export function fillProperties(target: Tasks.ShellConfiguration, source: Tasks.ShellConfiguration): Tasks.ShellConfiguration { + if (isEmpty(source)) { + return target; + } + if (isEmpty(target)) { + return source; + } + fillProperty(target, source, 'executable'); + fillProperty(target, source, 'args'); + return target; + } + + export function fillDefaults(value: Tasks.ShellConfiguration): void { + } + + export function freeze(value: Tasks.ShellConfiguration): void { + if (!value) { + return; + } + Object.freeze(value); + } +} + namespace CommandOptions { export function from(this: void, options: CommandOptions, context: ParseContext): Tasks.CommandOptions { let result: Tasks.CommandOptions = {}; @@ -371,23 +434,36 @@ namespace CommandOptions { return !value || value.cwd === void 0 && value.env === void 0 && value.shell === void 0; } - export function merge(target: Tasks.CommandOptions, source: Tasks.CommandOptions): Tasks.CommandOptions { + export function assignProperties(target: Tasks.CommandOptions, source: Tasks.CommandOptions): Tasks.CommandOptions { if (isEmpty(source)) { return target; } if (isEmpty(target)) { return source; } - mergeProperty(target, source, 'cwd'); + assignProperty(target, source, 'cwd'); if (target.env === void 0) { target.env = source.env; } else if (source.env !== void 0) { let env: { [key: string]: string; } = Object.create(null); Object.keys(target.env).forEach(key => env[key] = target.env[key]); - Object.keys(source.env).forEach(key => env[key = source.env[key]]); + Object.keys(source.env).forEach(key => env[key] = source.env[key]); target.env = env; } - target.shell = ShellConfiguration.merge(target.shell, source.shell); + target.shell = ShellConfiguration.assignProperties(target.shell, source.shell); + return target; + } + + export function fillProperties(target: Tasks.CommandOptions, source: Tasks.CommandOptions): Tasks.CommandOptions { + if (isEmpty(source)) { + return target; + } + if (isEmpty(target)) { + return source; + } + fillProperty(target, source, 'cwd'); + fillProperty(target, source, 'env'); + target.shell = ShellConfiguration.fillProperties(target.shell, source.shell); return target; } @@ -414,50 +490,6 @@ namespace CommandOptions { } } -namespace ShellConfiguration { - export function is(value: any): value is ShellConfiguration { - let candidate: ShellConfiguration = value; - return candidate && Types.isString(candidate.executable) && (candidate.args === void 0 || Types.isStringArray(candidate.args)); - } - - export function from(this: void, config: ShellConfiguration, context: ParseContext): Tasks.ShellConfiguration { - if (!is(config)) { - return undefined; - } - let result: ShellConfiguration = { executable: config.executable }; - if (config.args !== void 0) { - result.args = config.args.slice(); - } - return result; - } - - export function isEmpty(value: Tasks.ShellConfiguration): boolean { - return !value || value.executable === void 0 && (value.args === void 0 || value.args.length === 0); - } - - export function merge(target: Tasks.ShellConfiguration, source: Tasks.ShellConfiguration): Tasks.ShellConfiguration { - if (isEmpty(source)) { - return target; - } - if (isEmpty(target)) { - return source; - } - mergeProperty(target, source, 'executable'); - mergeProperty(target, source, 'args'); - return target; - } - - export function fillDefaults(value: Tasks.ShellConfiguration): void { - } - - export function freeze(value: Tasks.ShellConfiguration): void { - if (!value) { - return; - } - Object.freeze(value); - } -} - namespace CommandConfiguration { interface TerminalBehavior { echo?: boolean; @@ -474,6 +506,7 @@ namespace CommandConfiguration { showOutput?: string; terminal?: TerminalBehavior; taskSelector?: string; + suppressTaskName?: boolean; } interface CommandConfiguationShape extends BaseCommandConfiguationShape { @@ -506,15 +539,27 @@ namespace CommandConfiguration { return { echo, reveal }; } - export function merge(target: Tasks.TerminalBehavior, source: Tasks.TerminalBehavior): Tasks.TerminalBehavior { + export function assignProperties(target: Tasks.TerminalBehavior, source: Tasks.TerminalBehavior): Tasks.TerminalBehavior { if (isEmpty(source)) { return target; } if (isEmpty(target)) { return source; } - mergeProperty(target, source, 'echo'); - mergeProperty(target, source, 'reveal'); + assignProperty(target, source, 'echo'); + assignProperty(target, source, 'reveal'); + return target; + } + + export function fillProperties(target: Tasks.TerminalBehavior, source: Tasks.TerminalBehavior): Tasks.TerminalBehavior { + if (isEmpty(source)) { + return target; + } + if (isEmpty(target)) { + return source; + } + fillProperty(target, source, 'echo'); + fillProperty(target, source, 'reveal'); return target; } @@ -541,7 +586,7 @@ namespace CommandConfiguration { Object.freeze(value); } - function isEmpty(this: void, value: Tasks.TerminalBehavior): boolean { + export function isEmpty(this: void, value: Tasks.TerminalBehavior): boolean { return !value || value.echo === void 0 && value.reveal === void 0; } } @@ -558,9 +603,8 @@ namespace CommandConfiguration { osConfig = fromBase(config.linux, context); } if (osConfig) { - result = merge(result, osConfig); + result = assignProperties(result, osConfig); } - fillDefaults(result); return isEmpty(result) ? undefined : result; } @@ -605,11 +649,20 @@ namespace CommandConfiguration { if (Types.isString(config.taskSelector)) { result.taskSelector = config.taskSelector; } + if (Types.isBoolean(config.suppressTaskName)) { + result.suppressTaskName = config.suppressTaskName; + } return isEmpty(result) ? undefined : result; } export function isEmpty(value: Tasks.CommandConfiguration): boolean { - return !value || value.name === void 0 && value.type === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options) && value.terminalBehavior === void 0; + return !value || value.name === void 0 + && value.type === void 0 + && value.args === void 0 + && value.taskSelector === void 0 + && value.suppressTaskName === void 0 + && CommandOptions.isEmpty(value.options) + && TerminalBehavior.isEmpty(value.terminalBehavior); } export function onlyTerminalBehaviour(value: Tasks.CommandConfiguration): boolean { @@ -618,22 +671,17 @@ namespace CommandConfiguration { value.name === void 0 && value.type === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options); } - export function merge(target: Tasks.CommandConfiguration, source: Tasks.CommandConfiguration): Tasks.CommandConfiguration { + export function assignProperties(target: Tasks.CommandConfiguration, source: Tasks.CommandConfiguration): Tasks.CommandConfiguration { if (isEmpty(source)) { return target; } if (isEmpty(target)) { return source; } - mergeProperty(target, source, 'name'); - mergeProperty(target, source, 'type'); - // Merge isShellCommand - if (target.type === void 0) { - target.type = source.type; - } - - target.terminalBehavior = TerminalBehavior.merge(target.terminalBehavior, source.terminalBehavior); - mergeProperty(target, source, 'taskSelector'); + assignProperty(target, source, 'name'); + assignProperty(target, source, 'type'); + assignProperty(target, source, 'taskSelector'); + assignProperty(target, source, 'suppressTaskName'); if (source.args !== void 0) { if (target.args === void 0) { target.args = source.args; @@ -641,7 +689,40 @@ namespace CommandConfiguration { target.args = target.args.concat(source.args); } } - target.options = CommandOptions.merge(target.options, source.options); + target.terminalBehavior = TerminalBehavior.assignProperties(target.terminalBehavior, source.terminalBehavior); + target.options = CommandOptions.assignProperties(target.options, source.options); + return target; + } + + export function fillGlobals(target: Tasks.CommandConfiguration, source: Tasks.CommandConfiguration, taskName: string): Tasks.CommandConfiguration { + if (isEmpty(source)) { + return target; + } + target = target || { + name: undefined, + type: undefined, + terminalBehavior: undefined + }; + fillProperty(target, source, 'name'); + fillProperty(target, source, 'type'); + fillProperty(target, source, 'taskSelector'); + fillProperty(target, source, 'suppressTaskName'); + + target.terminalBehavior = TerminalBehavior.fillProperties(target.terminalBehavior, source.terminalBehavior); + target.options = CommandOptions.fillProperties(target.options, source.options); + + let args: string[] = source.args ? source.args.slice() : []; + if (!target.suppressTaskName) { + if (target.taskSelector !== void 0) { + args.push(target.taskSelector + taskName); + } else { + args.push(taskName); + } + } + if (target.args) { + args = args.concat(target.args); + } + target.args = args; return target; } @@ -653,11 +734,14 @@ namespace CommandConfiguration { value.type = Tasks.CommandType.Process; } value.terminalBehavior = TerminalBehavior.fillDefault(value.terminalBehavior); + if (!isEmpty(value)) { + value.options = CommandOptions.fillDefaults(value.options); + } if (value.args === void 0) { value.args = EMPTY_ARRAY; } - if (!isEmpty(value)) { - value.options = CommandOptions.fillDefaults(value.options); + if (value.suppressTaskName === void 0) { + value.suppressTaskName = false; } } @@ -771,7 +855,7 @@ namespace TaskDescription { export let source: Tasks.TaskSource = { kind: Tasks.TaskSourceKind.Workspace, label: 'Workspace', - detail: '.settins\tasks.json' + detail: '.settins\\tasks.json' }; export function from(this: void, tasks: TaskDescription[], globals: Globals, context: ParseContext): TaskParseResult { @@ -790,11 +874,7 @@ namespace TaskDescription { return; } let problemMatchers = ProblemMatcherConverter.from(externalTask.problemMatcher, context); - let command: Tasks.CommandConfiguration = externalTask.command !== void 0 - ? CommandConfiguration.from(externalTask, context) - : externalTask.echoCommand !== void 0 - ? { name: undefined, type: undefined, terminalBehavior: CommandConfiguration.TerminalBehavior.from(externalTask, context) } - : undefined; + let command: Tasks.CommandConfiguration = CommandConfiguration.from(externalTask, context); let identifer = Types.isString(externalTask.identifier) ? externalTask.identifier : taskName; let task: Tasks.Task = { _id: UUID.generateUuid(), @@ -804,9 +884,6 @@ namespace TaskDescription { identifier: identifer, command }; - if (externalTask.command === void 0 && Types.isStringArray(externalTask.args)) { - task.args = externalTask.args.slice(); - } if (externalTask.isWatching !== void 0) { task.isBackground = !!externalTask.isWatching; } @@ -829,9 +906,7 @@ namespace TaskDescription { if (externalTask.command !== void 0) { // if the task has its own command then we suppress the // task name by default. - task.suppressTaskName = true; - } else if (externalTask.suppressTaskName !== void 0) { - task.suppressTaskName = !!externalTask.suppressTaskName; + command.suppressTaskName = true; } if (externalTask.dependsOn !== void 0) { if (Types.isString(externalTask.dependsOn)) { @@ -848,7 +923,7 @@ namespace TaskDescription { annotatingTasks.push(task); return; } - mergeGlobals(task, globals); + fillGlobals(task, globals); fillDefaults(task); let addTask: boolean = true; if (context.engine === Tasks.ExecutionEngine.Terminal && task.command && task.command.name && task.command.type === Tasks.CommandType.Shell && task.command.args && task.command.args.length > 0) { @@ -901,7 +976,7 @@ namespace TaskDescription { }; } - export function mergeTasks(target: Tasks.Task[], source: Tasks.Task[]): Tasks.Task[] { + export function assignTasks(target: Tasks.Task[], source: Tasks.Task[]): Tasks.Task[] { if (source === void 0 || source.length === 0) { return target; } @@ -930,28 +1005,15 @@ namespace TaskDescription { return target; } - export function mergeGlobals(task: Tasks.Task, globals: Globals): void { + export function fillGlobals(task: Tasks.Task, globals: Globals): void { // We only merge a command from a global definition if there is no dependsOn if (task.dependsOn === void 0) { - if (CommandConfiguration.isEmpty(task.command) && !CommandConfiguration.isEmpty(globals.command) && globals.command.name !== void 0) { - task.command = globals.command; - } - if (CommandConfiguration.onlyTerminalBehaviour(task.command)) { - // The globals can have a echo set which would override the local echo - // Saves the need of a additional fill method. But might be necessary - // at some point. - let oldTerminal = Objects.clone(task.command.terminalBehavior); - CommandConfiguration.merge(task.command, globals.command); - task.command.terminalBehavior = oldTerminal; - } + task.command = CommandConfiguration.fillGlobals(task.command, globals.command, task.name); } // promptOnClose is inferred from isBackground if available if (task.promptOnClose === void 0 && task.isBackground === void 0 && globals.promptOnClose !== void 0) { task.promptOnClose = globals.promptOnClose; } - if (task.suppressTaskName === void 0 && globals.suppressTaskName !== void 0) { - task.suppressTaskName = globals.suppressTaskName; - } } export function mergeGlobalsIntoAnnnotation(task: Tasks.Task, globals: Globals): void { @@ -959,12 +1021,6 @@ namespace TaskDescription { export function fillDefaults(task: Tasks.Task): void { CommandConfiguration.fillDefaults(task.command); - if (task.args === void 0 && task.command === void 0) { - task.args = EMPTY_ARRAY; - } - if (task.suppressTaskName === void 0) { - task.suppressTaskName = false; - } if (task.promptOnClose === void 0) { task.promptOnClose = task.isBackground !== void 0 ? !task.isBackground : true; } @@ -1002,7 +1058,7 @@ namespace TaskDescription { return (task.command === void 0 || task.command.name === void 0) && (task.dependsOn === void 0 || task.dependsOn.length === 0); } - export function merge(target: Tasks.Task, source: Tasks.Task): Tasks.Task { + export function assignProperties(target: Tasks.Task, source: Tasks.Task): Tasks.Task { if (!target) { return source; } @@ -1010,14 +1066,12 @@ namespace TaskDescription { return target; } - mergeProperty(target, source, 'group'); - target.command = CommandConfiguration.merge(target.command, source.command); - mergeProperty(target, source, 'suppressTaskName'); - mergeProperty(target, source, 'args'); - mergeProperty(target, source, 'isBackground'); - mergeProperty(target, source, 'promptOnClose'); - mergeProperty(target, source, 'dependsOn'); - mergeProperty(target, source, 'problemMatchers'); + assignProperty(target, source, 'group'); + target.command = CommandConfiguration.assignProperties(target.command, source.command); + assignProperty(target, source, 'isBackground'); + assignProperty(target, source, 'promptOnClose'); + assignProperty(target, source, 'dependsOn'); + assignProperty(target, source, 'problemMatchers'); return target; } } @@ -1041,13 +1095,13 @@ namespace Globals { osGlobals = fromBase(config.linux, context); } if (osGlobals) { - result = Globals.merge(result, osGlobals); + result = Globals.assignProperties(result, osGlobals); } - Globals.fillDefaults(result); let command = CommandConfiguration.from(config, context); if (command) { result.command = command; } + Globals.fillDefaults(result); Globals.freeze(result); return result; } @@ -1067,15 +1121,15 @@ namespace Globals { return !value || value.command === void 0 && value.promptOnClose === void 0 && value.suppressTaskName === void 0; } - export function merge(target: Globals, source: Globals): Globals { + export function assignProperties(target: Globals, source: Globals): Globals { if (isEmpty(source)) { return target; } if (isEmpty(target)) { return source; } - mergeProperty(target, source, 'promptOnClose'); - mergeProperty(target, source, 'suppressTaskName'); + assignProperty(target, source, 'promptOnClose'); + assignProperty(target, source, 'suppressTaskName'); return target; } @@ -1083,6 +1137,7 @@ namespace Globals { if (!value) { return; } + CommandConfiguration.fillDefaults(value.command); if (value.suppressTaskName === void 0) { value.suppressTaskName = false; } @@ -1207,8 +1262,8 @@ class ConfigurationParser { result = TaskDescription.from(fileConfig.tasks, globals, context); } if (globalTasks) { - result.tasks = TaskDescription.mergeTasks(result.tasks, globalTasks.tasks); - result.annotatingTasks = TaskDescription.mergeTasks(result.annotatingTasks, globalTasks.annotatingTasks); + result.tasks = TaskDescription.assignTasks(result.tasks, globalTasks.tasks); + result.annotatingTasks = TaskDescription.assignTasks(result.annotatingTasks, globalTasks.annotatingTasks); } if ((!result.tasks || result.tasks.length === 0) && (globals.command && globals.command.name)) { @@ -1221,12 +1276,16 @@ class ConfigurationParser { name: globals.command.name, identifier: globals.command.name, group: Tasks.TaskGroup.Build, - command: undefined, + command: { + name: undefined, + type: undefined, + terminalBehavior: undefined, + suppressTaskName: true + }, isBackground: isBackground, - suppressTaskName: true, // this must be true since we infer the task from the global data. problemMatchers: matchers }; - TaskDescription.mergeGlobals(task, globals); + TaskDescription.fillGlobals(task, globals); TaskDescription.fillDefaults(task); result.tasks = [task]; } @@ -1241,7 +1300,7 @@ export function parse(configuration: ExternalTaskRunnerConfiguration, logger: IP } export function mergeTasks(target: Tasks.Task, source: Tasks.Task): Tasks.Task { - return TaskDescription.merge(target, source); + return TaskDescription.assignProperties(target, source); } /* diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index ab09f644078536bf2b138b110a0cdbc342348a9b..88dfd56ba739c755a733393c87f6a3f5f03c4b15 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -138,6 +138,12 @@ export interface CommandConfiguration { */ taskSelector?: string; + /** + * Whether to suppress the task name when merging global args + * + */ + suppressTaskName?: boolean; + /** * Describes how the terminal is supposed to behave. */ @@ -212,17 +218,6 @@ export interface Task { */ command: CommandConfiguration; - /** - * Suppresses the task name when calling the task using the task runner. - */ - suppressTaskName?: boolean; - - /** - * Additional arguments passed to the command when this target is - * invoked. - */ - args?: string[]; - /** * Whether the task is a background task or not. */ 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 317f79f6ef14fedc79e227c9c9d58c12a4e4054e..f14e2e4bbc6c42cfd630a95973d688ccba8c1cb5 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -1091,10 +1091,7 @@ class TaskService extends EventEmitter implements ITaskService { return { config: result, hasErrors }; }); } else { - configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService).detect(true).then((value) => { - let hasErrors = this.printStderr(value.stderr); - return { config: value.config, hasErrors }; - }); + configPromise = TPromise.as({ config, hasErrors: false }); } } else { configPromise = TPromise.as({ config, hasErrors: false }); diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts index 37cef5b6c85e076a8d6987ba7d5f402742f2c00c..6dbbc5b93a698fa3aef83213464e13e2331ff8d9 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts @@ -503,18 +503,6 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { private resolveCommandAndArgs(task: Task): { command: string, args: string[] } { // First we need to use the command args: let args: string[] = task.command.args ? task.command.args.slice() : []; - // We need to first pass the task name - if (!task.suppressTaskName) { - if (task.command.taskSelector) { - args.push(task.command.taskSelector + task.name); - } else { - args.push(task.name); - } - } - // And then additional arguments - if (task.args) { - args = args.concat(task.args); - } args = this.resolveVariables(args); let command: string = this.resolveVariable(task.command.name); return { command, args }; diff --git a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts index de4bc36b7f51b9eb3bdeb7e8fb73128929befc8a..0ac2c85e08ffbe7339327f028502b6db421e415d 100644 --- a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts @@ -162,18 +162,6 @@ export class ProcessTaskSystem extends EventEmitter implements ITaskSystem { } let args: string[] = commandConfig.args ? commandConfig.args.slice() : []; - // We need to first pass the task name - if (!task.suppressTaskName) { - if (commandConfig.taskSelector) { - args.push(commandConfig.taskSelector + task.name); - } else { - args.push(task.name); - } - } - // And then additional arguments - if (task.args) { - args = args.concat(task.args); - } args = this.resolveVariables(args); let command: string = this.resolveVariable(commandConfig.name); this.childProcess = new LineProcess(command, args, commandConfig.type === CommandType.Shell, this.resolveOptions(commandConfig.options)); 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 27dcb251cd0bd4beef6eac08003c4ff052df8566..a82a75b6e7c187ed3639ed537da2a78e485324de 100644 --- a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts +++ b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts @@ -56,16 +56,25 @@ class ProblemReporter implements IProblemReporter { class ConfiguationBuilder { public result: Tasks.Task[]; + private builders: TaskBuilder[]; constructor() { this.result = []; + this.builders = []; } public task(name: string, command: string): TaskBuilder { let builder = new TaskBuilder(this, name, command); + this.builders.push(builder); this.result.push(builder.result); return builder; } + + public done(): void { + for (let builder of this.builders) { + builder.done(); + } + } } class TerminalBehaviorBuilder { @@ -85,6 +94,9 @@ class TerminalBehaviorBuilder { this.result.reveal = value; return this; } + + public done(): void { + } } class CommandConfigurationBuilder { @@ -101,7 +113,8 @@ class CommandConfigurationBuilder { options: { cwd: '${workspaceRoot}' }, - terminalBehavior: this.terminalBuilder.result + terminalBehavior: this.terminalBuilder.result, + suppressTaskName: false }; } @@ -130,9 +143,19 @@ class CommandConfigurationBuilder { return this; } + public suppressTaskName(value: boolean): CommandConfigurationBuilder { + this.result.suppressTaskName = value; + return this; + } + public terminal(): TerminalBehaviorBuilder { return this.terminalBuilder; } + + public done(taskName: string): void { + this.result.args = this.result.args.map(arg => arg === '$name' ? taskName : arg); + this.terminalBuilder.done(); + } } class TaskBuilder { @@ -149,7 +172,6 @@ class TaskBuilder { identifier: name, name: name, command: this.commandBuilder.result, - suppressTaskName: false, isBackground: false, promptOnClose: true, problemMatchers: [] @@ -166,16 +188,6 @@ class TaskBuilder { return this; } - public args(value: string[]): TaskBuilder { - this.result.args = value; - return this; - } - - public suppressTaskName(value: boolean): TaskBuilder { - this.result.suppressTaskName = value; - return this; - } - public isBackground(value: boolean): TaskBuilder { this.result.isBackground = value; return this; @@ -195,6 +207,10 @@ class TaskBuilder { public command(): CommandConfigurationBuilder { return this.commandBuilder; } + + public done(): void { + this.commandBuilder.done(this.result.name); + } } class ProblemMatcherBuilder { @@ -323,6 +339,7 @@ function testDefaultProblemMatcher(external: ExternalTaskRunnerConfiguration, re } function testConfiguration(external: ExternalTaskRunnerConfiguration, builder: ConfiguationBuilder): void { + builder.done(); let reporter = new ProblemReporter(); let result = parse(external, reporter); if (reporter.receivedMessage) { @@ -417,7 +434,6 @@ function assertTask(actual: Tasks.Task, expected: Tasks.Task) { assert.ok(actual._id); assert.strictEqual(actual.name, expected.name, 'name'); assertCommandConfiguration(actual.command, expected.command); - assert.strictEqual(actual.suppressTaskName, expected.suppressTaskName, 'suppressTaskName'); assert.strictEqual(actual.isBackground, expected.isBackground, 'isBackground'); assert.strictEqual(actual.promptOnClose, expected.promptOnClose, 'promptOnClose'); assert.strictEqual(typeof actual.problemMatchers, typeof expected.problemMatchers); @@ -435,6 +451,8 @@ function assertCommandConfiguration(actual: Tasks.CommandConfiguration, expected assertTerminalBehavior(actual.terminalBehavior, expected.terminalBehavior); assert.strictEqual(actual.name, expected.name, 'name'); assert.strictEqual(actual.type, expected.type, 'task type'); + assert.strictEqual(actual.suppressTaskName, expected.suppressTaskName, 'suppressTaskName'); + assert.strictEqual(actual.taskSelector, expected.taskSelector, 'taskSelector'); assert.deepEqual(actual.args, expected.args, 'args'); assert.strictEqual(typeof actual.options, typeof expected.options); if (actual.options && expected.options) { @@ -444,7 +462,6 @@ function assertCommandConfiguration(actual: Tasks.CommandConfiguration, expected assert.deepEqual(actual.options.env, expected.options.env, 'env'); } } - assert.strictEqual(actual.taskSelector, expected.taskSelector, 'taskSelector'); } } @@ -518,7 +535,7 @@ suite('Tasks version 0.1.0', () => { let builder = new ConfiguationBuilder(); builder.task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true); + command().suppressTaskName(true); testConfiguration( { version: '0.1.0', @@ -530,8 +547,7 @@ suite('Tasks version 0.1.0', () => { let builder = new ConfiguationBuilder(); builder.task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command(). + command().suppressTaskName(true). type(Tasks.CommandType.Shell); testConfiguration( { @@ -547,8 +563,8 @@ suite('Tasks version 0.1.0', () => { builder. task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command().terminal().reveal(Tasks.RevealKind.Silent); + command().suppressTaskName(true). + terminal().reveal(Tasks.RevealKind.Silent); testConfiguration( { version: '0.1.0', @@ -563,7 +579,7 @@ suite('Tasks version 0.1.0', () => { let builder = new ConfiguationBuilder(); builder.task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true); + command().suppressTaskName(true); testConfiguration( { version: '0.1.0', @@ -577,9 +593,9 @@ suite('Tasks version 0.1.0', () => { test('tasks: global promptOnClose', () => { let builder = new ConfiguationBuilder(); builder.task('tsc', 'tsc'). - suppressTaskName(true). group(Tasks.TaskGroup.Build). - promptOnClose(false); + promptOnClose(false). + command().suppressTaskName(true); testConfiguration( { version: '0.1.0', @@ -593,10 +609,10 @@ suite('Tasks version 0.1.0', () => { test('tasks: global promptOnClose default watching', () => { let builder = new ConfiguationBuilder(); builder.task('tsc', 'tsc'). - suppressTaskName(true). group(Tasks.TaskGroup.Build). isBackground(true). - promptOnClose(false); + promptOnClose(false). + command().suppressTaskName(true); testConfiguration( { version: '0.1.0', @@ -612,8 +628,8 @@ suite('Tasks version 0.1.0', () => { builder. task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command().terminal().reveal(Tasks.RevealKind.Never); + command().suppressTaskName(true). + terminal().reveal(Tasks.RevealKind.Never); testConfiguration( { version: '0.1.0', @@ -629,8 +645,8 @@ suite('Tasks version 0.1.0', () => { builder. task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command().terminal(). + command().suppressTaskName(true). + terminal(). echo(true); testConfiguration( { @@ -647,8 +663,7 @@ suite('Tasks version 0.1.0', () => { builder. task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command(). + command().suppressTaskName(true). args(['--p']); testConfiguration( { @@ -667,8 +682,7 @@ suite('Tasks version 0.1.0', () => { builder. task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command(). + command().suppressTaskName(true). options({ cwd: 'myPath' }); @@ -689,8 +703,7 @@ suite('Tasks version 0.1.0', () => { builder. task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command(). + command().suppressTaskName(true). options({ cwd: '${workspaceRoot}', env: { key: 'value' } }); testConfiguration( { @@ -712,7 +725,7 @@ suite('Tasks version 0.1.0', () => { builder. task(name, name). group(Tasks.TaskGroup.Build). - suppressTaskName(true); + command().suppressTaskName(true); let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', command: 'tsc', @@ -729,8 +742,7 @@ suite('Tasks version 0.1.0', () => { builder. task(name, name). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command(). + command().suppressTaskName(true). type(Tasks.CommandType.Shell); let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', @@ -749,7 +761,7 @@ suite('Tasks version 0.1.0', () => { builder. task(name, name). group(Tasks.TaskGroup.Build). - suppressTaskName(true); + command().suppressTaskName(true); let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', command: 'tsc', @@ -766,7 +778,7 @@ suite('Tasks version 0.1.0', () => { builder. task(name, name). group(Tasks.TaskGroup.Build). - suppressTaskName(true); + command().suppressTaskName(true); let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', command: 'tsc', @@ -782,8 +794,8 @@ suite('Tasks version 0.1.0', () => { builder. task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command().terminal().reveal(Platform.isWindows ? Tasks.RevealKind.Always : Tasks.RevealKind.Never); + command().suppressTaskName(true). + terminal().reveal(Platform.isWindows ? Tasks.RevealKind.Always : Tasks.RevealKind.Never); let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', command: 'tsc', @@ -800,8 +812,8 @@ suite('Tasks version 0.1.0', () => { builder. task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - suppressTaskName(true). - command().terminal(). + command().suppressTaskName(true). + terminal(). echo(Platform.isWindows ? false : true); let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', @@ -843,7 +855,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc'); + builder.task('taskName', 'tsc').command().args(['$name']); testConfiguration(external, builder); }); @@ -859,7 +871,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').group(Tasks.TaskGroup.Build); + builder.task('taskName', 'tsc').group(Tasks.TaskGroup.Build).command().args(['$name']); testConfiguration(external, builder); }); @@ -874,7 +886,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('build', 'tsc').group(Tasks.TaskGroup.Build); + builder.task('build', 'tsc').group(Tasks.TaskGroup.Build).command().args(['$name']); testConfiguration(external, builder); }); @@ -890,7 +902,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').group(Tasks.TaskGroup.Test); + builder.task('taskName', 'tsc').group(Tasks.TaskGroup.Test).command().args(['$name']); testConfiguration(external, builder); }); @@ -905,7 +917,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('test', 'tsc').group(Tasks.TaskGroup.Test); + builder.task('test', 'tsc').group(Tasks.TaskGroup.Test).command().args(['$name']); testConfiguration(external, builder); }); @@ -926,10 +938,10 @@ suite('Tasks version 0.1.0', () => { let builder = new ConfiguationBuilder(); builder.task('test', 'tsc'). group(Tasks.TaskGroup.Test). - args(['--p']). isBackground(true). promptOnClose(false). - command().terminal(). + command().args(['$name', '--p']). + terminal(). echo(true).reveal(Tasks.RevealKind.Never); testConfiguration(external, builder); @@ -950,7 +962,7 @@ suite('Tasks version 0.1.0', () => { let builder = new ConfiguationBuilder(); builder.task('test', 'tsc'). group(Tasks.TaskGroup.Test). - command().terminal(). + command().args(['$name']).terminal(). echo(true).reveal(Tasks.RevealKind.Never); testConfiguration(external, builder); @@ -972,7 +984,9 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').problemMatcher().pattern(/abc/); + builder.task('taskName', 'tsc'). + command().args(['$name']).parent. + problemMatcher().pattern(/abc/); testConfiguration(external, builder); }); @@ -992,7 +1006,9 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').problemMatcher().pattern(/.*/); + builder.task('taskName', 'tsc'). + command().args(['$name']).parent. + problemMatcher().pattern(/.*/); testConfiguration(external, builder); }); @@ -1016,7 +1032,9 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').problemMatcher(). + builder.task('taskName', 'tsc'). + command().args(['$name']).parent. + problemMatcher(). owner('myOwner'). applyTo(ApplyToKind.closedDocuments). severity(Severity.Warning). @@ -1043,7 +1061,9 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').problemMatcher(). + builder.task('taskName', 'tsc'). + command().args(['$name']).parent. + problemMatcher(). fileLocation(FileLocationKind.Relative). filePrefix('myPath'). pattern(/abc/); @@ -1071,7 +1091,9 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').problemMatcher(). + builder.task('taskName', 'tsc'). + command().args(['$name']).parent. + problemMatcher(). pattern(/abc/).file(10).message(11).location(12).severity(13).code(14); testConfiguration(external, builder); }); @@ -1100,7 +1122,9 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').problemMatcher(). + builder.task('taskName', 'tsc'). + command().args(['$name']).parent. + problemMatcher(). pattern(/abc/).file(10).message(11). line(12).character(13).endLine(14).endCharacter(15). severity(16).code(17); @@ -1118,7 +1142,9 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').promptOnClose(true); + builder.task('taskName', 'tsc'). + promptOnClose(true). + command().args(['$name']); testConfiguration(external, builder); }); @@ -1134,7 +1160,9 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').isBackground(true).promptOnClose(false); + builder.task('taskName', 'tsc'). + isBackground(true).promptOnClose(false). + command().args(['$name']); testConfiguration(external, builder); }); @@ -1150,7 +1178,9 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskName', 'tsc').promptOnClose(false); + builder.task('taskName', 'tsc'). + promptOnClose(false). + command().args(['$name']); testConfiguration(external, builder); }); @@ -1158,7 +1188,7 @@ suite('Tasks version 0.1.0', () => { let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', command: 'tsc', - taskSelector: '/t', + taskSelector: '/t:', tasks: [ { taskName: 'taskName', @@ -1168,7 +1198,8 @@ suite('Tasks version 0.1.0', () => { let builder = new ConfiguationBuilder(); builder.task('taskName', 'tsc'). command(). - taskSelector('/t'); + taskSelector('/t:'). + args(['/t:taskName']); testConfiguration(external, builder); }); @@ -1186,11 +1217,11 @@ suite('Tasks version 0.1.0', () => { }; let builder = new ConfiguationBuilder(); builder.task('taskName', 'tsc'). - suppressTaskName(true); + command().suppressTaskName(true); testConfiguration(external, builder); }); - test('tasks: suppress task name inerit', () => { + test('tasks: suppress task name inherit', () => { let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', command: 'tsc', @@ -1203,7 +1234,7 @@ suite('Tasks version 0.1.0', () => { }; let builder = new ConfiguationBuilder(); builder.task('taskName', 'tsc'). - suppressTaskName(true); + command().suppressTaskName(true); testConfiguration(external, builder); }); @@ -1221,8 +1252,10 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskNameOne', 'tsc'); - builder.task('taskNameTwo', 'tsc'); + builder.task('taskNameOne', 'tsc'). + command().args(['$name']); + builder.task('taskNameTwo', 'tsc'). + command().args(['$name']); testConfiguration(external, builder); }); @@ -1237,7 +1270,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskNameOne', 'tsc').suppressTaskName(true); + builder.task('taskNameOne', 'tsc').command().suppressTaskName(true); testConfiguration(external, builder); }); @@ -1256,8 +1289,8 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskNameOne', 'tsc').suppressTaskName(true); - builder.task('taskNameTwo', 'dir').suppressTaskName(true); + builder.task('taskNameOne', 'tsc').command().suppressTaskName(true); + builder.task('taskNameTwo', 'dir').command().suppressTaskName(true); testConfiguration(external, builder); }); @@ -1280,7 +1313,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskNameOne', 'tsc').suppressTaskName(true).command(). + builder.task('taskNameOne', 'tsc').command().suppressTaskName(true). type(Tasks.CommandType.Shell).args(['arg']).options({ cwd: 'cwd', env: { env: 'env' } }); testConfiguration(external, builder); }); @@ -1300,7 +1333,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskNameOne', name).suppressTaskName(true); + builder.task('taskNameOne', name).command().suppressTaskName(true); testConfiguration(external, builder); }); @@ -1320,7 +1353,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('tsc', 'tsc').suppressTaskName(true).command().args(args); + builder.task('tsc', 'tsc').command().suppressTaskName(true).args(args); testConfiguration(external, builder); }); @@ -1340,7 +1373,7 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('tsc', 'tsc').suppressTaskName(true).command().args(args); + builder.task('tsc', 'tsc').command().suppressTaskName(true).args(args); testConfiguration(external, builder); }); @@ -1356,7 +1389,42 @@ suite('Tasks version 0.1.0', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskNameOne', 'tsc').command().type(Tasks.CommandType.Process); + builder.task('taskNameOne', 'tsc').command().type(Tasks.CommandType.Shell).args(['$name']); + testConfiguration(external, builder); + }); + + test('tasks: global and tasks args', () => { + let external: ExternalTaskRunnerConfiguration = { + version: '0.1.0', + command: 'tsc', + args: ['global'], + tasks: [ + { + taskName: 'taskNameOne', + args: ['local'] + } + ] + }; + let builder = new ConfiguationBuilder(); + builder.task('taskNameOne', 'tsc').command().args(['global', '$name', 'local']); + testConfiguration(external, builder); + }); + + test('tasks: global and tasks args with task selector', () => { + let external: ExternalTaskRunnerConfiguration = { + version: '0.1.0', + command: 'tsc', + args: ['global'], + taskSelector: '/t:', + tasks: [ + { + taskName: 'taskNameOne', + args: ['local'] + } + ] + }; + let builder = new ConfiguationBuilder(); + builder.task('taskNameOne', 'tsc').command().taskSelector('/t:').args(['global', '/t:taskNameOne', 'local']); testConfiguration(external, builder); }); }); @@ -1376,9 +1444,9 @@ suite('Tasks version 2.0.0', () => { }; let builder = new ConfiguationBuilder(); builder.task('dir', 'dir'). - suppressTaskName(true). group(Tasks.TaskGroup.Build). - command().type(Tasks.CommandType.Shell); + command().suppressTaskName(true). + type(Tasks.CommandType.Shell); testConfiguration(external, builder); }); @@ -1436,16 +1504,16 @@ suite('Bugs / regression tests', () => { let builder = new ConfiguationBuilder(); if (Platform.isWindows) { builder.task('composeForDebug', 'powershell'). - suppressTaskName(true). + command().suppressTaskName(true). args(['-ExecutionPolicy', 'RemoteSigned', '.\\dockerTask.ps1', '-ComposeForDebug', '-Environment', 'debug']). - command().options({ cwd: '${workspaceRoot}' }). + options({ cwd: '${workspaceRoot}' }). terminal().echo(true).reveal(Tasks.RevealKind.Always); testConfiguration(external, builder); } else if (Platform.isMacintosh) { builder.task('composeForDebug', '/bin/bash'). - suppressTaskName(true). + command().suppressTaskName(true). args(['-c', './dockerTask.sh composeForDebug debug']). - command().options({ cwd: '${workspaceRoot}' }). + options({ cwd: '${workspaceRoot}' }). terminal().reveal(Tasks.RevealKind.Always); testConfiguration(external, builder); }