Merge from vscode bead496a613e475819f89f08e9e882b841bc1fe8 (#14883)

* Merge from vscode bead496a613e475819f89f08e9e882b841bc1fe8

* Bump distro

* Upgrade GCC to 4.9 due to yarn install errors

* Update build image

* Fix bootstrap base url

* Bump distro

* Fix build errors

* Update source map file

* Disable checkbox for blocking migration issues (#15131)

* disable checkbox for blocking issues

* wip

* disable checkbox fixes

* fix strings

* Remove duplicate tsec command

* Default to off for tab color if settings not present

* re-skip failing tests

* Fix mocha error

* Bump sqlite version & fix notebooks search view

* Turn off esbuild warnings

* Update esbuild log level

* Fix overflowactionbar tests

* Fix ts-ignore in dropdown tests

* cleanup/fixes

* Fix hygiene

* Bundle in entire zone.js module

* Remove extra constructor param

* bump distro for web compile break

* bump distro for web compile break v2

* Undo log level change

* New distro

* Fix integration test scripts

* remove the "no yarn.lock changes" workflow

* fix scripts v2

* Update unit test scripts

* Ensure ads-kerberos2 updates in .vscodeignore

* Try fix unit tests

* Upload crash reports

* remove nogpu

* always upload crashes

* Use bash script

* Consolidate data/ext dir names

* Create in tmp directory

Co-authored-by: chlafreniere <hichise@gmail.com>
Co-authored-by: Christopher Suh <chsuh@microsoft.com>
Co-authored-by: chgagnon <chgagnon@microsoft.com>
This commit is contained in:
Karl Burtram
2021-04-27 14:01:59 -07:00
committed by GitHub
parent 7e1c0076ba
commit 867a963882
1817 changed files with 81812 additions and 50843 deletions

View File

@@ -11,8 +11,8 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
import { INotificationService, IPromptChoice, Severity } from 'vs/platform/notification/common/notification';
import { IHostService } from 'vs/workbench/services/host/browser/host';
import { createDecorator, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { Action2, registerAction2 } from 'vs/platform/actions/common/actions';
import { IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey';
import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions';
import { ContextKeyEqualsExpr, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey';
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle';
import { Registry } from 'vs/platform/registry/common/platform';
@@ -21,6 +21,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands';
import { ILogService } from 'vs/platform/log/common/log';
import { IProductService } from 'vs/platform/product/common/productService';
import { IWorkbenchIssueService } from 'vs/workbench/services/issue/common/issue';
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
// --- bisect service
@@ -47,21 +48,18 @@ class BisectState {
try {
interface Raw extends BisectState { }
const data: Raw = JSON.parse(raw);
return new BisectState(data.extensions, data.low, data.high);
return new BisectState(data.extensions, data.low, data.high, data.mid);
} catch {
return undefined;
}
}
readonly mid: number;
constructor(
readonly extensions: string[],
readonly low: number,
readonly high: number,
) {
this.mid = ((low + high) / 2) | 0;
}
readonly mid: number = ((low + high) / 2) | 0
) { }
}
class ExtensionBisectService implements IExtensionBisectService {
@@ -76,6 +74,7 @@ class ExtensionBisectService implements IExtensionBisectService {
constructor(
@ILogService logService: ILogService,
@IStorageService private readonly _storageService: IStorageService,
@IWorkbenchEnvironmentService private readonly _envService: IWorkbenchEnvironmentService
) {
const raw = _storageService.get(ExtensionBisectService._storageKey, StorageScope.GLOBAL);
this._state = BisectState.fromJSON(raw);
@@ -100,18 +99,32 @@ class ExtensionBisectService implements IExtensionBisectService {
isDisabledByBisect(extension: IExtension): boolean {
if (!this._state) {
// bisect isn't active
return false;
}
if (this._isRemoteResolver(extension)) {
// the current remote resolver extension cannot be disabled
return false;
}
const disabled = this._disabled.get(extension.identifier.id);
return disabled ?? false;
}
private _isRemoteResolver(extension: IExtension): boolean {
if (extension.manifest.enableProposedApi !== true) {
return false;
}
const idx = this._envService.remoteAuthority?.indexOf('+');
const activationEvent = `onResolveRemoteAuthority:${this._envService.remoteAuthority?.substr(0, idx)}`;
return Boolean(extension.manifest.activationEvents?.find(e => e === activationEvent));
}
async start(extensions: ILocalExtension[]): Promise<void> {
if (this._state) {
throw new Error('invalid state');
}
const extensionIds = extensions.map(ext => ext.identifier.id);
const newState = new BisectState(extensionIds, 0, extensionIds.length);
const newState = new BisectState(extensionIds, 0, extensionIds.length, 0);
this._storageService.store(ExtensionBisectService._storageKey, JSON.stringify(newState), StorageScope.GLOBAL, StorageTarget.MACHINE);
await this._storageService.flush();
}
@@ -120,6 +133,10 @@ class ExtensionBisectService implements IExtensionBisectService {
if (!this._state) {
throw new Error('invalid state');
}
// check if bad when all extensions are disabled
if (seeingBad && this._state.mid === 0 && this._state.high === this._state.extensions.length) {
return { bad: true, id: '' };
}
// check if there is only one left
if (this._state.low === this._state.high - 1) {
await this.reset();
@@ -196,10 +213,16 @@ registerAction2(class extends Action2 {
constructor() {
super({
id: 'extension.bisect.start',
title: localize('title.start', "Start Extension Bisect"),
title: { value: localize('title.start', "Start Extension Bisect"), original: 'Start Extension Bisect' },
category: localize('help', "Help"),
f1: true,
precondition: ExtensionBisectUi.ctxIsBisectActive.negate()
precondition: ExtensionBisectUi.ctxIsBisectActive.negate(),
menu: {
id: MenuId.ViewContainerTitle,
when: ContextKeyEqualsExpr.create('viewContainer', 'workbench.view.extensions'),
group: '2_enablement',
order: 3
}
});
}
@@ -215,7 +238,7 @@ registerAction2(class extends Action2 {
const res = await dialogService.confirm({
message: localize('msg.start', "Extension Bisect"),
detail: localize('detail.start', "Extension Bisect will use binary search to find an extension that causes a problem. During the process the window reloads repeatedly (~{0} times). Each time you must confirm if you are still seeing problems.", 1 + Math.log2(extensions.length) | 0),
detail: localize('detail.start', "Extension Bisect will use binary search to find an extension that causes a problem. During the process the window reloads repeatedly (~{0} times). Each time you must confirm if you are still seeing problems.", 2 + Math.log2(extensions.length) | 0),
primaryButton: localize('msg2', "Start Extension Bisect")
});
@@ -249,7 +272,11 @@ registerAction2(class extends Action2 {
return;
}
if (seeingBad === undefined) {
seeingBad = await this._checkForBad(dialogService);
const goodBadStopCancel = await this._checkForBad(dialogService, bisectService);
if (goodBadStopCancel === null) {
return;
}
seeingBad = goodBadStopCancel;
}
if (seeingBad === undefined) {
await bisectService.reset();
@@ -265,7 +292,7 @@ registerAction2(class extends Action2 {
if (done.bad) {
// DONE but nothing found
await dialogService.show(Severity.Info, localize('done.msg', "Extension Bisect"), [], {
detail: localize('done.detail2', "Extension Bisect is done but no extension has been identified. This might be a problem with {0}", productService.nameShort)
detail: localize('done.detail2', "Extension Bisect is done but no extension has been identified. This might be a problem with {0}.", productService.nameShort)
});
} else {
@@ -290,21 +317,23 @@ registerAction2(class extends Action2 {
hostService.reload();
}
private async _checkForBad(dialogService: IDialogService) {
private async _checkForBad(dialogService: IDialogService, bisectService: IExtensionBisectService): Promise<boolean | undefined | null> {
const options = {
cancelId: 2,
detail: localize('detail.next', "Are you still seeing the problem for which you have started extension bisect?")
cancelId: 3,
detail: localize('bisect', "Extension Bisect is active and has disabled {0} extensions. Check if you can still reproduce the problem and proceed by selecting from these options.", bisectService.disabledCount),
};
const res = await dialogService.show(
Severity.Info,
localize('msg.next', "Extension Bisect"),
[localize('next.good', "Good now"), localize('next.bad', "This is bad"), localize('next.stop', "Stop Bisect")],
[localize('next.good', "Good now"), localize('next.bad', "This is bad"), localize('next.stop', "Stop Bisect"), localize('next.cancel', "Cancel")],
options
);
if (res.choice === options.cancelId) {
return undefined;
switch (res.choice) {
case 0: return false; //good now
case 1: return true; //bad
case 2: return undefined; //stop
}
return res.choice === 1;
return null; //cancel
}
});