diff --git a/extensions/make/cgmanifest.json b/extensions/make/cgmanifest.json index 6f4432b66da47e00ea71bccbdc839725dc3be396..ed80096c8ce18d0c188f30c9e76666c2f393e29d 100644 --- a/extensions/make/cgmanifest.json +++ b/extensions/make/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "fadeevab/make.tmbundle", "repositoryUrl": "https://github.com/fadeevab/make.tmbundle", - "commitHash": "21e9108e9dce13b798667806bb105d852ac0a58c" + "commitHash": "bd71f44ea55d61be711bd7676e600a7333cc79ea" } }, "licenseDetail": [ diff --git a/extensions/make/syntaxes/make.tmLanguage.json b/extensions/make/syntaxes/make.tmLanguage.json index 878e78767e8d14e59eee04c373a2874d9fd56263..f2e43e163ee81555c38a3cba8b449adbb2b3459e 100644 --- a/extensions/make/syntaxes/make.tmLanguage.json +++ b/extensions/make/syntaxes/make.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/fadeevab/make.tmbundle/commit/21e9108e9dce13b798667806bb105d852ac0a58c", + "version": "https://github.com/fadeevab/make.tmbundle/commit/bd71f44ea55d61be711bd7676e600a7333cc79ea", "name": "Makefile", "scopeName": "source.makefile", "patterns": [ @@ -320,7 +320,7 @@ ] }, "recipe": { - "begin": "^\\t([+-@]*)", + "begin": "^\\t([+\\-@]*)", "beginCaptures": { "1": { "name": "keyword.control.$1.makefile" diff --git a/extensions/make/test/colorize-fixtures/makefile b/extensions/make/test/colorize-fixtures/makefile index 6fbe91275ff605e46a444fb45bb892922875ed3d..7aae1d20f3d3805ba602efa229cb5b4412a0ba74 100644 --- a/extensions/make/test/colorize-fixtures/makefile +++ b/extensions/make/test/colorize-fixtures/makefile @@ -38,6 +38,7 @@ echo: @-+-+echo Error will be ignored here; invalidcommand # And we can see variables are highlited as supposed to be: @echo '$(CC) $(shell echo "123") -o $@' + @-./point-and-slash-should-not-be-highlighted define defined $(info Checking existance of $(1) $(flavor $(1))) diff --git a/extensions/make/test/colorize-results/makefile.json b/extensions/make/test/colorize-results/makefile.json index cd9a6c46e531a48860c09765a42272c7caa78cf2..9f977fcf5f80f4d5a2602ec7a19196ae65ad9c33 100644 --- a/extensions/make/test/colorize-results/makefile.json +++ b/extensions/make/test/colorize-results/makefile.json @@ -1154,6 +1154,39 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "\t", + "t": "source.makefile meta.scope.recipe.makefile", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "@-", + "t": "source.makefile meta.scope.recipe.makefile keyword.control.@-.makefile", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": "./point-and-slash-should-not-be-highlighted", + "t": "source.makefile meta.scope.recipe.makefile", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "define", "t": "source.makefile meta.scope.conditional.makefile keyword.control.define.makefile", diff --git a/package.json b/package.json index 9b65dde955a0e991ad83f94d62159cde83858464..3257faa7ff57fae00fb2666bd988bb346f3ec05c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.34.0", - "distro": "9abd1fcd07dd503b0ff9e7ceba3e7da178f8fbf0", + "distro": "32640c97026b910a76c4297405cb855cfcb960b9", "author": { "name": "Microsoft Corporation" }, diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index bf9f121dfe1e0a26d9f27c7c11267bda1431077f..cb32d2baf5879f0a26edd75b7246b8a5423f99f3 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -7,19 +7,18 @@ APP_NAME="@@APPNAME@@" QUALITY="@@QUALITY@@" NAME="@@NAME@@" -set -e - if grep -qi Microsoft /proc/version; then # in a wsl shell WIN_CODE_CMD=$(wslpath -w "$(dirname "$(realpath "$0")")/$APP_NAME.cmd") - - WSL_EXT_ID="ms-vscode.remote-wsl" - WSL_EXT_WLOC=$(cmd.exe /c "$WIN_CODE_CMD" --locate-extension $WSL_EXT_ID) - if ! [ -z "$WSL_EXT_WLOC" ]; then - # replace \r\n with \n in WSL_EXT_WLOC, get linux path for - WSL_CODE=$(wslpath -u "${WSL_EXT_WLOC%%[[:cntrl:]]}")/scripts/wslCode.sh - $WSL_CODE $COMMIT $QUALITY "$WIN_CODE_CMD" "$APP_NAME" "$@" - exit $? + if ! [ -z "$WIN_CODE_CMD" ]; then + WSL_EXT_ID="ms-vscode.remote-wsl" + WSL_EXT_WLOC=$(cmd.exe /c "$WIN_CODE_CMD" --locate-extension $WSL_EXT_ID) + if ! [ -z "$WSL_EXT_WLOC" ]; then + # replace \r\n with \n in WSL_EXT_WLOC, get linux path for + WSL_CODE=$(wslpath -u "${WSL_EXT_WLOC%%[[:cntrl:]]}")/scripts/wslCode.sh + $WSL_CODE $COMMIT $QUALITY "$WIN_CODE_CMD" "$APP_NAME" "$@" + exit $? + fi fi fi diff --git a/src/vs/platform/remote/common/remoteAuthorityResolver.ts b/src/vs/platform/remote/common/remoteAuthorityResolver.ts index 6c5063716e99a572ba188d5c47c02dfdc4a734ab..62031dc3a66febb7f498d473a61c7568001f1cd0 100644 --- a/src/vs/platform/remote/common/remoteAuthorityResolver.ts +++ b/src/vs/platform/remote/common/remoteAuthorityResolver.ts @@ -13,6 +13,49 @@ export interface ResolvedAuthority { readonly port: number; } +export enum RemoteAuthorityResolverErrorCode { + Unknown = 'Unknown', + NotAvailable = 'NotAvailable', + TemporarilyNotAvailable = 'TemporarilyNotAvailable', +} + +export class RemoteAuthorityResolverError extends Error { + + public static isHandledNotAvailable(err: any): boolean { + if (err instanceof RemoteAuthorityResolverError) { + if (err._code === RemoteAuthorityResolverErrorCode.NotAvailable && err._detail === true) { + return true; + } + } + return false; + } + + public static isTemporarilyNotAvailable(err: any): boolean { + if (err instanceof RemoteAuthorityResolverError) { + return err._code === RemoteAuthorityResolverErrorCode.TemporarilyNotAvailable; + } + return false; + } + + public readonly _message: string | undefined; + public readonly _code: RemoteAuthorityResolverErrorCode; + public readonly _detail: any; + + constructor(message?: string, code: RemoteAuthorityResolverErrorCode = RemoteAuthorityResolverErrorCode.Unknown, detail?: any) { + super(message); + + this._message = message; + this._code = code; + this._detail = detail; + + // workaround when extending builtin objects and when compiling to ES5, see: + // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work + if (typeof (Object).setPrototypeOf === 'function') { + (Object).setPrototypeOf(this, RemoteAuthorityResolverError.prototype); + } + } +} + export interface IRemoteAuthorityResolverService { _serviceBrand: any; diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 9c603ea901ebd93429bf328af24e60c01e0d6629..de82a978e2b810587fce97340d64b0bb89046578 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -72,6 +72,10 @@ declare module 'vscode' { //#region Alex - resolvers + export interface RemoteAuthorityResolverContext { + resolveAttempt: number; + } + export class ResolvedAuthority { readonly host: string; readonly port: number; @@ -79,8 +83,15 @@ declare module 'vscode' { constructor(host: string, port: number); } + export class RemoteAuthorityResolverError extends Error { + static NotAvailable(message?: string, handled?: boolean): RemoteAuthorityResolverError; + static TemporarilyNotAvailable(message?: string): RemoteAuthorityResolverError; + + constructor(message?: string); + } + export interface RemoteAuthorityResolver { - resolve(authority: string): ResolvedAuthority | Thenable; + resolve(authority: string, context: RemoteAuthorityResolverContext): ResolvedAuthority | Thenable; } export interface ResourceLabelFormatter { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 60baa1297631c4d9fee85b314b3af4b66e32a1f6..4ca975d247ada0b9d6279a9e151c7df4352597ee 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -40,7 +40,7 @@ import { IRPCProtocol, createExtHostContextProxyIdentifier as createExtId, creat import { IProgressOptions, IProgressStep } from 'vs/platform/progress/common/progress'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import { IMarkdownString } from 'vs/base/common/htmlContent'; -import { ResolvedAuthority } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { ResolvedAuthority, RemoteAuthorityResolverErrorCode } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import * as codeInset from 'vs/workbench/contrib/codeinset/common/codeInset'; import * as callHierarchy from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; @@ -808,8 +808,24 @@ export interface ExtHostSearchShape { $clearCache(cacheKey: string): Promise; } +export interface IResolveAuthorityErrorResult { + type: 'error'; + error: { + message: string | undefined; + code: RemoteAuthorityResolverErrorCode; + detail: any; + }; +} + +export interface IResolveAuthorityOKResult { + type: 'ok'; + value: ResolvedAuthority; +} + +export type IResolveAuthorityResult = IResolveAuthorityErrorResult | IResolveAuthorityOKResult; + export interface ExtHostExtensionServiceShape { - $resolveAuthority(remoteAuthority: string): Promise; + $resolveAuthority(remoteAuthority: string, resolveAttempt: number): Promise; $startExtensionHost(enabledExtensionIds: ExtensionIdentifier[]): Promise; $activateByEvent(activationEvent: string): Promise; $activate(extensionId: ExtensionIdentifier, activationEvent: string): Promise; diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 9a9c767fd6e3057f094912a7cf49e8d8f708838e..dc416c70313623e1ea9601c7d85b7408c7bfd62f 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -13,6 +13,7 @@ import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import * as vscode from 'vscode'; import { FileSystemProviderErrorCode, markAsFileSystemProviderError } from 'vs/platform/files/common/files'; +import { RemoteAuthorityResolverErrorCode } from 'vs/platform/remote/common/remoteAuthorityResolver'; function es5ClassCompat(target: Function): any { ///@ts-ignore @@ -445,6 +446,35 @@ export class ResolvedAuthority { } } +export class RemoteAuthorityResolverError extends Error { + + static NotAvailable(message?: string, handled?: boolean): RemoteAuthorityResolverError { + return new RemoteAuthorityResolverError(message, RemoteAuthorityResolverErrorCode.NotAvailable, handled); + } + + static TemporarilyNotAvailable(message?: string): RemoteAuthorityResolverError { + return new RemoteAuthorityResolverError(message, RemoteAuthorityResolverErrorCode.TemporarilyNotAvailable); + } + + public readonly _message: string | undefined; + public readonly _code: RemoteAuthorityResolverErrorCode; + public readonly _detail: any; + + constructor(message?: string, code: RemoteAuthorityResolverErrorCode = RemoteAuthorityResolverErrorCode.Unknown, detail?: any) { + super(message); + + this._message = message; + this._code = code; + this._detail = detail; + + // workaround when extending builtin objects and when compiling to ES5, see: + // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work + if (typeof (Object).setPrototypeOf === 'function') { + (Object).setPrototypeOf(this, RemoteAuthorityResolverError.prototype); + } + } +} + export enum EndOfLine { LF = 1, CRLF = 2 diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 200a1b77e57aea2e298f8db74bafa6cb1322f8ed..eb45c7107b61c0b45e9c46f0ab4a96b2a433b8c2 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -805,6 +805,7 @@ export function createApiFactory( Range: extHostTypes.Range, RelativePattern: extHostTypes.RelativePattern, ResolvedAuthority: extHostTypes.ResolvedAuthority, + RemoteAuthorityResolverError: extHostTypes.RemoteAuthorityResolverError, Selection: extHostTypes.Selection, SelectionRange: extHostTypes.SelectionRange, ShellExecution: extHostTypes.ShellExecution, diff --git a/src/vs/workbench/api/node/extHostCLIServer.ts b/src/vs/workbench/api/node/extHostCLIServer.ts index 84f610f60fb4f42804d5c282fd590859a3078069..4a5811a8600b6e2f4df01fb083c07c377d0f3276 100644 --- a/src/vs/workbench/api/node/extHostCLIServer.ts +++ b/src/vs/workbench/api/node/extHostCLIServer.ts @@ -29,7 +29,7 @@ export interface StatusPipeArgs { export interface RunCommandPipeArgs { type: 'command'; command: string; - args: string[]; + args: any[]; } export class CLIServer { @@ -99,7 +99,9 @@ export class CLIServer { for (const s of folderURIs) { try { urisToOpen.push({ folderUri: URI.parse(s) }); - forceNewWindow = true; + if (!addMode && !forceReuseWindow) { + forceNewWindow = true; + } } catch (e) { // ignore } @@ -110,7 +112,9 @@ export class CLIServer { try { if (hasWorkspaceFileExtension(s)) { urisToOpen.push({ workspaceUri: URI.parse(s) }); - forceNewWindow = true; + if (!forceReuseWindow) { + forceNewWindow = true; + } } else { urisToOpen.push({ fileUri: URI.parse(s) }); } diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index c9f18be439ba7603728866c4b31bc7714aada9aa..97f124209fedab088012417f20fa5783a1bfd9be 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -13,7 +13,7 @@ import { URI } from 'vs/base/common/uri'; import { ILogService } from 'vs/platform/log/common/log'; import { createApiFactory, IExtensionApiFactory } from 'vs/workbench/api/node/extHost.api.impl'; import { NodeModuleRequireInterceptor, VSCodeNodeModuleFactory, KeytarNodeModuleFactory, OpenNodeModuleFactory } from 'vs/workbench/api/node/extHostRequireInterceptor'; -import { ExtHostExtensionServiceShape, IEnvironment, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostExtensionServiceShape, IEnvironment, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape, IResolveAuthorityResult } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; import { ActivatedExtension, EmptyExtension, ExtensionActivatedByAPI, ExtensionActivatedByEvent, ExtensionActivationReason, ExtensionActivationTimes, ExtensionActivationTimesBuilder, ExtensionsActivator, IExtensionAPI, IExtensionContext, IExtensionModule, HostExtension } from 'vs/workbench/api/common/extHostExtensionActivator'; import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService'; @@ -24,7 +24,6 @@ import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/c import { connectProxyResolver } from 'vs/workbench/services/extensions/node/proxyResolver'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; -import { ResolvedAuthority } from 'vs/platform/remote/common/remoteAuthorityResolver'; import * as vscode from 'vscode'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { IWorkspace } from 'vs/platform/workspace/common/workspace'; @@ -34,6 +33,7 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { ExtensionMemento } from 'vs/workbench/api/common/extHostMemento'; import { ExtensionStoragePaths } from 'vs/workbench/api/node/extHostStoragePaths'; +import { RemoteAuthorityResolverError } from 'vs/workbench/api/common/extHostTypes'; interface ITestRunner { run(testsRoot: string, clb: (error: Error, failures?: number) => void): void; @@ -595,7 +595,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { // -- called by main thread - public async $resolveAuthority(remoteAuthority: string): Promise { + public async $resolveAuthority(remoteAuthority: string, resolveAttempt: number): Promise { const authorityPlusIndex = remoteAuthority.indexOf('+'); if (authorityPlusIndex === -1) { throw new Error(`Not an authority that can be resolved!`); @@ -610,12 +610,29 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { throw new Error(`No resolver available for ${authorityPrefix}`); } - const result = await resolver.resolve(remoteAuthority); - return { - authority: remoteAuthority, - host: result.host, - port: result.port, - }; + try { + const result = await resolver.resolve(remoteAuthority, { resolveAttempt }); + return { + type: 'ok', + value: { + authority: remoteAuthority, + host: result.host, + port: result.port, + } + }; + } catch (err) { + if (err instanceof RemoteAuthorityResolverError) { + return { + type: 'error', + error: { + code: err._code, + message: err._message, + detail: err._detail + } + }; + } + throw err; + } } public $startExtensionHost(enabledExtensionIds: ExtensionIdentifier[]): Promise { diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts index 2ba119482c55d5a837d1894b5ccab4dc10de631d..2d5d79a782ab81a05af9722d2454d201448a54f7 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts @@ -2840,7 +2840,7 @@ export class InstallVSIXAction extends Action { for (const extension of extensions) { const requireReload = !(extension.local && this.extensionService.canAddExtension(toExtensionDescription(extension.local))); const message = requireReload ? localize('InstallVSIXAction.successReload', "Please reload Visual Studio Code to complete installing the extension {0}.", extension.identifier.id) - : localize('InstallVSIXAction.success', "Installing the extension {0} is completed.", extension.identifier.id); + : localize('InstallVSIXAction.success', "Completed installing the extension {0}.", extension.identifier.id); const actions = requireReload ? [{ label: localize('InstallVSIXAction.reloadNow', "Reload Now"), run: () => this.windowService.reloadWindow() diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css index 8f9e710b9dd690b894eab8b2b4383c55b235e47c..fe927011a4f4a884c80704f27a1839cb62cb54ee 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css @@ -35,7 +35,15 @@ .extension-editor > .header > .icon-container .extension-remote-badge { position: absolute; right: 0px; - top: 94px; + top: 88px; + width: 38px; + height: 38px; + line-height: 38px; +} + +.extension-editor > .header > .icon-container .extension-remote-badge .octicon { + font-size: 32px; + vertical-align: middle; } .extension-editor > .header > .details { diff --git a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts index 8b838112e23bdf2a6bafe5bafcd9e628acacf1ff..36152cd4c4f229aab9fa27cfb99416183837aa70 100644 --- a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts @@ -255,6 +255,7 @@ export class RemoteFileDialog { isAcceptHandled = false; // update input box to match the first selected item if ((i.length === 1) && this.isChangeFromUser()) { + this.filePickBox.validationMessage = undefined; this.setAutoComplete(this.constructFullUserPath(), this.userEnteredPathSegment, i[0], true); } }); diff --git a/src/vs/workbench/services/extensions/common/extensionHostProcessManager.ts b/src/vs/workbench/services/extensions/common/extensionHostProcessManager.ts index 33146f77b2326b84c0fbf0fcd9bf599eb21fed56..4e63fa92494cbeeb20a3549f273df647340555c9 100644 --- a/src/vs/workbench/services/extensions/common/extensionHostProcessManager.ts +++ b/src/vs/workbench/services/extensions/common/extensionHostProcessManager.ts @@ -14,7 +14,7 @@ import { ExtHostCustomersRegistry } from 'vs/workbench/api/common/extHostCustome import { ExtHostContext, ExtHostExtensionServiceShape, IExtHostContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { IRPCProtocolLogger, RPCProtocol, RequestInitiator, ResponsiveState } from 'vs/workbench/services/extensions/common/rpcProtocol'; -import { ResolvedAuthority } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { ResolvedAuthority, RemoteAuthorityResolverError } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import * as nls from 'vs/nls'; import { Action } from 'vs/base/common/actions'; @@ -51,6 +51,7 @@ export class ExtensionHostProcessManager extends Disposable { * winjs believes a proxy is a promise because it has a `then` method, so wrap the result in an object. */ private _extensionHostProcessProxy: Promise<{ value: ExtHostExtensionServiceShape; } | null> | null; + private _resolveAuthorityAttempt: number; constructor( extensionHostProcessWorker: IExtensionHostStarter, @@ -82,6 +83,7 @@ export class ExtensionHostProcessManager extends Disposable { measure: () => this.measure() })); }); + this._resolveAuthorityAttempt = 0; } public dispose(): void { @@ -259,7 +261,13 @@ export class ExtensionHostProcessManager extends Disposable { if (!proxy) { throw new Error(`Cannot resolve authority`); } - return proxy.$resolveAuthority(remoteAuthority); + this._resolveAuthorityAttempt++; + const result = await proxy.$resolveAuthority(remoteAuthority, this._resolveAuthorityAttempt); + if (result.type === 'ok') { + return result.value; + } else { + throw new RemoteAuthorityResolverError(result.error.message, result.error.code, result.error.detail); + } } public async start(enabledExtensionIds: ExtensionIdentifier[]): Promise { diff --git a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts index 4a9290dd22bcddfafefcad5d4c067fe382383fe9..79b10c15b65941478b90eb57ff4e044764d3fb79 100644 --- a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts +++ b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts @@ -10,7 +10,7 @@ import { Client } from 'vs/base/parts/ipc/common/ipc.net'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { connectRemoteAgentManagement, IConnectionOptions, IWebSocketFactory, PersistenConnectionEvent } from 'vs/platform/remote/common/remoteAgentConnection'; import { IRemoteAgentConnection, IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IRemoteAuthorityResolverService, RemoteAuthorityResolverError } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { RemoteAgentConnectionContext, IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; @@ -138,7 +138,11 @@ class RemoteConnectionFailureNotificationContribution implements IWorkbenchContr ) { // Let's cover the case where connecting to fetch the remote extension info fails remoteAgentService.getEnvironment(true) - .then(undefined, err => notificationService.error(nls.localize('connectionError', "Failed to connect to the remote extension host server (Error: {0})", err ? err.message : ''))); + .then(undefined, err => { + if (!RemoteAuthorityResolverError.isHandledNotAvailable(err)) { + notificationService.error(nls.localize('connectionError', "Failed to connect to the remote extension host server (Error: {0})", err ? err.message : '')); + } + }); } }