diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index f996979629d..9b53ede5aee 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -86,7 +86,6 @@ import { ChecksumService } from 'vs/platform/checksum/node/checksumService'; import { CustomEndpointTelemetryService } from 'vs/platform/telemetry/node/customEndpointTelemetryService'; import { URI } from 'vs/base/common/uri'; import { joinPath } from 'vs/base/common/resources'; -import { registerTerminalPlatformConfiguration } from 'vs/platform/terminal/common/terminalPlatformConfiguration'; class SharedProcessMain extends Disposable { @@ -116,7 +115,6 @@ class SharedProcessMain extends Disposable { // Config registerUserDataSyncConfiguration(); - registerTerminalPlatformConfiguration(); instantiationService.invokeFunction(accessor => { const logService = accessor.get(ILogService); diff --git a/src/vs/platform/terminal/node/ptyHostService.ts b/src/vs/platform/terminal/node/ptyHostService.ts index 4202afee393..e82d2a8a611 100644 --- a/src/vs/platform/terminal/node/ptyHostService.ts +++ b/src/vs/platform/terminal/node/ptyHostService.ts @@ -16,6 +16,7 @@ import { IGetTerminalLayoutInfoArgs, IProcessDetails, IPtyHostProcessReplayEvent import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { detectAvailableProfiles } from 'vs/platform/terminal/node/terminalProfiles'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { registerTerminalPlatformConfiguration } from 'vs/platform/terminal/common/terminalPlatformConfiguration'; enum Constants { MaxRestarts = 5 @@ -77,9 +78,6 @@ export class PtyHostService extends Disposable implements IPtyService { private readonly _onProcessOrphanQuestion = this._register(new Emitter<{ id: number }>()); readonly onProcessOrphanQuestion = this._onProcessOrphanQuestion.event; - // TODO: Event for requesting variable resolving, track via id - this will be a round trip but - // seems like the only reasonable way to do this - constructor( @IConfigurationService private readonly _configurationService: IConfigurationService, @ILogService private readonly _logService: ILogService, @@ -87,6 +85,10 @@ export class PtyHostService extends Disposable implements IPtyService { ) { super(); + // Platform configuration is required on the process running the pty host (shared process or + // remote server). + registerTerminalPlatformConfiguration(); + this._register(toDisposable(() => this._disposePtyHost())); [this._client, this._proxy] = this._startPtyHost(); @@ -218,16 +220,8 @@ export class PtyHostService extends Disposable implements IPtyService { return this._proxy.getDefaultSystemShell(osOverride); } async getProfiles(includeDetectedProfiles: boolean = false): Promise { - // return detectAvailableProfiles(configuredProfilesOnly, safeConfigProvider, undefined, this._logService, await this._variableResolverPromise, this._lastActiveWorkspace); - // const variableResolver: IConfigurationResolverService { - // resolveAsync(folder: IWorkspaceFolder | undefined, value: string): Promise { - // } - // } as any; // TODO: invert config only arg - const r = await detectAvailableProfiles(!includeDetectedProfiles, this._buildSafeConfigProvider(), undefined, this._logService, this._resolveVariables.bind(this)); - this._logService.info('profiles', r); - return r; - // return this._proxy.getProfiles?.(includeDetectedProfiles) || []; + return detectAvailableProfiles(!includeDetectedProfiles, this._buildSafeConfigProvider(), undefined, this._logService, this._resolveVariables.bind(this)); } getEnvironment(): Promise { return this._proxy.getEnvironment(); diff --git a/src/vs/platform/terminal/node/terminalProfiles.ts b/src/vs/platform/terminal/node/terminalProfiles.ts index 71dff41e5ac..abb965cabb4 100644 --- a/src/vs/platform/terminal/node/terminalProfiles.ts +++ b/src/vs/platform/terminal/node/terminalProfiles.ts @@ -42,7 +42,6 @@ export function detectAvailableProfiles( workspaceFolder ); } - console.log('config provider result', safeConfigProvider(`terminal.integrated.profiles.${isMacintosh ? 'osx' : 'linux'}`)); return detectAvailableUnixProfiles( fsProvider, logService, @@ -154,12 +153,7 @@ async function transformToTerminalProfiles(entries: IterableIterator<[string, IT icon = profile.icon; } - // const paths = originalPaths.slice(); - const paths = (await variableResolver?.(originalPaths)) || originalPaths.slice(); - // for (let i = 0; i < paths.length; i++) { - // paths[i] = await variableResolver?.resolveAsync(workspaceFolder, paths[i]) || paths[i]; - // } const validatedProfile = await validateProfilePaths(profileName, defaultProfileName, paths, fsProvider, args, profile.env, profile.overrideName, profile.isAutoDetected, logService); if (validatedProfile) { validatedProfile.isAutoDetected = profile.isAutoDetected; @@ -290,8 +284,6 @@ async function detectAvailableUnixProfiles( applyConfigProfilesToMap(configProfiles, detectedProfiles); - console.log('detected', detectedProfiles); - return await transformToTerminalProfiles(detectedProfiles.entries(), defaultProfileName, fsProvider, logService, variableResolver, workspaceFolder); } diff --git a/src/vs/workbench/contrib/terminal/browser/remoteTerminalService.ts b/src/vs/workbench/contrib/terminal/browser/remoteTerminalService.ts index bee67ce7549..56297e33b8e 100644 --- a/src/vs/workbench/contrib/terminal/browser/remoteTerminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/remoteTerminalService.ts @@ -6,7 +6,9 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { revive } from 'vs/base/common/marshalling'; +import { Schemas } from 'vs/base/common/network'; import { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform'; +import { withNullAsUndefined } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -14,11 +16,14 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ILogService } from 'vs/platform/log/common/log'; import { INotificationHandle, INotificationService, IPromptChoice, Severity } from 'vs/platform/notification/common/notification'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { IShellLaunchConfig, IShellLaunchConfigDto, ITerminalChildProcess, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById } from 'vs/platform/terminal/common/terminal'; +import { IRequestResolveVariablesEvent, IShellLaunchConfig, IShellLaunchConfigDto, ITerminalChildProcess, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById } from 'vs/platform/terminal/common/terminal'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { RemotePty } from 'vs/workbench/contrib/terminal/browser/remotePty'; import { IRemoteTerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { ICompleteTerminalConfiguration, RemoteTerminalChannelClient, REMOTE_TERMINAL_CHANNEL_NAME } from 'vs/workbench/contrib/terminal/common/remoteTerminalChannel'; import { IRemoteTerminalAttachTarget, ITerminalConfigHelper } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; +import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; export class RemoteTerminalService extends Disposable implements IRemoteTerminalService { @@ -34,6 +39,8 @@ export class RemoteTerminalService extends Disposable implements IRemoteTerminal readonly onPtyHostResponsive = this._onPtyHostResponsive.event; private readonly _onPtyHostRestart = this._register(new Emitter()); readonly onPtyHostRestart = this._onPtyHostRestart.event; + private readonly _onPtyHostRequestResolveVariables = this._register(new Emitter()); + readonly onPtyHostRequestResolveVariables = this._onPtyHostRequestResolveVariables.event; constructor( @IRemoteAgentService private readonly _remoteAgentService: IRemoteAgentService, @@ -41,7 +48,10 @@ export class RemoteTerminalService extends Disposable implements IRemoteTerminal @IInstantiationService private readonly _instantiationService: IInstantiationService, @ICommandService private readonly _commandService: ICommandService, @INotificationService notificationService: INotificationService, - @IRemoteAuthorityResolverService private readonly _remoteAuthorityResolverService: IRemoteAuthorityResolverService + @IRemoteAuthorityResolverService private readonly _remoteAuthorityResolverService: IRemoteAuthorityResolverService, + @IWorkspaceContextService workspaceContextService: IWorkspaceContextService, + @IConfigurationResolverService configurationResolverService: IConfigurationResolverService, + @IHistoryService historyService: IHistoryService ) { super(); @@ -122,6 +132,13 @@ export class RemoteTerminalService extends Disposable implements IRemoteTerminal this._onPtyHostResponsive.fire(); })); } + this._register(channel.onPtyHostRequestResolveVariables(async e => { + const activeWorkspaceRootUri = historyService.getLastActiveWorkspaceRoot(Schemas.file); + const lastActiveWorkspaceRoot = activeWorkspaceRootUri ? withNullAsUndefined(workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri)) : undefined; + const resolveCalls: Promise[] = e.text.map(t => configurationResolverService.resolveAsync(lastActiveWorkspaceRoot, t)); + const result = await Promise.all(resolveCalls); + channel.acceptPtyHostResolvedVariables(e.id, result); + })); } else { this._remoteTerminalChannel = null; } diff --git a/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts b/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts index 51c08227e84..f3a3954f989 100644 --- a/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts +++ b/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts @@ -18,7 +18,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { Schemas } from 'vs/base/common/network'; import { ILabelService } from 'vs/platform/label/common/label'; import { IEnvironmentVariableService, ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; -import { IProcessDataEvent, IShellLaunchConfig, IShellLaunchConfigDto, ITerminalDimensionsOverride, ITerminalEnvironment, ITerminalLaunchError, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalShellType } from 'vs/platform/terminal/common/terminal'; +import { IProcessDataEvent, IRequestResolveVariablesEvent, IShellLaunchConfig, IShellLaunchConfigDto, ITerminalDimensionsOverride, ITerminalEnvironment, ITerminalLaunchError, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalShellType } from 'vs/platform/terminal/common/terminal'; import { IGetTerminalLayoutInfoArgs, IProcessDetails, IPtyHostProcessReplayEvent, ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess'; import { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform'; @@ -84,6 +84,9 @@ export class RemoteTerminalChannelClient { get onPtyHostResponsive(): Event { return this._channel.listen('$onPtyHostResponsiveEvent'); } + get onPtyHostRequestResolveVariables(): Event { + return this._channel.listen('$onPtyHostRequestResolveVariablesEvent'); + } get onProcessData(): Event<{ id: number, event: IProcessDataEvent | string }> { return this._channel.listen<{ id: number, event: IProcessDataEvent | string }>('$onProcessDataEvent'); } @@ -238,6 +241,9 @@ export class RemoteTerminalChannelClient { getProfiles(includeDetectedProfiles?: boolean): Promise { return this._channel.call('$getProfiles', [includeDetectedProfiles]); } + acceptPtyHostResolvedVariables(id: number, resolved: string[]) { + return this._channel.call('$acceptPtyHostResolvedVariables', [id, resolved]); + } getEnvironment(): Promise { return this._channel.call('$getEnvironment'); diff --git a/src/vs/workbench/contrib/terminal/electron-sandbox/localTerminalService.ts b/src/vs/workbench/contrib/terminal/electron-sandbox/localTerminalService.ts index 4f79c9e3678..e70b41e3222 100644 --- a/src/vs/workbench/contrib/terminal/electron-sandbox/localTerminalService.ts +++ b/src/vs/workbench/contrib/terminal/electron-sandbox/localTerminalService.ts @@ -104,12 +104,10 @@ export class LocalTerminalService extends Disposable implements ILocalTerminalSe } if (this._localPtyService.onPtyHostRequestResolveVariables) { this._register(this._localPtyService.onPtyHostRequestResolveVariables(async e => { - this._logService.info('localTerminalService request', e.id, e.text); const activeWorkspaceRootUri = historyService.getLastActiveWorkspaceRoot(Schemas.file); const lastActiveWorkspaceRoot = activeWorkspaceRootUri ? withNullAsUndefined(this._workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri)) : undefined; const resolveCalls: Promise[] = e.text.map(t => configurationResolverService.resolveAsync(lastActiveWorkspaceRoot, t)); const result = await Promise.all(resolveCalls); - this._logService.info('resolved', result); this._localPtyService.acceptPtyHostResolvedVariables?.(e.id, result); })); }