feat: apply patch after setting up subtree

This commit is contained in:
Joe Previte
2020-12-15 15:53:52 -07:00
parent 41bee49d07
commit 51a2a2ad2d
84 changed files with 3360 additions and 191 deletions

View File

@@ -125,11 +125,12 @@ export class DialogService implements IDialogService {
async about(): Promise<void> {
const detailString = (useAgo: boolean): string => {
return nls.localize('aboutDetail',
"Version: {0}\nCommit: {1}\nDate: {2}\nBrowser: {3}",
"code-server: v{4}\n VS Code: v{0}\nCommit: {1}\nDate: {2}\nBrowser: {3}",
this.productService.version || 'Unknown',
this.productService.commit || 'Unknown',
this.productService.date ? `${this.productService.date}${useAgo ? ' (' + fromNow(new Date(this.productService.date), true) + ')' : ''}` : 'Unknown',
navigator.userAgent
navigator.userAgent,
this.productService.codeServerVersion || 'Unknown',
);
};

View File

@@ -119,8 +119,25 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment
@memoize
get logFile(): URI { return joinPath(this.options.logsPath, 'window.log'); }
// NOTE@coder: Use the same path in // ../../../../platform/environment/node/environmentService.ts
// and don't use the user data scheme. This solves two problems:
// 1. Extensions running in the browser (like Vim) might use these paths
// directly instead of using the file service and most likely can't write
// to `/User` on disk.
// 2. Settings will be stored in the file system instead of in browser
// storage. Using browser storage makes sharing or seeding settings
// between browsers difficult. We may want to revisit this once/if we get
// settings sync.
@memoize
get userRoamingDataHome(): URI { return URI.file('/User').with({ scheme: Schemas.userData }); }
get userRoamingDataHome(): URI { return joinPath(URI.file(this.userDataPath).with({ scheme: Schemas.vscodeRemote }), 'User'); }
@memoize
get userDataPath(): string {
const dataPath = this.payload?.get('userDataPath');
if (!dataPath) {
throw new Error('userDataPath was not provided to environment service');
}
return dataPath;
}
@memoize
get settingsResource(): URI { return joinPath(this.userRoamingDataHome, 'settings.json'); }
@@ -301,7 +318,12 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment
extensionHostDebugEnvironment.params.port = parseInt(value);
break;
case 'enableProposedApi':
extensionHostDebugEnvironment.extensionEnabledProposedApi = [];
try {
extensionHostDebugEnvironment.extensionEnabledProposedApi = JSON.parse(value);
} catch (error) {
console.error(error);
extensionHostDebugEnvironment.extensionEnabledProposedApi = [];
}
break;
}
}

View File

@@ -221,7 +221,7 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench
}
}
}
return true;
return false; // NOTE@coder: Don't disable anything by extensionKind.
}
return false;
}

View File

@@ -251,7 +251,9 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
// Install Language pack on all servers
if (isLanguagePackExtension(manifest)) {
servers.push(...this.servers);
// NOTE@coder: It does not appear language packs can be installed on the web
// extension management server at this time. Filter out the web to fix this.
servers.push(...this.servers.filter(s => s !== this.extensionManagementServerService.webExtensionManagementServer));
} else {
const server = this.getExtensionManagementServerToInstall(manifest);
if (server) {
@@ -320,6 +322,11 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
return this.extensionManagementServerService.webExtensionManagementServer;
}
// NOTE@coder: Fall back to installing on the remote server.
if (this.extensionManagementServerService.remoteExtensionManagementServer) {
return this.extensionManagementServerService.remoteExtensionManagementServer;
}
return undefined;
}

View File

