Skip to content

Commit 2720a80

Browse files
committed
Allow user tasks to run when no folder is open
1 parent 07f0bad commit 2720a80

File tree

1 file changed

+46
-72
lines changed

1 file changed

+46
-72
lines changed

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

Lines changed: 46 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
4040
import Constants from 'vs/workbench/contrib/markers/browser/constants';
4141
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
4242
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
43-
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder, IWorkspace } from 'vs/platform/workspace/common/workspace';
43+
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder, IWorkspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace';
4444

4545
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
4646
import { IOutputService, IOutputChannel } from 'vs/workbench/contrib/output/common/output';
@@ -1702,7 +1702,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
17021702
return;
17031703
}
17041704

1705-
if (!contributed) {
1705+
if (contributed.length === 0) {
17061706
result.add(key, ...folderTasks.set.tasks);
17071707
} else {
17081708
let configurations = folderTasks.configurations;
@@ -1867,31 +1867,35 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
18671867
protected abstract updateWorkspaceTasks(runSource: TaskRunSource | void): void;
18681868

18691869
protected computeWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): Promise<Map<string, WorkspaceFolderTaskResult>> {
1870-
if (this.workspaceFolders.length === 0) {
1871-
return Promise.resolve(new Map<string, WorkspaceFolderTaskResult>());
1872-
} else {
1873-
let promises: Promise<WorkspaceFolderTaskResult | undefined>[] = [];
1874-
for (let folder of this.workspaceFolders) {
1875-
promises.push(this.computeWorkspaceFolderTasks(folder, runSource).then((value) => value, () => undefined));
1876-
}
1877-
return Promise.all(promises).then(async (values) => {
1878-
let result = new Map<string, WorkspaceFolderTaskResult>();
1879-
for (let value of values) {
1880-
if (value) {
1881-
result.set(value.workspaceFolder.uri.toString(), value);
1882-
}
1883-
}
1884-
const userTasks = await this.computeUserTasks(this.workspaceFolders[0], runSource).then((value) => value, () => undefined);
1885-
if (userTasks) {
1886-
result.set(USER_TASKS_GROUP_KEY, userTasks);
1870+
let promises: Promise<WorkspaceFolderTaskResult | undefined>[] = [];
1871+
for (let folder of this.workspaceFolders) {
1872+
promises.push(this.computeWorkspaceFolderTasks(folder, runSource).then((value) => value, () => undefined));
1873+
}
1874+
return Promise.all(promises).then(async (values) => {
1875+
let result = new Map<string, WorkspaceFolderTaskResult>();
1876+
for (let value of values) {
1877+
if (value) {
1878+
result.set(value.workspaceFolder.uri.toString(), value);
18871879
}
1888-
const workspaceFileTasks = await this.computeWorkspaceFileTasks(this.workspaceFolders[0], runSource).then((value) => value, () => undefined);
1880+
}
1881+
let folder = this.workspaceFolders.length > 0 ? this.workspaceFolders[0] : undefined;
1882+
if (!folder) {
1883+
const userhome = await this.pathService.userHome();
1884+
folder = new WorkspaceFolder({ uri: userhome, name: resources.basename(userhome), index: 0 });
1885+
}
1886+
const userTasks = await this.computeUserTasks(folder, runSource).then((value) => value, () => undefined);
1887+
if (userTasks) {
1888+
result.set(USER_TASKS_GROUP_KEY, userTasks);
1889+
}
1890+
1891+
if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
1892+
const workspaceFileTasks = await this.computeWorkspaceFileTasks(folder, runSource).then((value) => value, () => undefined);
18891893
if (workspaceFileTasks && this._workspace && this._workspace.configuration) {
18901894
result.set(this._workspace.configuration.toString(), workspaceFileTasks);
18911895
}
1892-
return result;
1893-
});
1894-
}
1896+
}
1897+
return result;
1898+
});
18951899
}
18961900

18971901
private get jsonTasksSupported(): boolean {
@@ -2167,17 +2171,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
21672171
}
21682172

21692173
private canRunCommand(): boolean {
2170-
if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) {
2171-
this.notificationService.prompt(
2172-
Severity.Info,
2173-
nls.localize('TaskService.noWorkspace', "Tasks are only available on a workspace folder."),
2174-
[{
2175-
label: nls.localize('TaskService.learnMore', "Learn More"),
2176-
run: () => this.openerService.open(URI.parse('https://code.visualstudio.com/docs/editor/tasks'))
2177-
}]
2178-
);
2179-
return false;
2180-
}
21812174
return true;
21822175
}
21832176

