Merge from vscode 2c306f762bf9c3db82dc06c7afaa56ef46d72f79 (#14050)

* Merge from vscode 2c306f762bf9c3db82dc06c7afaa56ef46d72f79

* Fix breaks

* Extension management fixes

* Fix breaks in windows bundling

* Fix/skip failing tests

* Update distro

* Add clear to nuget.config

* Add hygiene task

* Bump distro

* Fix hygiene issue

* Add build to hygiene exclusion

* Update distro

* Update hygiene

* Hygiene exclusions

* Update tsconfig

* Bump distro for server breaks

* Update build config

* Update darwin path

* Add done calls to notebook tests

* Skip failing tests

* Disable smoke tests
This commit is contained in:
Karl Burtram
2021-02-09 16:15:05 -08:00
committed by GitHub
parent 6f192f9af5
commit ce612a3d96
1929 changed files with 68012 additions and 34564 deletions

View File

@@ -19,8 +19,6 @@ 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, Touch } from 'vs/base/common/map';
import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
import { IMarkerService } from 'vs/platform/markers/common/markers';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
@@ -28,13 +26,13 @@ import { IFileService, IFileStat } from 'vs/platform/files/common/files';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands';
import { ProblemMatcherRegistry, NamedProblemMatcher } from 'vs/workbench/contrib/tasks/common/problemMatcher';
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage';
import { IProgressService, IProgressOptions, ProgressLocation } from 'vs/platform/progress/common/progress';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { IHostService } from 'vs/workbench/services/host/browser/host';
import { INotificationService } from 'vs/platform/notification/common/notification';
import { IDialogService, IConfirmationResult } from 'vs/platform/dialogs/common/dialogs';
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
import { IModelService } from 'vs/editor/common/services/modelService';
@@ -42,7 +40,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
import Constants from 'vs/workbench/contrib/markers/browser/constants';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder, IWorkspace } from 'vs/platform/workspace/common/workspace';
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder, IWorkspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { IOutputService, IOutputChannel } from 'vs/workbench/contrib/output/common/output';
@@ -78,9 +76,10 @@ import { ITextEditorSelection, TextEditorSelectionRevealType } from 'vs/platform
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
import { IViewsService, IViewDescriptorService } from 'vs/workbench/common/views';
import { isWorkspaceFolder, TaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, TaskQuickPick, QUICKOPEN_SKIP_CONFIG } from 'vs/workbench/contrib/tasks/browser/taskQuickPick';
import { isWorkspaceFolder, TaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, TaskQuickPick, QUICKOPEN_SKIP_CONFIG, configureTaskIcon } from 'vs/workbench/contrib/tasks/browser/taskQuickPick';
import { ILogService } from 'vs/platform/log/common/log';
import { once } from 'vs/base/common/functional';
import { ThemeIcon } from 'vs/platform/theme/common/themeService';
// {{ SQL CARBON EDIT }}
// integration with tasks view panel
@@ -219,7 +218,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
protected _taskSystemInfos: Map<string, TaskSystemInfo>;
protected _workspaceTasksPromise?: Promise<Map<string, WorkspaceFolderTaskResult>>;
protected _areJsonTasksSupportedPromise: Promise<boolean> = Promise.resolve(false);
protected _taskSystem?: ITaskSystem;
protected _taskSystemListener?: IDisposable;
@@ -248,7 +246,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
@IWorkspaceContextService protected readonly contextService: IWorkspaceContextService,
@ITelemetryService protected readonly telemetryService: ITelemetryService,
@ITextFileService private readonly textFileService: ITextFileService,
@ILifecycleService lifecycleService: ILifecycleService,
@IModelService protected readonly modelService: IModelService,
@IExtensionService private readonly extensionService: IExtensionService,
@IQuickInputService private readonly quickInputService: IQuickInputService,
@@ -258,7 +255,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
@IProgressService private readonly progressService: IProgressService,
@IOpenerService private readonly openerService: IOpenerService,
@IHostService private readonly _hostService: IHostService,
@IDialogService private readonly dialogService: IDialogService,
@IDialogService protected readonly dialogService: IDialogService,
@INotificationService private readonly notificationService: INotificationService,
@IContextKeyService protected readonly contextKeyService: IContextKeyService,
@IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService,
@@ -319,7 +316,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
this.updateWorkspaceTasks(TaskRunSource.ConfigurationChange);
}));
this._taskRunningState = TASK_RUNNING_STATE.bindTo(contextKeyService);
this._register(lifecycleService.onBeforeShutdown(event => event.veto(this.beforeShutdown())));
this._onDidStateChange = this._register(new Emitter());
this.registerCommands();
this.configurationResolverService.contributeVariable('defaultBuildTask', async (): Promise<string | undefined> => {
@@ -529,7 +525,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
}
private disposeTaskSystemListeners(): void {
protected disposeTaskSystemListeners(): void {
if (this._taskSystemListener) {
this._taskSystemListener.dispose();
}
@@ -553,7 +549,16 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
public registerTaskSystem(key: string, info: TaskSystemInfo): void {
this._taskSystemInfos.set(key, info);
if (!this._taskSystemInfos.has(key) || info.platform !== Platform.Platform.Web) {
this._taskSystemInfos.set(key, info);
}
}
private getTaskSystemInfo(key: string): TaskSystemInfo | undefined {
if (this.environmentService.remoteAuthority) {
return this._taskSystemInfos.get(key);
}
return undefined;
}
public extensionCallbackTaskComplete(task: Task, result: number): Promise<void> {
@@ -582,7 +587,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (!values) {
return undefined;
}
return values.find(task => task.matches(key, compareId));
values = values.filter(task => task.matches(key, compareId)).sort(task => task._source.kind === TaskSourceKind.Extension ? 1 : -1);
return values.length > 0 ? values[0] : undefined;
});
}
@@ -803,6 +809,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
return tasks;
}
public removeRecentlyUsedTask(taskRecentlyUsedKey: string) {
if (this.getRecentlyUsedTasks().has(taskRecentlyUsedKey)) {
this.getRecentlyUsedTasks().delete(taskRecentlyUsedKey);
this.saveRecentlyUsedTasks();
}
}
private setTaskLRUCacheLimit() {
const quickOpenHistoryLimit = this.configurationService.getValue<number>(QUICKOPEN_HISTORY_LIMIT_CONFIG);
if (this._recentlyUsedTasks) {
@@ -847,7 +860,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
for (const key of keys) {
keyValues.push([key, this._recentlyUsedTasks.get(key, Touch.None)!]);
}
this.storageService.store(AbstractTaskService.RecentlyUsedTasks_KeyV2, JSON.stringify(keyValues), StorageScope.WORKSPACE);
this.storageService.store(AbstractTaskService.RecentlyUsedTasks_KeyV2, JSON.stringify(keyValues), StorageScope.WORKSPACE, StorageTarget.USER);
}
private openDocumentation(): void {
@@ -982,7 +995,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
newValue = Object.create(null);
}
newValue[type] = true;
return this.configurationService.updateValue(PROBLEM_MATCHER_NEVER_CONFIG, newValue, ConfigurationTarget.USER);
return this.configurationService.updateValue(PROBLEM_MATCHER_NEVER_CONFIG, newValue);
}
private attachProblemMatcher(task: ContributedTask | CustomTask): Promise<Task | undefined> {
@@ -1625,12 +1638,15 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
this.modelService, this.configurationResolverService, this.telemetryService,
this.contextService, this.environmentService,
AbstractTaskService.OutputChannelId, this.fileService, this.terminalInstanceService,
this.pathService, this.viewDescriptorService, this.logService,
(workspaceFolder: IWorkspaceFolder) => {
if (!workspaceFolder) {
this.pathService, this.viewDescriptorService, this.logService, this.configurationService,
(workspaceFolder: IWorkspaceFolder | undefined) => {
if (workspaceFolder) {
return this.getTaskSystemInfo(workspaceFolder.uri.scheme);
} else if (this._taskSystemInfos.size > 0) {
return this._taskSystemInfos.values().next().value;
} else {
return undefined;
}
return this._taskSystemInfos.get(workspaceFolder.uri.scheme);
}
);
}
@@ -1728,7 +1744,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
return;
}
if (!contributed) {
if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) {
result.add(key, ...folderTasks.set.tasks);
} else {
let configurations = folderTasks.configurations;
@@ -1893,35 +1909,39 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
protected abstract updateWorkspaceTasks(runSource: TaskRunSource | void): void;
protected computeWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): Promise<Map<string, WorkspaceFolderTaskResult>> {
if (this.workspaceFolders.length === 0) {
return Promise.resolve(new Map<string, WorkspaceFolderTaskResult>());
} else {
let promises: Promise<WorkspaceFolderTaskResult | undefined>[] = [];
for (let folder of this.workspaceFolders) {
promises.push(this.computeWorkspaceFolderTasks(folder, runSource).then((value) => value, () => undefined));
let promises: Promise<WorkspaceFolderTaskResult | undefined>[] = [];
for (let folder of this.workspaceFolders) {
promises.push(this.computeWorkspaceFolderTasks(folder, runSource).then((value) => value, () => undefined));
}
return Promise.all(promises).then(async (values) => {
let result = new Map<string, WorkspaceFolderTaskResult>();
for (let value of values) {
if (value) {
result.set(value.workspaceFolder.uri.toString(), value);
}
}
return Promise.all(promises).then(async (values) => {
let result = new Map<string, WorkspaceFolderTaskResult>();
for (let value of values) {
if (value) {
result.set(value.workspaceFolder.uri.toString(), value);
}
}
const userTasks = await this.computeUserTasks(this.workspaceFolders[0], runSource).then((value) => value, () => undefined);
if (userTasks) {
result.set(USER_TASKS_GROUP_KEY, userTasks);
}
const workspaceFileTasks = await this.computeWorkspaceFileTasks(this.workspaceFolders[0], runSource).then((value) => value, () => undefined);
let folder = this.workspaceFolders.length > 0 ? this.workspaceFolders[0] : undefined;
if (!folder) {
const userhome = await this.pathService.userHome();
folder = new WorkspaceFolder({ uri: userhome, name: resources.basename(userhome), index: 0 });
}
const userTasks = await this.computeUserTasks(folder, runSource).then((value) => value, () => undefined);
if (userTasks) {
result.set(USER_TASKS_GROUP_KEY, userTasks);
}
if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
const workspaceFileTasks = await this.computeWorkspaceFileTasks(folder, runSource).then((value) => value, () => undefined);
if (workspaceFileTasks && this._workspace && this._workspace.configuration) {
result.set(this._workspace.configuration.toString(), workspaceFileTasks);
}
return result;
});
}
}
return result;
});
}
public setJsonTasksSupported(areSupported: Promise<boolean>) {
this._areJsonTasksSupportedPromise = areSupported;
private get jsonTasksSupported(): boolean {
return !!ShellExecutionSupportedContext.getValue(this.contextKeyService) && !!ProcessExecutionSupportedContext.getValue(this.contextKeyService);
}
private computeWorkspaceFolderTasks(workspaceFolder: IWorkspaceFolder, runSource: TaskRunSource = TaskRunSource.User): Promise<WorkspaceFolderTaskResult> {
@@ -1933,7 +1953,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
return Promise.resolve({ workspaceFolder, set: undefined, configurations: undefined, hasErrors: workspaceFolderConfiguration ? workspaceFolderConfiguration.hasErrors : false });
}
return ProblemMatcherRegistry.onReady().then(async (): Promise<WorkspaceFolderTaskResult> => {
let taskSystemInfo: TaskSystemInfo | undefined = this._taskSystemInfos.get(workspaceFolder.uri.scheme);
let taskSystemInfo: TaskSystemInfo | undefined = this.getTaskSystemInfo(workspaceFolder.uri.scheme);
let problemReporter = new ProblemReporter(this._outputChannel);
let parseResult = TaskConfig.parse(workspaceFolder, undefined, taskSystemInfo ? taskSystemInfo.platform : Platform.platform, workspaceFolderConfiguration.config!, problemReporter, TaskConfig.TaskConfigSource.TasksJson, this.contextKeyService);
let hasErrors = false;
@@ -1954,10 +1974,10 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
customizedTasks.byIdentifier[task.configures._key] = task;
}
}
if (!(await this._areJsonTasksSupportedPromise) && (parseResult.custom.length > 0)) {
if (!this.jsonTasksSupported && (parseResult.custom.length > 0)) {
console.warn('Custom workspace tasks are not supported.');
}
return { workspaceFolder, set: { tasks: await this._areJsonTasksSupportedPromise ? parseResult.custom : [] }, configurations: customizedTasks, hasErrors };
return { workspaceFolder, set: { tasks: this.jsonTasksSupported ? parseResult.custom : [] }, configurations: customizedTasks, hasErrors };
});
});
}
@@ -2030,7 +2050,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (!config) {
return false;
}
let taskSystemInfo: TaskSystemInfo | undefined = workspaceFolder ? this._taskSystemInfos.get(workspaceFolder.uri.scheme) : undefined;
let taskSystemInfo: TaskSystemInfo | undefined = workspaceFolder ? this.getTaskSystemInfo(workspaceFolder.uri.scheme) : undefined;
let problemReporter = new ProblemReporter(this._outputChannel);
let parseResult = TaskConfig.parse(workspaceFolder, this._workspace, taskSystemInfo ? taskSystemInfo.platform : Platform.platform, config, problemReporter, source, this.contextKeyService, isRecentTask);
let hasErrors = false;
@@ -2047,7 +2067,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
customized[task.configures._key] = task;
}
}
if (!(await this._areJsonTasksSupportedPromise) && (parseResult.custom.length > 0)) {
if (!this.jsonTasksSupported && (parseResult.custom.length > 0)) {
console.warn('Custom workspace tasks are not supported.');
} else {
for (let task of parseResult.custom) {
@@ -2158,64 +2178,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
};
}
public beforeShutdown(): boolean | Promise<boolean> {
if (!this._taskSystem) {
return false;
}
if (!this._taskSystem.isActiveSync()) {
return false;
}
// The terminal service kills all terminal on shutdown. So there
// is nothing we can do to prevent this here.
if (this._taskSystem instanceof TerminalTaskSystem) {
return false;
}
let terminatePromise: Promise<IConfirmationResult>;
if (this._taskSystem.canAutoTerminate()) {
terminatePromise = Promise.resolve({ confirmed: true });
} else {
terminatePromise = this.dialogService.confirm({
message: nls.localize('TaskSystem.runningTask', 'There is a task running. Do you want to terminate it?'),
primaryButton: nls.localize({ key: 'TaskSystem.terminateTask', comment: ['&& denotes a mnemonic'] }, "&&Terminate Task"),
type: 'question'
});
}
return terminatePromise.then(res => {
if (res.confirmed) {
return this._taskSystem!.terminateAll().then((responses) => {
let success = true;
let code: number | undefined = undefined;
for (let response of responses) {
success = success && response.success;
// We only have a code in the old output runner which only has one task
// So we can use the first code.
if (code === undefined && response.code !== undefined) {
code = response.code;
}
}
if (success) {
this._taskSystem = undefined;
this.disposeTaskSystemListeners();
return false; // no veto
} else if (code && code === TerminateResponseCode.ProcessNotFound) {
return this.dialogService.confirm({
message: nls.localize('TaskSystem.noProcess', 'The launched task doesn\'t exist anymore. If the task spawned background processes exiting VS Code might result in orphaned processes. To avoid this start the last background process with a wait flag.'),
primaryButton: nls.localize({ key: 'TaskSystem.exitAnyways', comment: ['&& denotes a mnemonic'] }, "&&Exit Anyways"),
type: 'info'
}).then(res => !res.confirmed);
}
return true; // veto
}, (err) => {
return true; // veto
});
}
return true; // veto
});
}
private handleError(err: any): void {
let showOutput = true;
if (err instanceof TaskError) {
@@ -2251,17 +2213,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
private canRunCommand(): boolean {
if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) {
this.notificationService.prompt(
Severity.Info,
nls.localize('TaskService.noWorkspace', "Tasks are only available on a workspace folder."),
[{
label: nls.localize('TaskService.learnMore', "Learn More"),
run: () => this.openerService.open(URI.parse('https://code.visualstudio.com/docs/editor/tasks'))
}]
);
return false;
}
return true;
}
@@ -2291,7 +2242,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
for (let task of tasks) {
let entry: TaskQuickPickEntry = TaskQuickPickEntry(task);
entry.buttons = [{ iconClass: 'codicon-gear', tooltip: nls.localize('configureTask', "Configure Task") }];
entry.buttons = [{ iconClass: ThemeIcon.asClassName(configureTaskIcon), tooltip: nls.localize('configureTask', "Configure Task") }];
if (selectedEntry && (task === selectedEntry.task)) {
entries.unshift(selectedEntry);
} else {
@@ -2475,7 +2426,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
label: nls.localize('TaskService.notAgain', "Don't Show Again"),
isSecondary: true,
run: () => {
this.storageService.store(AbstractTaskService.IgnoreTask010DonotShowAgain_key, true, StorageScope.WORKSPACE);
this.storageService.store(AbstractTaskService.IgnoreTask010DonotShowAgain_key, true, StorageScope.WORKSPACE, StorageTarget.USER);
this._showIgnoreMessage = false;
}
}]
@@ -2570,7 +2521,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
this.showQuickPick(tasks ? tasks : taskResult!.tasks, placeholder,
{
label: nls.localize('TaskService.noEntryToRunSlow', 'No task to run found. Configure Tasks...'),
label: nls.localize('TaskService.noEntryToRunSlow', '$(plus) Configure a Task'),
task: null
},
true).
@@ -2580,7 +2531,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
} else {
this.showTwoLevelQuickPick(placeholder,
{
label: nls.localize('TaskService.noEntryToRun', 'No configured tasks. Configure Tasks...'),
label: nls.localize('TaskService.noEntryToRun', '$(plus) Configure a Task'),
task: null
}).
then(pickThen);
@@ -2962,8 +2913,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
if (this.isTaskEntry(selection)) {
this.configureTask(selection.task);
} else {
} else if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
this.openTaskFile(selection.folder.toResource('.vscode/tasks.json'), TaskSourceKind.Workspace);
} else {
const resource = this.getResourceForKind(TaskSourceKind.User);
if (resource) {
this.openTaskFile(resource, TaskSourceKind.User);
}
}
}
@@ -3005,46 +2961,22 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
return taskPromise.then((taskMap) => {
let entries: QuickPickInput<TaskQuickPickEntryType>[] = [];
let needsCreateOrOpen: boolean = true;
if (this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY) {
let tasks = taskMap.all();
if (tasks.length > 0) {
tasks = tasks.sort((a, b) => a._label.localeCompare(b._label));
for (let task of tasks) {
entries.push({ label: task._label, task, description: this.getTaskDescription(task), detail: this.showDetail() ? task.configurationProperties.detail : undefined });
if (!ContributedTask.is(task)) {
needsCreateOrOpen = false;
}
let tasks = taskMap.all();
if (tasks.length > 0) {
tasks = tasks.sort((a, b) => a._label.localeCompare(b._label));
for (let task of tasks) {
entries.push({ label: task._label, task, description: this.getTaskDescription(task), detail: this.showDetail() ? task.configurationProperties.detail : undefined });
if (!ContributedTask.is(task)) {
needsCreateOrOpen = false;
}
}
if (needsCreateOrOpen) {
let label = stats[0] !== undefined ? openLabel : createLabel;
if (entries.length) {
entries.push({ type: 'separator' });
}
entries.push({ label, folder: this.contextService.getWorkspace().folders[0] });
}
} else {
let folders = this.contextService.getWorkspace().folders;
let index = 0;
for (let folder of folders) {
let tasks = taskMap.get(folder);
if (tasks.length > 0) {
tasks = tasks.slice().sort((a, b) => a._label.localeCompare(b._label));
for (let i = 0; i < tasks.length; i++) {
let entry: TaskQuickPickEntryType = { label: tasks[i]._label, task: tasks[i], description: this.getTaskDescription(tasks[i]) };
if (i === 0) {
entries.push({ type: 'separator', label: folder.name });
}
entries.push(entry);
}
} else {
let label = stats[index] !== undefined ? openLabel : createLabel;
let entry: TaskQuickPickEntryType = { label, folder: folder };
entries.push({ type: 'separator', label: folder.name });
entries.push(entry);
}
index++;
}
if (needsCreateOrOpen) {
let label = stats[0] !== undefined ? openLabel : createLabel;
if (entries.length) {
entries.push({ type: 'separator' });
}
entries.push({ label, folder: this.contextService.getWorkspace().folders[0] });
}
if ((entries.length === 1) && !needsCreateOrOpen) {
tokenSource.cancel();