@@ -87,7 +87,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten
if (code === ExtensionHostExitCode.StartTimeout10s) {
this._notificationService.prompt(
Severity.Error,
nls.localize('extensionService.startTimeout', "The Web Worker Extension Host did not start in 10s."),
nls.localize('extensionService.startTimeout', 'The Web Worker Extension Host did not start in 10s.'),
[]
);
return;
@@ -177,8 +177,10 @@ export class ExtensionService extends AbstractExtensionService implements IExten
this._remoteAgentService.getEnvironment(),
this._remoteAgentService.scanExtensions()
]);
localExtensions = this._checkEnabledAndProposedAPI(localExtensions);
remoteExtensions = this._checkEnabledAndProposedAPI(remoteExtensions);
// NOTE@coder: Include remotely hosted extensions that should run locally.
localExtensions = this._checkEnabledAndProposedAPI(localExtensions)
.concat(remoteExtensions.filter(ext => !ext.browser && ext.extensionKind && (ext.extensionKind === 'web' || ext.extensionKind.includes('web'))));
const remoteAgentConnection = this._remoteAgentService.getConnection();
this._runningLocation = this._runningLocationClassifier.determineRunningLocation(localExtensions, remoteExtensions);
@@ -188,7 +190,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten
const result = this._registry.deltaExtensions(remoteExtensions.concat(localExtensions), []);
if (result.removedDueToLooping.length > 0) {
this._logOrShowMessage(Severity.Error, nls.localize('looping', "The following extensions contain dependency loops and have been disabled: {0}", result.removedDueToLooping.map(e => `'${e.identifier.value}'`).join(', ')));
this._logOrShowMessage(Severity.Error, nls.localize('looping', 'The following extensions contain dependency loops and have been disabled: {0}', result.removedDueToLooping.map(e => `'${e.identifier.value}'`).join(', ')));
}
if (remoteEnv && remoteAgentConnection) {

View File

@@ -37,7 +37,8 @@ export function canExecuteOnWorkspace(manifest: IExtensionManifest, productServi
export function canExecuteOnWeb(manifest: IExtensionManifest, productService: IProductService, configurationService: IConfigurationService): boolean {
const extensionKind = getExtensionKind(manifest, productService, configurationService);
return extensionKind.some(kind => kind === 'web');
// NOTE@coder: Hardcode vim for now.
return extensionKind.some(kind => kind === 'web') || manifest.name === 'vim';
}
export function getExtensionKind(manifest: IExtensionManifest, productService: IProductService, configurationService: IConfigurationService): ExtensionKind[] {

View File

@@ -16,11 +16,12 @@ import { IInitData } from 'vs/workbench/api/common/extHost.protocol';
import { MessageType, createMessageOfType, isMessageOfType, IExtHostSocketMessage, IExtHostReadyMessage, IExtHostReduceGraceTimeMessage, ExtensionHostExitCode } from 'vs/workbench/services/extensions/common/extensionHostProtocol';
import { ExtensionHostMain, IExitFn } from 'vs/workbench/services/extensions/common/extensionHostMain';
import { VSBuffer } from 'vs/base/common/buffer';
import { IURITransformer, URITransformer, IRawURITransformer } from 'vs/base/common/uriIpc';
import { IURITransformer, URITransformer } from 'vs/base/common/uriIpc';
import { exists } from 'vs/base/node/pfs';
import { realpath } from 'vs/base/node/extpath';
import { IHostUtils } from 'vs/workbench/api/common/extHostExtensionService';
import { RunOnceScheduler } from 'vs/base/common/async';
import * as proxyAgent from 'vs/base/node/proxy_agent';
import 'vs/workbench/api/common/extHost.common.services';
import 'vs/workbench/api/node/extHost.node.services';
@@ -57,12 +58,13 @@ const args = minimist(process.argv.slice(2), {
const Module = require.__$__nodeRequire('module') as any;
const originalLoad = Module._load;
Module._load = function (request: string) {
Module._load = function (request: string, parent: object, isMain: boolean) {
if (request === 'natives') {
throw new Error('Either the extension or a NPM dependency is using the "natives" node module which is unsupported as it can cause a crash of the extension host. Click [here](https://go.microsoft.com/fwlink/?linkid=871887) to find out more');
}
return originalLoad.apply(this, arguments);
// NOTE@coder: Map node_module.asar requests to regular node_modules.
return originalLoad.apply(this, [request.replace(/node_modules\.asar(\.unpacked)?/, 'node_modules'), parent, isMain]);
};
})();
@@ -135,8 +137,11 @@ function _createExtHostProtocol(): Promise<PersistentProtocol> {
// Wait for rich client to reconnect
protocol.onSocketClose(() => {
// The socket has closed, let's give the renderer a certain amount of time to reconnect
disconnectRunner1.schedule();
// NOTE@coder: Inform the server so we can manage offline
// connections there instead. Our goal is to persist connections
// forever (to a reasonable point) to account for things like
// hibernating overnight.
process.send!({ type: 'VSCODE_EXTHOST_DISCONNECTED' });
});
}
}
@@ -295,6 +300,7 @@ function connectToRenderer(protocol: IMessagePassingProtocol): Promise<IRenderer
}
export async function startExtensionHostProcess(): Promise<void> {
proxyAgent.monkeyPatch(true);
const protocol = await createExtHostProtocol();
const renderer = await connectToRenderer(protocol);
@@ -313,11 +319,9 @@ export async function startExtensionHostProcess(): Promise<void> {
// Attempt to load uri transformer
let uriTransformer: IURITransformer | null = null;
if (initData.remote.authority && args.uriTransformerPath) {
if (initData.remote.authority) {
try {
const rawURITransformerFactory = <any>require.__$__nodeRequire(args.uriTransformerPath);
const rawURITransformer = <IRawURITransformer>rawURITransformerFactory(initData.remote.authority);
uriTransformer = new URITransformer(rawURITransformer);
uriTransformer = new URITransformer(initData.remote.authority);
} catch (e) {
console.error(e);
}

View File

@@ -15,7 +15,11 @@
require.config({
baseUrl: monacoBaseUrl,
catchError: true,
createTrustedScriptURL: (value: string) => value
createTrustedScriptURL: (value: string) => value,
paths: {
'@coder/node-browser': `../node_modules/@coder/node-browser/out/client/client.js`,
'@coder/requirefs': `../node_modules/@coder/requirefs/out/requirefs.js`,
}
});
require(['vs/workbench/services/extensions/worker/extensionHostWorker'], () => { }, err => console.error(err));

View File

@@ -5,8 +5,8 @@
import { createChannelSender } from 'vs/base/parts/ipc/common/ipc';
import { ILocalizationsService } from 'vs/platform/localizations/common/localizations';
import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService';
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
// @ts-ignore: interface is implemented via proxy
export class LocalizationsService implements ILocalizationsService {
@@ -14,9 +14,9 @@ export class LocalizationsService implements ILocalizationsService {
declare readonly _serviceBrand: undefined;
constructor(
@ISharedProcessService sharedProcessService: ISharedProcessService,
@IRemoteAgentService remoteAgentService: IRemoteAgentService,
) {
return createChannelSender<ILocalizationsService>(sharedProcessService.getChannel('localizations'));
return createChannelSender<ILocalizationsService>(remoteAgentService.getConnection()!.getChannel('localizations'));
}
}