mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-09 17:52:34 -05:00
Merge from vscode 79a1f5a5ca0c6c53db617aa1fa5a2396d2caebe2
This commit is contained in:
@@ -11,7 +11,7 @@ import * as json from 'vs/base/common/json';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { IStringDictionary } from 'vs/base/common/collections';
|
||||
import { Action } from 'vs/base/common/actions';
|
||||
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
|
||||
import { IDisposable, Disposable, IReference } from 'vs/base/common/lifecycle';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import * as Types from 'vs/base/common/types';
|
||||
import { TerminateResponseCode } from 'vs/base/common/processes';
|
||||
@@ -19,7 +19,7 @@ import * as strings from 'vs/base/common/strings';
|
||||
import { ValidationStatus, ValidationState } from 'vs/base/common/parsers';
|
||||
import * as UUID from 'vs/base/common/uuid';
|
||||
import * as Platform from 'vs/base/common/platform';
|
||||
import { LRUCache } from 'vs/base/common/map';
|
||||
import { LRUCache, Touch } from 'vs/base/common/map';
|
||||
|
||||
import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
|
||||
import { IMarkerService } from 'vs/platform/markers/common/markers';
|
||||
@@ -72,9 +72,9 @@ import { RunAutomaticTasks } from 'vs/workbench/contrib/tasks/browser/runAutomat
|
||||
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
|
||||
import { IPathService } from 'vs/workbench/services/path/common/pathService';
|
||||
import { format } from 'vs/base/common/jsonFormatter';
|
||||
import { ITextModelService } from 'vs/editor/common/services/resolverService';
|
||||
import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService';
|
||||
import { applyEdits } from 'vs/base/common/jsonEdit';
|
||||
import { ITextEditorPane, SaveReason } from 'vs/workbench/common/editor';
|
||||
import { SaveReason } from 'vs/workbench/common/editor';
|
||||
import { ITextEditorSelection, TextEditorSelectionRevealType } from 'vs/platform/editor/common/editor';
|
||||
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
|
||||
import { find } from 'vs/base/common/arrays';
|
||||
@@ -715,9 +715,10 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
const folderToTasksMap: Map<string, any> = new Map();
|
||||
const recentlyUsedTasks = this.getRecentlyUsedTasks();
|
||||
const tasks: (Task | ConfiguringTask)[] = [];
|
||||
for (const key of recentlyUsedTasks.keys()) {
|
||||
for (const entry of recentlyUsedTasks.entries()) {
|
||||
const key = entry[0];
|
||||
const task = JSON.parse(entry[1]);
|
||||
const folder = this.getFolderFromTaskKey(key);
|
||||
const task = JSON.parse(recentlyUsedTasks.get(key)!);
|
||||
if (folder && !folderToTasksMap.has(folder)) {
|
||||
folderToTasksMap.set(folder, []);
|
||||
}
|
||||
@@ -791,13 +792,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
if (quickOpenHistoryLimit === 0) {
|
||||
return;
|
||||
}
|
||||
let keys = this._recentlyUsedTasks.keys();
|
||||
let keys = [...this._recentlyUsedTasks.keys()];
|
||||
if (keys.length > quickOpenHistoryLimit) {
|
||||
keys = keys.slice(0, quickOpenHistoryLimit);
|
||||
}
|
||||
const keyValues: [string, string][] = [];
|
||||
for (const key of keys) {
|
||||
keyValues.push([key, this._recentlyUsedTasks.get(key)!]);
|
||||
keyValues.push([key, this._recentlyUsedTasks.get(key, Touch.None)!]);
|
||||
}
|
||||
this.storageService.store(AbstractTaskService.RecentlyUsedTasks_KeyV2, JSON.stringify(keyValues), StorageScope.WORKSPACE);
|
||||
}
|
||||
@@ -1050,14 +1051,14 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
return false;
|
||||
}
|
||||
|
||||
private openEditorAtTask(resource: URI | undefined, task: TaskConfig.CustomTask | TaskConfig.ConfiguringTask | string | undefined): Promise<ITextEditorPane | null | undefined> {
|
||||
private openEditorAtTask(resource: URI | undefined, task: TaskConfig.CustomTask | TaskConfig.ConfiguringTask | string | undefined): Promise<boolean> {
|
||||
if (resource === undefined) {
|
||||
return Promise.resolve(undefined);
|
||||
return Promise.resolve(false);
|
||||
}
|
||||
let selection: ITextEditorSelection | undefined;
|
||||
return this.fileService.readFile(resource).then(content => content.value).then(async content => {
|
||||
if (!content) {
|
||||
return undefined;
|
||||
return false;
|
||||
}
|
||||
if (task) {
|
||||
const contentValue = content.toString();
|
||||
@@ -1065,15 +1066,23 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
if (typeof task === 'string') {
|
||||
stringValue = task;
|
||||
} else {
|
||||
const model = (await this.textModelResolverService.createModelReference(resource)).object.textEditorModel;
|
||||
const { tabSize, insertSpaces } = model.getOptions();
|
||||
const eol = model.getEOL();
|
||||
const edits = format(JSON.stringify(task), undefined, { eol, tabSize, insertSpaces });
|
||||
let stringified = applyEdits(JSON.stringify(task), edits);
|
||||
const regex = new RegExp(eol + '\\t', 'g');
|
||||
stringified = stringified.replace(regex, eol + '\t\t\t');
|
||||
const twoTabs = '\t\t';
|
||||
stringValue = twoTabs + stringified.slice(0, stringified.length - 1) + twoTabs + stringified.slice(stringified.length - 1);
|
||||
let reference: IReference<IResolvedTextEditorModel> | undefined;
|
||||
try {
|
||||
reference = await this.textModelResolverService.createModelReference(resource);
|
||||
const model = reference.object.textEditorModel;
|
||||
const { tabSize, insertSpaces } = model.getOptions();
|
||||
const eol = model.getEOL();
|
||||
const edits = format(JSON.stringify(task), undefined, { eol, tabSize, insertSpaces });
|
||||
let stringified = applyEdits(JSON.stringify(task), edits);
|
||||
const regex = new RegExp(eol + '\\t', 'g');
|
||||
stringified = stringified.replace(regex, eol + '\t\t\t');
|
||||
const twoTabs = '\t\t';
|
||||
stringValue = twoTabs + stringified.slice(0, stringified.length - 1) + twoTabs + stringified.slice(stringified.length - 1);
|
||||
} finally {
|
||||
if (reference) {
|
||||
reference.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const index = contentValue.indexOf(stringValue);
|
||||
@@ -1100,13 +1109,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
selection,
|
||||
selectionRevealType: TextEditorSelectionRevealType.CenterIfOutsideViewport
|
||||
}
|
||||
});
|
||||
}).then(() => !!selection);
|
||||
});
|
||||
}
|
||||
|
||||
private createCustomizableTask(task: ContributedTask | CustomTask): TaskConfig.CustomTask | TaskConfig.ConfiguringTask | undefined {
|
||||
private createCustomizableTask(task: ContributedTask | CustomTask | ConfiguringTask): TaskConfig.CustomTask | TaskConfig.ConfiguringTask | undefined {
|
||||
let toCustomize: TaskConfig.CustomTask | TaskConfig.ConfiguringTask | undefined;
|
||||
let taskConfig = CustomTask.is(task) ? task._source.config : undefined;
|
||||
let taskConfig = CustomTask.is(task) || ConfiguringTask.is(task) ? task._source.config : undefined;
|
||||
if (taskConfig && taskConfig.element) {
|
||||
toCustomize = { ...(taskConfig.element) };
|
||||
} else if (ContributedTask.is(task)) {
|
||||
@@ -1137,7 +1146,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
return toCustomize;
|
||||
}
|
||||
|
||||
public customize(task: ContributedTask | CustomTask, properties?: CustomizationProperties, openConfig?: boolean): Promise<void> {
|
||||
public customize(task: ContributedTask | CustomTask | ConfiguringTask, properties?: CustomizationProperties, openConfig?: boolean): Promise<void> {
|
||||
const workspaceFolder = task.getWorkspaceFolder();
|
||||
if (!workspaceFolder) {
|
||||
return Promise.resolve(undefined);
|
||||
@@ -1271,14 +1280,14 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
}
|
||||
}
|
||||
|
||||
public openConfig(task: CustomTask | ConfiguringTask | undefined): Promise<void> {
|
||||
public openConfig(task: CustomTask | ConfiguringTask | undefined): Promise<boolean> {
|
||||
let resource: URI | undefined;
|
||||
if (task) {
|
||||
resource = this.getResourceForTask(task);
|
||||
} else {
|
||||
resource = (this._workspaceFolders && (this._workspaceFolders.length > 0)) ? this._workspaceFolders[0].toResource('.vscode/tasks.json') : undefined;
|
||||
}
|
||||
return this.openEditorAtTask(resource, task ? task._label : undefined).then(() => undefined);
|
||||
return this.openEditorAtTask(resource, task ? task._label : undefined);
|
||||
}
|
||||
|
||||
private createRunnableTask(tasks: TaskMap, group: TaskGroup): { task: Task; resolver: ITaskResolver } | undefined {
|
||||
@@ -2325,7 +2334,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
taskMap[key] = task;
|
||||
}
|
||||
});
|
||||
const reversed = recentlyUsedTasks.keys().reverse();
|
||||
const reversed = [...recentlyUsedTasks.keys()].reverse();
|
||||
for (const key in reversed) {
|
||||
let task = taskMap[key];
|
||||
if (task) {
|
||||
@@ -2364,10 +2373,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
if (identifier !== undefined) {
|
||||
this.getGroupedTasks().then(async (grouped) => {
|
||||
let resolver = this.createResolver(grouped);
|
||||
let folders: (IWorkspaceFolder | string)[] = this.contextService.getWorkspace().folders;
|
||||
folders = folders.concat([USER_TASKS_GROUP_KEY]);
|
||||
for (let folder of folders) {
|
||||
let task = await resolver.resolve(typeof folder === 'string' ? folder : folder.uri, identifier);
|
||||
let folderURIs: (URI | string)[] = this.contextService.getWorkspace().folders.map(folder => folder.uri);
|
||||
if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) {
|
||||
folderURIs.push(this.contextService.getWorkspace().configuration!);
|
||||
}
|
||||
folderURIs.push(USER_TASKS_GROUP_KEY);
|
||||
for (let uri of folderURIs) {
|
||||
let task = await resolver.resolve(uri, identifier);
|
||||
if (task) {
|
||||
this.run(task).then(undefined, reason => {
|
||||
// eat the error, it has already been surfaced to the user and we don't care about it here
|
||||
@@ -2503,38 +2515,58 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
|
||||
location: ProgressLocation.Window,
|
||||
title: nls.localize('TaskService.fetchingBuildTasks', 'Fetching build tasks...')
|
||||
};
|
||||
let promise = this.getTasksForGroup(TaskGroup.Build).then((tasks) => {
|
||||
if (tasks.length > 0) {
|
||||
let { defaults, users } = this.splitPerGroupType(tasks);
|
||||
if (defaults.length === 1) {
|
||||
this.run(defaults[0]).then(undefined, reason => {
|
||||
// eat the error, it has already been surfaced to the user and we don't care about it here
|
||||
});
|
||||
return;
|
||||
} else if (defaults.length + users.length > 0) {
|
||||
tasks = defaults.concat(users);
|
||||
let promise = this.getWorkspaceTasks().then(tasks => {
|
||||
const buildTasks: ConfiguringTask[] = [];
|
||||
for (const taskSource of tasks) {
|
||||
for (const task in taskSource[1].configurations?.byIdentifier) {
|
||||
if ((taskSource[1].configurations?.byIdentifier[task].configurationProperties.group === TaskGroup.Build) &&
|
||||
(taskSource[1].configurations?.byIdentifier[task].configurationProperties.groupType === GroupType.default)) {
|
||||
buildTasks.push(taskSource[1].configurations.byIdentifier[task]);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.showIgnoredFoldersMessage().then(() => {
|
||||
this.showQuickPick(tasks,
|
||||
nls.localize('TaskService.pickBuildTask', 'Select the build task to run'),
|
||||
{
|
||||
label: nls.localize('TaskService.noBuildTask', 'No build task to run found. Configure Build Task...'),
|
||||
task: null
|
||||
},
|
||||
true).then((entry) => {
|
||||
let task: Task | undefined | null = entry ? entry.task : undefined;
|
||||
if (task === undefined) {
|
||||
return;
|
||||
}
|
||||
if (task === null) {
|
||||
this.runConfigureDefaultBuildTask();
|
||||
return;
|
||||
}
|
||||
this.run(task, { attachProblemMatcher: true }).then(undefined, reason => {
|
||||
if (buildTasks.length === 1) {
|
||||
this.tryResolveTask(buildTasks[0]).then(resolvedTask => {
|
||||
this.run(resolvedTask).then(undefined, reason => {
|
||||
// eat the error, it has already been surfaced to the user and we don't care about it here
|
||||
});
|
||||
});
|
||||
return undefined; // {{SQL CARBON EDIT}} strict-null-check
|
||||
}
|
||||
|
||||
return this.getTasksForGroup(TaskGroup.Build).then((tasks) => {
|
||||
if (tasks.length > 0) {
|
||||
let { defaults, users } = this.splitPerGroupType(tasks);
|
||||
if (defaults.length === 1) {
|
||||
this.run(defaults[0]).then(undefined, reason => {
|
||||
// eat the error, it has already been surfaced to the user and we don't care about it here
|
||||
});
|
||||
});
|
||||
return;
|
||||
} else if (defaults.length + users.length > 0) {
|
||||
tasks = defaults.concat(users);
|
||||
}
|
||||
}
|
||||
this.showIgnoredFoldersMessage().then(() => {
|
||||
this.showQuickPick(tasks,
|
||||
nls.localize('TaskService.pickBuildTask', 'Select the build task to run'),
|
||||
{
|
||||
label: nls.localize('TaskService.noBuildTask', 'No build task to run found. Configure Build Task...'),
|
||||
task: null
|
||||
},
|
||||
true).then((entry) => {
|
||||
let task: Task | undefined | null = entry ? entry.task : undefined;
|
||||
if (task === undefined) {
|
||||
return;
|
||||
}
|
||||
if (task === null) {
|
||||
this.runConfigureDefaultBuildTask();
|
||||
return;
|
||||
}
|
||||
this.run(task, { attachProblemMatcher: true }).then(undefined, reason => {
|
||||
// eat the error, it has already been surfaced to the user and we don't care about it here
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
this.progressService.withProgress(options, () => promise);
|
||||
|
||||
Reference in New Issue
Block a user