Skip to content

Commit 0b32b3c

Browse files
committed
Fix unlimited instances of recent tasks bug
1 parent 40077f5 commit 0b32b3c

5 files changed

Lines changed: 69 additions & 43 deletions

File tree

src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -710,24 +710,44 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
710710
this.workspaceFolders.forEach(folder => {
711711
folderMap[folder.uri.toString()] = folder;
712712
});
713+
const folderToTasksMap: Map<string, any> = new Map();
713714
const recentlyUsedTasks = this.getRecentlyUsedTasks();
714715
const tasks: (Task | ConfiguringTask)[] = [];
715-
for (let key of recentlyUsedTasks.keys()) {
716+
for (const key of recentlyUsedTasks.keys()) {
716717
const folder = this.getFolderFromTaskKey(key);
717718
const task = JSON.parse(recentlyUsedTasks.get(key)!);
718-
719+
if (folder && !folderToTasksMap.has(folder)) {
720+
folderToTasksMap.set(folder, []);
721+
}
719722
if (folder && (folderMap[folder] || (folder === USER_TASKS_GROUP_KEY)) && task) {
720-
let custom: CustomTask[] = [];
721-
let customized: IStringDictionary<ConfiguringTask> = Object.create(null);
722-
await this.computeTasksForSingleConfig(folderMap[folder] ?? this.workspaceFolders[0], {
723-
version: '2.0.0',
724-
tasks: [task]
725-
}, TaskRunSource.System, custom, customized, folderMap[folder] ? TaskConfig.TaskConfigSource.TasksJson : TaskConfig.TaskConfigSource.User);
726-
tasks.push(...custom);
727-
for (const configuration in customized) {
728-
tasks.push(customized[configuration]);
723+
folderToTasksMap.get(folder).push(task);
724+
}
725+
}
726+
const readTasksMap: Map<string, (Task | ConfiguringTask)> = new Map();
727+
for (const key of folderToTasksMap.keys()) {
728+
let custom: CustomTask[] = [];
729+
let customized: IStringDictionary<ConfiguringTask> = Object.create(null);
730+
await this.computeTasksForSingleConfig(folderMap[key] ?? this.workspaceFolders[0], {
731+
version: '2.0.0',
732+
tasks: folderToTasksMap.get(key)
733+
}, TaskRunSource.System, custom, customized, folderMap[key] ? TaskConfig.TaskConfigSource.TasksJson : TaskConfig.TaskConfigSource.User, true);
734+
custom.forEach(task => {
735+
const taskKey = task.getRecentlyUsedKey();
736+
if (taskKey) {
737+
readTasksMap.set(taskKey, task);
729738
}
739+
});
740+
for (const configuration in customized) {
741+
const taskKey = customized[configuration].getRecentlyUsedKey();
742+
if (taskKey) {
743+
readTasksMap.set(taskKey, customized[configuration]);
744+
}
745+
}
746+
}
730747

748+
for (const key of recentlyUsedTasks.keys()) {
749+
if (readTasksMap.has(key)) {
750+
tasks.push(readTasksMap.get(key)!);
731751
}
732752
}
733753
return tasks;
@@ -1811,13 +1831,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
18111831
return { workspaceFolder, set: undefined, configurations: undefined, hasErrors: false };
18121832
}
18131833

1814-
private async computeTasksForSingleConfig(workspaceFolder: IWorkspaceFolder, config: TaskConfig.ExternalTaskRunnerConfiguration | undefined, runSource: TaskRunSource, custom: CustomTask[], customized: IStringDictionary<ConfiguringTask>, source: TaskConfig.TaskConfigSource): Promise<boolean> {
1834+
private async computeTasksForSingleConfig(workspaceFolder: IWorkspaceFolder, config: TaskConfig.ExternalTaskRunnerConfiguration | undefined, runSource: TaskRunSource, custom: CustomTask[], customized: IStringDictionary<ConfiguringTask>, source: TaskConfig.TaskConfigSource, isRecentTask: boolean = false): Promise<boolean> {
18151835
if (!config) {
18161836
return false;
18171837
}
18181838
let taskSystemInfo: TaskSystemInfo | undefined = workspaceFolder ? this._taskSystemInfos.get(workspaceFolder.uri.scheme) : undefined;
18191839
let problemReporter = new ProblemReporter(this._outputChannel);
1820-
let parseResult = TaskConfig.parse(workspaceFolder, this._workspace, taskSystemInfo ? taskSystemInfo.platform : Platform.platform, config, problemReporter, source);
1840+
let parseResult = TaskConfig.parse(workspaceFolder, this._workspace, taskSystemInfo ? taskSystemInfo.platform : Platform.platform, config, problemReporter, source, isRecentTask);
18211841
let hasErrors = false;
18221842
if (!parseResult.validationStatus.isOK()) {
18231843
this.showOutput(runSource);
@@ -2061,12 +2081,11 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
20612081
}
20622082
const TaskQuickPickEntry = (task: Task): TaskQuickPickEntry => {
20632083
let entryLabel = task._label;
2064-
let commonKey = task._id.split('|')[0];
2065-
if (count[commonKey]) {
2066-
entryLabel = entryLabel + ' (' + count[commonKey].toString() + ')';
2067-
count[commonKey]++;
2084+
if (count[task._id]) {
2085+
entryLabel = entryLabel + ' (' + count[task._id].toString() + ')';
2086+
count[task._id]++;
20682087
} else {
2069-
count[commonKey] = 1;
2088+
count[task._id] = 1;
20702089
}
20712090
return { label: entryLabel, description: this.getTaskDescription(task), task, detail: this.showDetail() ? task.configurationProperties.detail : undefined };
20722091

src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,8 @@ export class TaskQuickPick extends Disposable {
6363

6464
private createTaskEntry(task: Task | ConfiguringTask): TaskTwoLevelQuickPickEntry {
6565
let entryLabel = this.guessTaskLabel(task);
66-
let commonKey = task._id.split('|');
67-
if (commonKey.length > 1) {
68-
entryLabel = entryLabel + ' (' + commonKey[1] + ')';
66+
if (!ConfiguringTask.is(task) && task.instance) {
67+
entryLabel += + ' (' + task.instance + ')';
6968
}
7069
const entry: TaskTwoLevelQuickPickEntry = { label: entryLabel, description: this.taskService.getTaskDescription(task), task, detail: this.showDetail() ? task.configurationProperties.detail : undefined };
7170
entry.buttons = [{ iconClass: 'codicon-gear', tooltip: nls.localize('configureTask', "Configure Task") }];

src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -228,16 +228,12 @@ export class TerminalTaskSystem implements ITaskSystem {
228228
}
229229

230230
public run(task: Task, resolver: ITaskResolver, trigger: string = Triggers.command): ITaskExecuteResult {
231-
let commonKey = task._id.split('|')[0];
232-
let validInstance = task.runOptions && task.runOptions.instanceLimit && this.instances[commonKey] && this.instances[commonKey].instances < task.runOptions.instanceLimit;
233-
let instance = this.instances[commonKey] ? this.instances[commonKey].instances : 0;
231+
let validInstance = task.runOptions && task.runOptions.instanceLimit && this.instances[task._id] && this.instances[task._id].instances < task.runOptions.instanceLimit;
232+
let instance = this.instances[task._id] ? this.instances[task._id].instances : 0;
234233
this.currentTask = new VerifiedTask(task, resolver, trigger);
235-
let taskClone = undefined;
236234
if (instance > 0) {
237-
taskClone = task.clone();
238-
taskClone._id += '|' + this.instances[commonKey].counter.toString();
235+
task.instance = this.instances[task._id].counter;
239236
}
240-
let taskToExecute = taskClone ?? task;
241237
let lastTaskInstance = this.getLastInstance(task);
242238
let terminalData = lastTaskInstance ? this.activeTasks[lastTaskInstance.getMapKey()] : undefined;
243239
if (terminalData && terminalData.promise && !validInstance) {
@@ -246,15 +242,15 @@ export class TerminalTaskSystem implements ITaskSystem {
246242
}
247243

248244
try {
249-
const executeResult = { kind: TaskExecuteKind.Started, task, started: {}, promise: this.executeTask(taskToExecute, resolver, trigger) };
245+
const executeResult = { kind: TaskExecuteKind.Started, task, started: {}, promise: this.executeTask(task, resolver, trigger) };
250246
executeResult.promise.then(summary => {
251247
this.lastTask = this.currentTask;
252248
});
253249
if (InMemoryTask.is(task) || !this.isTaskEmpty(task)) {
254-
if (!this.instances[commonKey]) {
255-
this.instances[commonKey] = new InstanceManager();
250+
if (!this.instances[task._id]) {
251+
this.instances[task._id] = new InstanceManager();
256252
}
257-
this.instances[commonKey].addInstance();
253+
this.instances[task._id].addInstance();
258254
}
259255
return executeResult;
260256
} catch (error) {
@@ -343,9 +339,8 @@ export class TerminalTaskSystem implements ITaskSystem {
343339

344340
public getLastInstance(task: Task): Task | undefined {
345341
let lastInstance = undefined;
346-
let commonId = task._id.split('|')[0];
347342
Object.keys(this.activeTasks).forEach((key) => {
348-
if (commonId === this.activeTasks[key].task._id.split('|')[0]) {
343+
if (task._id === this.activeTasks[key].task._id) {
349344
lastInstance = this.activeTasks[key].task;
350345
}
351346
});
@@ -369,11 +364,10 @@ export class TerminalTaskSystem implements ITaskSystem {
369364
}
370365

371366
private removeInstances(task: Task) {
372-
let commonKey = task._id.split('|')[0];
373-
if (this.instances[commonKey]) {
374-
this.instances[commonKey].removeInstance();
375-
if (this.instances[commonKey].instances === 0) {
376-
delete this.instances[commonKey];
367+
if (this.instances[task._id]) {
368+
this.instances[task._id].removeInstance();
369+
if (this.instances[task._id].instances === 0) {
370+
delete this.instances[task._id];
377371
}
378372
}
379373
}

src/vs/workbench/contrib/tasks/common/taskConfiguration.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2079,12 +2079,18 @@ class ConfigurationParser {
20792079
}
20802080
}
20812081

2082-
let uuidMaps: Map<string, UUIDMap> = new Map();
2083-
export function parse(workspaceFolder: IWorkspaceFolder, workspace: IWorkspace | undefined, platform: Platform, configuration: ExternalTaskRunnerConfiguration, logger: IProblemReporter, source: TaskConfigSource): ParseResult {
2084-
let uuidMap = uuidMaps.get(workspaceFolder.uri.toString());
2082+
let uuidMaps: Map<TaskConfigSource, Map<string, UUIDMap>> = new Map();
2083+
let recentUuidMaps: Map<string, UUIDMap> = new Map();
2084+
export function parse(workspaceFolder: IWorkspaceFolder, workspace: IWorkspace | undefined, platform: Platform, configuration: ExternalTaskRunnerConfiguration, logger: IProblemReporter, source: TaskConfigSource, isRecents: boolean = false): ParseResult {
2085+
let selectedUuidMaps = isRecents ? recentUuidMaps : uuidMaps.get(source);
2086+
if (!selectedUuidMaps) {
2087+
uuidMaps.set(source, new Map());
2088+
selectedUuidMaps = uuidMaps.get(source)!;
2089+
}
2090+
let uuidMap = selectedUuidMaps.get(workspaceFolder.uri.toString());
20852091
if (!uuidMap) {
20862092
uuidMap = new UUIDMap();
2087-
uuidMaps.set(workspaceFolder.uri.toString(), uuidMap);
2093+
selectedUuidMaps.set(workspaceFolder.uri.toString(), uuidMap);
20882094
}
20892095
try {
20902096
uuidMap.start();
@@ -2094,6 +2100,8 @@ export function parse(workspaceFolder: IWorkspaceFolder, workspace: IWorkspace |
20942100
}
20952101
}
20962102

2103+
2104+
20972105
export function createCustomTask(contributedTask: Tasks.ContributedTask, configuredProps: Tasks.ConfiguringTask | Tasks.CustomTask): Tasks.CustomTask {
20982106
return CustomTask.createCustomTask(contributedTask, configuredProps);
20992107
}

src/vs/workbench/contrib/tasks/common/tasks.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,8 @@ export class CustomTask extends CommonTask {
652652

653653
type!: '$customized'; // CUSTOMIZED_TASK_TYPE
654654

655+
instance: number | undefined;
656+
655657
/**
656658
* Indicated the source of the task (e.g. tasks.json or extension)
657659
*/
@@ -810,6 +812,8 @@ export class ContributedTask extends CommonTask {
810812
*/
811813
_source!: ExtensionTaskSource;
812814

815+
instance: number | undefined;
816+
813817
defines: KeyedTaskIdentifier;
814818

815819
hasDefinedMatchers: boolean;
@@ -877,6 +881,8 @@ export class InMemoryTask extends CommonTask {
877881
*/
878882
_source: InMemoryTaskSource;
879883

884+
instance: number | undefined;
885+
880886
type!: 'inMemory';
881887

882888
public constructor(id: string, source: InMemoryTaskSource, label: string, type: string,

0 commit comments

Comments
 (0)