mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Merge from vscode 27ada910e121e23a6d95ecca9cae595fb98ab568
This commit is contained in:
@@ -84,6 +84,7 @@ import { isWorkspaceFolder, TaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, TaskQui
|
||||
|
||||
const QUICKOPEN_HISTORY_LIMIT_CONFIG = 'task.quickOpen.history';
|
||||
const PROBLEM_MATCHER_NEVER_CONFIG = 'task.problemMatchers.neverPrompt';
|
||||
const USE_SLOW_PICKER = 'task.quickOpen.showAll';
|
||||
|
||||
export namespace ConfigureTaskAction {
|
||||
export const ID = 'workbench.action.tasks.configureTaskRunner';
|
||||
@@ -599,7 +600,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
let result: Task[] = [];
|
||||
map.forEach((tasks) => {
|
||||
for (let task of tasks) {
|
||||
if (ContributedTask.is(task) && task.defines.type === filter.type) {
|
||||
if (ContributedTask.is(task) && ((task.defines.type === filter.type) || (task._source.label === filter.type))) {
|
||||
result.push(task);
|
||||
} else if (CustomTask.is(task)) {
|
||||
if (task.type === filter.type) {
|
||||
@@ -1402,12 +1403,52 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
|
||||
private executeTask(task: Task, resolver: ITaskResolver): Promise<ITaskSummary> {
|
||||
return ProblemMatcherRegistry.onReady().then(() => {
|
||||
return this.editorService.saveAll().then(() => { // make sure all dirty editors are saved
|
||||
enum SaveBeforeRunConfigOptions {
|
||||
Always = 'always',
|
||||
Never = 'never',
|
||||
Prompt = 'prompt'
|
||||
}
|
||||
|
||||
const saveBeforeRunTaskConfig: SaveBeforeRunConfigOptions = this.configurationService.getValue('task.saveBeforeRun');
|
||||
|
||||
const execTask = async (task: Task, resolver: ITaskResolver): Promise<ITaskSummary> => {
|
||||
return ProblemMatcherRegistry.onReady().then(() => {
|
||||
let executeResult = this.getTaskSystem().run(task, resolver);
|
||||
return this.handleExecuteResult(executeResult);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const saveAllEditorsAndExecTask = async (task: Task, resolver: ITaskResolver): Promise<ITaskSummary> => {
|
||||
return this.editorService.saveAll().then(() => {
|
||||
return execTask(task, resolver);
|
||||
});
|
||||
};
|
||||
|
||||
const promptAsk = async (task: Task, resolver: ITaskResolver): Promise<ITaskSummary> => {
|
||||
const dialogOptions = await this.dialogService.show(
|
||||
Severity.Info,
|
||||
nls.localize('TaskSystem.saveBeforeRun.prompt.title', 'Save all editors?'),
|
||||
[nls.localize('saveBeforeRun.save', 'Save'), nls.localize('saveBeforeRun.dontSave', 'Don\'t save')],
|
||||
{
|
||||
detail: nls.localize('detail', "Do you want to save all editors before running the task?"),
|
||||
cancelId: 1
|
||||
}
|
||||
);
|
||||
|
||||
if (dialogOptions.choice === 0) {
|
||||
return saveAllEditorsAndExecTask(task, resolver);
|
||||
} else {
|
||||
return execTask(task, resolver);
|
||||
}
|
||||
};
|
||||
|
||||
if (saveBeforeRunTaskConfig === SaveBeforeRunConfigOptions.Never) {
|
||||
return execTask(task, resolver);
|
||||
} else if (saveBeforeRunTaskConfig === SaveBeforeRunConfigOptions.Prompt) {
|
||||
return promptAsk(task, resolver);
|
||||
} else {
|
||||
return saveAllEditorsAndExecTask(task, resolver);
|
||||
}
|
||||
}
|
||||
|
||||
private async handleExecuteResult(executeResult: ITaskExecuteResult): Promise<ITaskSummary> {
|
||||
@@ -1533,7 +1574,17 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
for (const [handle, provider] of this._providers) {
|
||||
if ((type === undefined) || (type === this._providerTypes.get(handle))) {
|
||||
counter++;
|
||||
provider.provideTasks(validTypes).then(done, error);
|
||||
provider.provideTasks(validTypes).then((taskSet: TaskSet) => {
|
||||
// Check that the tasks provided are of the correct type
|
||||
for (const task of taskSet.tasks) {
|
||||
if (task.type !== this._providerTypes.get(handle)) {
|
||||
this._outputChannel.append(nls.localize('unexpectedTaskType', "The task provider for \"{0}\" tasks unexpectedly provided a task of type \"{1}\".\n", this._providerTypes.get(handle), task.type));
|
||||
this.showOutput();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return done(taskSet);
|
||||
}, error);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -2088,7 +2139,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
return this.configurationService.getValue<boolean>(QUICKOPEN_DETAIL_CONFIG);
|
||||
}
|
||||
|
||||
private createTaskQuickPickEntries(tasks: Task[], group: boolean = false, sort: boolean = false, selectedEntry?: TaskQuickPickEntry, includeRecents: boolean = true): TaskQuickPickEntry[] {
|
||||
private async createTaskQuickPickEntries(tasks: Task[], group: boolean = false, sort: boolean = false, selectedEntry?: TaskQuickPickEntry, includeRecents: boolean = true): Promise<TaskQuickPickEntry[]> {
|
||||
let count: { [key: string]: number; } = {};
|
||||
if (tasks === undefined || tasks === null || tasks.length === 0) {
|
||||
return [];
|
||||
@@ -2124,26 +2175,31 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
if (tasks.length === 1) {
|
||||
entries.push(TaskQuickPickEntry(tasks[0]));
|
||||
} else {
|
||||
let recentlyUsedTasks = this.getRecentlyUsedTasks();
|
||||
let recentlyUsedTasks = await this.readRecentTasks();
|
||||
let recent: Task[] = [];
|
||||
let recentSet: Set<string> = new Set();
|
||||
let configured: Task[] = [];
|
||||
let detected: Task[] = [];
|
||||
let taskMap: IStringDictionary<Task> = Object.create(null);
|
||||
tasks.forEach(task => {
|
||||
let key = task.getRecentlyUsedKey();
|
||||
let key = task.getCommonTaskId();
|
||||
if (key) {
|
||||
taskMap[key] = task;
|
||||
}
|
||||
});
|
||||
recentlyUsedTasks.keys().reverse().forEach(key => {
|
||||
let task = taskMap[key];
|
||||
if (task) {
|
||||
recent.push(task);
|
||||
recentlyUsedTasks.reverse().forEach(recentTask => {
|
||||
const key = recentTask.getCommonTaskId();
|
||||
if (key) {
|
||||
recentSet.add(key);
|
||||
let task = taskMap[key];
|
||||
if (task) {
|
||||
recent.push(task);
|
||||
}
|
||||
}
|
||||
});
|
||||
for (let task of tasks) {
|
||||
let key = task.getRecentlyUsedKey();
|
||||
if (!key || !recentlyUsedTasks.has(key)) {
|
||||
let key = task.getCommonTaskId();
|
||||
if (!key || !recentSet.has(key)) {
|
||||
if ((task._source.kind === TaskSourceKind.Workspace) || (task._source.kind === TaskSourceKind.User)) {
|
||||
configured.push(task);
|
||||
} else {
|
||||
@@ -2172,7 +2228,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
|
||||
private async showTwoLevelQuickPick(placeHolder: string, defaultEntry?: TaskQuickPickEntry) {
|
||||
return TaskQuickPick.show(this, this.configurationService, this.quickInputService, placeHolder, defaultEntry);
|
||||
return TaskQuickPick.show(this, this.configurationService, this.quickInputService, this.notificationService, placeHolder, defaultEntry);
|
||||
}
|
||||
|
||||
private async showQuickPick(tasks: Promise<Task[]> | Task[], placeHolder: string, defaultEntry?: TaskQuickPickEntry, group: boolean = false, sort: boolean = false, selectedEntry?: TaskQuickPickEntry, additionalEntries?: TaskQuickPickEntry[]): Promise<TaskQuickPickEntry | undefined | null> {
|
||||
@@ -2215,7 +2271,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
const picker: IQuickPick<TaskQuickPickEntry> = this.quickInputService.createQuickPick();
|
||||
picker.placeholder = placeHolder;
|
||||
picker.matchOnDescription = true;
|
||||
picker.ignoreFocusOut = true;
|
||||
|
||||
picker.onDidTriggerItemButton(context => {
|
||||
let task = context.item.task;
|
||||
@@ -2327,26 +2382,76 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
}
|
||||
|
||||
private tasksAndGroupedTasks(filter?: TaskFilter): { tasks: Promise<Task[]>, grouped: Promise<TaskMap> } {
|
||||
if (!this.versionAndEngineCompatible(filter)) {
|
||||
return { tasks: Promise.resolve<Task[]>([]), grouped: Promise.resolve(new TaskMap()) };
|
||||
}
|
||||
const grouped = this.getGroupedTasks(filter ? filter.type : undefined);
|
||||
const tasks = grouped.then((map) => {
|
||||
if (!filter || !filter.type) {
|
||||
return map.all();
|
||||
}
|
||||
let result: Task[] = [];
|
||||
map.forEach((tasks) => {
|
||||
for (let task of tasks) {
|
||||
if (ContributedTask.is(task) && task.defines.type === filter.type) {
|
||||
result.push(task);
|
||||
} else if (CustomTask.is(task)) {
|
||||
if (task.type === filter.type) {
|
||||
result.push(task);
|
||||
} else {
|
||||
let customizes = task.customizes();
|
||||
if (customizes && customizes.type === filter.type) {
|
||||
result.push(task);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
return result;
|
||||
});
|
||||
return { tasks, grouped };
|
||||
}
|
||||
|
||||
private doRunTaskCommand(tasks?: Task[]): void {
|
||||
this.showIgnoredFoldersMessage().then(() => {
|
||||
this.showTwoLevelQuickPick(
|
||||
nls.localize('TaskService.pickRunTask', 'Select the task to run'),
|
||||
{
|
||||
label: nls.localize('TaskService.noEntryToRun', 'No configured tasks. Configure Tasks...'),
|
||||
task: null
|
||||
}).
|
||||
then((task) => {
|
||||
if (task === undefined) {
|
||||
return;
|
||||
}
|
||||
if (task === null) {
|
||||
this.runConfigureTasks();
|
||||
} else {
|
||||
this.run(task, { attachProblemMatcher: true }, TaskRunSource.User).then(undefined, reason => {
|
||||
// eat the error, it has already been surfaced to the user and we don't care about it here
|
||||
});
|
||||
}
|
||||
const pickThen = (task: Task | undefined | null) => {
|
||||
if (task === undefined) {
|
||||
return;
|
||||
}
|
||||
if (task === null) {
|
||||
this.runConfigureTasks();
|
||||
} else {
|
||||
this.run(task, { attachProblemMatcher: true }, TaskRunSource.User).then(undefined, reason => {
|
||||
// eat the error, it has already been surfaced to the user and we don't care about it here
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const placeholder = nls.localize('TaskService.pickRunTask', 'Select the task to run');
|
||||
|
||||
this.showIgnoredFoldersMessage().then(() => {
|
||||
if (this.configurationService.getValue(USE_SLOW_PICKER)) {
|
||||
let taskResult: { tasks: Promise<Task[]>, grouped: Promise<TaskMap> } | undefined = undefined;
|
||||
if (!tasks) {
|
||||
taskResult = this.tasksAndGroupedTasks();
|
||||
}
|
||||
this.showQuickPick(tasks ? tasks : taskResult!.tasks, placeholder,
|
||||
{
|
||||
label: nls.localize('TaskService.noEntryToRunSlow', 'No task to run found. Configure Tasks...'),
|
||||
task: null
|
||||
},
|
||||
true).
|
||||
then((entry) => {
|
||||
return pickThen(entry ? entry.task : undefined);
|
||||
});
|
||||
} else {
|
||||
this.showTwoLevelQuickPick(placeholder,
|
||||
{
|
||||
label: nls.localize('TaskService.noEntryToRun', 'No configured tasks. Configure Tasks...'),
|
||||
task: null
|
||||
}).
|
||||
then(pickThen);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user