@@ -2871,8 +2864,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
28712864
}
28722865
if (this.isTaskEntry(selection)) {
28732866
this.configureTask(selection.task);
2874-
} else {
2867+
} else if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
28752868
this.openTaskFile(selection.folder.toResource('.vscode/tasks.json'), TaskSourceKind.Workspace);
2869+
} else {
2870+
const resource = this.getResourceForKind(TaskSourceKind.User);
2871+
if (resource) {
2872+
this.openTaskFile(resource, TaskSourceKind.User);
2873+
}
28762874
}
28772875
}
28782876

@@ -2914,46 +2912,22 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
29142912
return taskPromise.then((taskMap) => {
29152913
let entries: QuickPickInput<TaskQuickPickEntryType>[] = [];
29162914
let needsCreateOrOpen: boolean = true;
2917-
if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
2918-
let tasks = taskMap.all();
2919-
if (tasks.length > 0) {
2920-
tasks = tasks.sort((a, b) => a._label.localeCompare(b._label));
2921-
for (let task of tasks) {
2922-
entries.push({ label: task._label, task, description: this.getTaskDescription(task), detail: this.showDetail() ? task.configurationProperties.detail : undefined });
2923-
if (!ContributedTask.is(task)) {
2924-
needsCreateOrOpen = false;
2925-
}
2926-
}
2927-
}
2928-
if (needsCreateOrOpen) {
2929-
let label = stats[0] !== undefined ? openLabel : createLabel;
2930-
if (entries.length) {
2931-
entries.push({ type: 'separator' });
2915+
let tasks = taskMap.all();
2916+
if (tasks.length > 0) {
2917+
tasks = tasks.sort((a, b) => a._label.localeCompare(b._label));
2918+
for (let task of tasks) {
2919+
entries.push({ label: task._label, task, description: this.getTaskDescription(task), detail: this.showDetail() ? task.configurationProperties.detail : undefined });
2920+
if (!ContributedTask.is(task)) {
2921+
needsCreateOrOpen = false;
29322922
}
2933-
entries.push({ label, folder: this.contextService.getWorkspace().folders[0] });
29342923
}
2935-
} else {
2936-
let folders = this.contextService.getWorkspace().folders;
2937-
let index = 0;
2938-
for (let folder of folders) {
2939-
let tasks = taskMap.get(folder);
2940-
if (tasks.length > 0) {
2941-
tasks = tasks.slice().sort((a, b) => a._label.localeCompare(b._label));
2942-
for (let i = 0; i < tasks.length; i++) {
2943-
let entry: TaskQuickPickEntryType = { label: tasks[i]._label, task: tasks[i], description: this.getTaskDescription(tasks[i]) };
2944-
if (i === 0) {
2945-
entries.push({ type: 'separator', label: folder.name });
2946-
}
2947-
entries.push(entry);
2948-
}
2949-
} else {
2950-
let label = stats[index] !== undefined ? openLabel : createLabel;
2951-
let entry: TaskQuickPickEntryType = { label, folder: folder };
2952-
entries.push({ type: 'separator', label: folder.name });
2953-
entries.push(entry);
2954-
}
2955-
index++;
2924+
}
2925+
if (needsCreateOrOpen) {
2926+
let label = stats[0] !== undefined ? openLabel : createLabel;
2927+
if (entries.length) {
2928+
entries.push({ type: 'separator' });
29562929
}
2930+
entries.push({ label, folder: this.contextService.getWorkspace().folders[0] });
29572931
}
29582932
if ((entries.length === 1) && !needsCreateOrOpen) {
29592933
tokenSource.cancel();

0 commit comments

Comments
 (0)