move stuff back to workbench and remove log statements and use pid

This commit is contained in:
Megan Rogge 2021-02-18 15:13:34 -08:00
parent e95a5c1e1c
commit 9c8e2ae7af
10 changed files with 65 additions and 144 deletions

View file

@ -4,10 +4,9 @@
*--------------------------------------------------------------------------------------------*/
import { Event } from 'vs/base/common/event';
import { IDisposable } from 'vs/base/common/lifecycle';
import { IProcessEnvironment } from 'vs/base/common/platform';
import { URI } from 'vs/base/common/uri';
import { IGetTerminalLayoutInfoArgs, IOrphanQuestionReplyArgs, IPtyHostProcessReplayEvent, ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess';
import { IGetTerminalLayoutInfoArgs, IPtyHostProcessReplayEvent, ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess';
export interface IRawTerminalInstanceLayoutInfo<T> {
relativeSize: number;
@ -42,88 +41,6 @@ export interface IPtyHostAttachTarget {
export type ITerminalsLayoutInfo = IRawTerminalsLayoutInfo<IPtyHostAttachTarget | null>;
export type ITerminalsLayoutInfoById = IRawTerminalsLayoutInfo<number>;
export interface IBeforeProcessDataEvent {
/**
* The data of the event, this can be modified by the event listener to change what gets sent
* to the terminal.
*/
data: string;
}
export interface ITerminalProcessExtHostProxy extends IDisposable {
readonly terminalId: number;
emitData(data: string): void;
emitTitle(title: string): void;
emitReady(pid: number, cwd: string): void;
emitExit(exitCode: number | undefined): void;
emitOverrideDimensions(dimensions: ITerminalDimensions | undefined): void;
emitResolvedShellLaunchConfig(shellLaunchConfig: IShellLaunchConfig): void;
emitInitialCwd(initialCwd: string): void;
emitCwd(cwd: string): void;
emitLatency(latency: number): void;
onInput: Event<string>;
onResize: Event<{ cols: number, rows: number }>;
onAcknowledgeDataEvent: Event<number>;
onShutdown: Event<boolean>;
onRequestInitialCwd: Event<void>;
onRequestCwd: Event<void>;
onRequestLatency: Event<void>;
}
export interface ISpawnExtHostProcessRequest {
proxy: ITerminalProcessExtHostProxy;
shellLaunchConfig: IShellLaunchConfig;
activeWorkspaceRootUri: URI | undefined;
cols: number;
rows: number;
isWorkspaceShellAllowed: boolean;
callback: (error: ITerminalLaunchError | undefined) => void;
}
export interface IStartExtensionTerminalRequest {
proxy: ITerminalProcessExtHostProxy;
cols: number;
rows: number;
callback: (error: ITerminalLaunchError | undefined) => void;
}
export interface IShellDefinition {
label: string;
path: string;
}
export interface IAvailableShellsRequest {
callback: (shells: IShellDefinition[]) => void;
}
export interface IDefaultShellAndArgsRequest {
useAutomationShell: boolean;
callback: (shell: string, args: string[] | string | undefined) => void;
}
export enum LinuxDistro {
Fedora,
Ubuntu,
Unknown
}
export enum TitleEventSource {
/** From the API or the rename command that overrides any other type */
Api,
/** From the process name property*/
Process,
/** From the VT sequence */
Sequence
}
export interface IWindowsShellHelper extends IDisposable {
readonly onShellNameChange: Event<string>;
getShellName(): Promise<string>;
}
export interface IRawTerminalInstanceLayoutInfo<T> {
relativeSize: number;
terminal: T;
@ -200,8 +117,6 @@ export interface IPtyService {
setTerminalLayoutInfo(args: ISetTerminalLayoutInfoArgs): void;
getTerminalLayoutInfo(args: IGetTerminalLayoutInfoArgs): Promise<ITerminalsLayoutInfo | undefined>;
orphanQuestionReply(args: IOrphanQuestionReplyArgs): void;
}
export enum HeartbeatConstants {
@ -433,26 +348,3 @@ export interface ITerminalDimensionsOverride extends ITerminalDimensions {
*/
forceExactSize?: boolean;
}
export function printTime(ms: number): string {
let h = 0;
let m = 0;
let s = 0;
if (ms >= 1000) {
s = Math.floor(ms / 1000);
ms -= s * 1000;
}
if (s >= 60) {
m = Math.floor(s / 60);
s -= m * 60;
}
if (m >= 60) {
h = Math.floor(m / 60);
m -= h * 60;
}
const _h = h ? `${h}h` : ``;
const _m = m ? `${m}m` : ``;
const _s = s ? `${s}s` : ``;
const _ms = ms ? `${ms}ms` : ``;
return `${_h}${_m}${_s}${_ms}`;
}

View file

@ -12,7 +12,7 @@ import { ProxyChannel } from 'vs/base/parts/ipc/common/ipc';
import { IProcessEnvironment } from 'vs/base/common/platform';
import { Emitter } from 'vs/base/common/event';
import { LogLevelChannelClient } from 'vs/platform/log/common/logIpc';
import { IGetTerminalLayoutInfoArgs, IOrphanQuestionReplyArgs, IPtyHostProcessReplayEvent, ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess';
import { IGetTerminalLayoutInfoArgs, IPtyHostProcessReplayEvent, ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess';
enum Constants {
MaxRestarts = 5
@ -113,7 +113,6 @@ export class LocalPtyService extends Disposable implements IPtyService {
this._register(proxy.onProcessOverrideDimensions(e => this._onProcessOverrideDimensions.fire(e)));
this._register(proxy.onProcessResolvedShellLaunchConfig(e => this._onProcessResolvedShellLaunchConfig.fire(e)));
this._register(proxy.onProcessReplay(e => {
this._logService.info(`Replaying ${e}`);
this._onProcessReplay.fire(e);
}));
return [client, proxy];
@ -160,9 +159,6 @@ export class LocalPtyService extends Disposable implements IPtyService {
getLatency(id: number): Promise<number> {
return this._proxy.getLatency(id);
}
orphanQuestionReply(args: IOrphanQuestionReplyArgs): void {
return this._proxy.orphanQuestionReply(args);
}
public setTerminalLayoutInfo(args: ISetTerminalLayoutInfoArgs): void {
return this._proxy.setTerminalLayoutInfo(args);
}

View file

@ -5,7 +5,7 @@
import { Disposable } from 'vs/base/common/lifecycle';
import { IProcessEnvironment } from 'vs/base/common/platform';
import { IPtyService, IProcessDataEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, printTime, LocalReconnectConstants, ITerminalsLayoutInfo, IRawTerminalInstanceLayoutInfo, ITerminalTabLayoutInfoById, ITerminalInstanceLayoutInfoById } from 'vs/platform/terminal/common/terminal';
import { IPtyService, IProcessDataEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, LocalReconnectConstants, ITerminalsLayoutInfo, IRawTerminalInstanceLayoutInfo, ITerminalTabLayoutInfoById, ITerminalInstanceLayoutInfoById } from 'vs/platform/terminal/common/terminal';
import { AutoOpenBarrier, Queue, RunOnceScheduler } from 'vs/base/common/async';
import { Event, Emitter } from 'vs/base/common/event';
import { TerminalRecorder } from 'vs/platform/terminal/common/terminalRecorder';
@ -78,7 +78,6 @@ export class PtyService extends Disposable implements IPtyService {
async createProcess(shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, env: IProcessEnvironment, executableEnv: IProcessEnvironment, windowsEnableConpty: boolean, workspaceId: string, workspaceName: string): Promise<number> {
const id = ++currentPtyId;
this._logService.info('creating process', id);
const process = new TerminalProcess(shellLaunchConfig, cwd, cols, rows, env, executableEnv, windowsEnableConpty, this._logService);
process.onProcessData(event => this._onProcessData.fire({ id, event }));
process.onProcessExit(event => this._onProcessExit.fire({ id, event }));
@ -93,7 +92,7 @@ export class PtyService extends Disposable implements IPtyService {
const persistentTerminalProcess = new PersistentTerminalProcess(id, process, workspaceId, workspaceName, true, cols, rows, ipcHandlePath, this._logService, () => {
persistentTerminalProcess.dispose();
this._ptys.delete(id);
});
}, shellLaunchConfig.attachPersistentTerminal);
persistentTerminalProcess.onProcessReplay(event => this._onProcessReplay.fire({ id, event }));
persistentTerminalProcess.onProcessReady(event => this._onProcessReady.fire({ id, event }));
persistentTerminalProcess.onProcessTitleChanged(event => this._onProcessTitleChanged.fire({ id, event }));
@ -247,7 +246,8 @@ export class PersistentTerminalProcess extends Disposable {
cols: number, rows: number,
ipcHandlePath: string,
private readonly _logService: ILogService,
private readonly _onExit: () => void
private readonly _onExit: () => void,
private readonly _attachPersistentTerminal?: any
) {
super();
this._recorder = new TerminalRecorder(cols, rows);
@ -284,7 +284,6 @@ export class PersistentTerminalProcess extends Disposable {
// Buffer data events to reduce the amount of messages going to the renderer
// this._register(this._bufferer.startBuffering(this._persistentTerminalId, this._terminalProcess.onProcessData));
this._register(this._terminalProcess.onProcessData(e => {
// console.trace(`data ${e}`);
this._recorder.recordData(e);
}));
this._register(this._terminalProcess.onProcessExit(exitCode => {
@ -313,9 +312,11 @@ export class PersistentTerminalProcess extends Disposable {
await this._terminalProcess.start();
this._isStarted = true;
} else {
// TODO: Fix me
// this._onProcessReady.fire({ pid: (this._terminalProcess as any)._ptyProcess.pid, cwd: '' });
this._onProcessReady.fire({ pid: -1, cwd: '' });
if (!this._attachPersistentTerminal) {
this._onProcessReady.fire({ pid: -1, cwd: await this._terminalProcess.getCwd() });
} else {
this._onProcessReady.fire({ pid: this._attachPersistentTerminal.pid, cwd: await this._terminalProcess.getCwd() });
}
this._onProcessTitleChanged.fire(this._terminalProcess.currentTitle);
}
// TODO: Pass back launch error
@ -420,3 +421,26 @@ export class PersistentTerminalProcess extends Disposable {
return (Date.now() - this._orphanQuestionReplyTime > 500);
}
}
function printTime(ms: number): string {
let h = 0;
let m = 0;
let s = 0;
if (ms >= 1000) {
s = Math.floor(ms / 1000);
ms -= s * 1000;
}
if (s >= 60) {
m = Math.floor(s / 60);
s -= m * 60;
}
if (m >= 60) {
h = Math.floor(m / 60);
m -= h * 60;
}
const _h = h ? `${h}h` : ``;
const _m = m ? `${m}m` : ``;
const _s = s ? `${s}s` : ``;
const _ms = ms ? `${ms}ms` : ``;
return `${_h}${_m}${_s}${_ms}`;
}

View file

@ -7,14 +7,14 @@ import type { Terminal as XTermTerminal } from 'xterm';
import type { SearchAddon as XTermSearchAddon } from 'xterm-addon-search';
import type { Unicode11Addon as XTermUnicode11Addon } from 'xterm-addon-unicode11';
import type { WebglAddon as XTermWebglAddon } from 'xterm-addon-webgl';
import { IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalLaunchError, IDefaultShellAndArgsRequest, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, ITerminalProcessExtHostProxy, TitleEventSource, LinuxDistro, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ITerminalTabLayoutInfoById } from 'vs/platform/terminal/common/terminal';
import { IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ITerminalTabLayoutInfoById } from 'vs/platform/terminal/common/terminal';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
import { IProcessEnvironment, Platform } from 'vs/base/common/platform';
import { Event } from 'vs/base/common/event';
import { IDisposable } from 'vs/base/common/lifecycle';
import { FindReplaceState } from 'vs/editor/contrib/find/findState';
import { URI } from 'vs/base/common/uri';
import { IAvailableShellsRequest, ICommandTracker, INavigationMode, IRemoteTerminalAttachTarget, ITerminalConfigHelper, ITerminalNativeWindowsDelegate } from 'vs/workbench/contrib/terminal/common/terminal';
import { IAvailableShellsRequest, ICommandTracker, IDefaultShellAndArgsRequest, INavigationMode, IRemoteTerminalAttachTarget, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalNativeWindowsDelegate, ITerminalProcessExtHostProxy, IWindowsShellHelper, LinuxDistro, TitleEventSource } from 'vs/workbench/contrib/terminal/common/terminal';
import { ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess';
export const ITerminalService = createDecorator<ITerminalService>('terminalService');

View file

@ -125,10 +125,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce
}
public dispose(immediate: boolean = false): void {
this._logService.info(`process is undefined ${this.processState}`);
if (this._process) {
this._logService.info(`exiting ${this.processState}`);
// If the process was still connected this dispose came from
// within VS Code, not the process, so mark the process as
// killed by the user.
@ -211,7 +208,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce
}
});
this._process.onProcessReady(async (e: { pid: number, cwd: string }) => {
this._process.onProcessReady((e: { pid: number, cwd: string }) => {
this.shellProcessId = e.pid;
this._initialCwd = e.cwd;
this._onProcessReady.fire();
@ -388,7 +385,6 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce
if (this.processState === ProcessState.LAUNCHING) {
this.processState = ProcessState.KILLED_DURING_LAUNCH;
}
this._logService.info(`exiting ${exitCode}`);
// If TerminalInstance did not know about the process exit then it was
// triggered by the process, not on VS Code's side.

View file

@ -30,8 +30,8 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten
import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService';
import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle';
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
import { IShellDefinition, IShellLaunchConfig, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, ITerminalLaunchError, ITerminalProcessExtHostProxy, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, LinuxDistro } from 'vs/platform/terminal/common/terminal';
import { IAvailableShellsRequest, IRemoteTerminalAttachTarget, ITerminalConfigHelper, ITerminalNativeWindowsDelegate, KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { IShellLaunchConfig, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalsLayoutInfoById } from 'vs/platform/terminal/common/terminal';
import { IAvailableShellsRequest, IRemoteTerminalAttachTarget, IShellDefinition, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalNativeWindowsDelegate, ITerminalProcessExtHostProxy, KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE, LinuxDistro, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal';
interface IExtHostReadyEntry {
promise: Promise<void>;

View file

@ -9,9 +9,9 @@ import { IDisposable } from 'vs/base/common/lifecycle';
import { RawContextKey } from 'vs/platform/contextkey/common/contextkey';
import { URI } from 'vs/base/common/uri';
import { OperatingSystem } from 'vs/base/common/platform';
import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable';
import { IExtensionPointDescriptor } from 'vs/workbench/services/extensions/common/extensionsRegistry';
import { IProcessDataEvent, IShellDefinition, IShellLaunchConfig, ITerminalDimensions, ITerminalDimensionsOverride, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal';
import { IProcessDataEvent, IShellLaunchConfig, ITerminalDimensions, ITerminalDimensionsOverride, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal';
import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable';
export const TERMINAL_VIEW_ID = 'terminal';
@ -238,6 +238,27 @@ export interface IBeforeProcessDataEvent {
data: string;
}
export interface IShellDefinition {
label: string;
path: string;
}
export interface IAvailableShellsRequest {
callback: (shells: IShellDefinition[]) => void;
}
export interface IDefaultShellAndArgsRequest {
useAutomationShell: boolean;
callback: (shell: string, args: string[] | string | undefined) => void;
}
export interface IWindowsShellHelper extends IDisposable {
readonly onShellNameChange: Event<string>;
getShellName(): Promise<string>;
}
export interface ITerminalProcessManager extends IDisposable {
readonly processState: ProcessState;
readonly ptyProcessReady: Promise<void>;

View file

@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal';
import { IWindowsShellHelper, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY } from 'vs/workbench/contrib/terminal/common/terminal';
import { IWindowsShellHelper, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal';
import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/electron-browser/windowsShellHelper';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IProcessEnvironment, platform, Platform } from 'vs/base/common/platform';
@ -22,7 +22,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace
import { ILogService } from 'vs/platform/log/common/log';
import { getSystemShell } from 'vs/base/node/shell';
import { ILocalPtyService } from 'vs/platform/terminal/electron-sandbox/terminal';
import { IDefaultShellAndArgsRequest, IShellLaunchConfig, ITerminalChildProcess, ITerminalsLayoutInfo, ITerminalsLayoutInfoById } from 'vs/platform/terminal/common/terminal';
import { IShellLaunchConfig, ITerminalChildProcess, ITerminalsLayoutInfo, ITerminalsLayoutInfoById } from 'vs/platform/terminal/common/terminal';
import { LocalPty } from 'vs/workbench/contrib/terminal/electron-sandbox/localPty';
import { Emitter, Event } from 'vs/base/common/event';
import { Disposable } from 'vs/base/common/lifecycle';

View file

@ -74,14 +74,6 @@ export class LocalPty extends Disposable implements ITerminalChildProcess {
}
start(): Promise<ITerminalLaunchError | { persistentTerminalId: number; } | undefined> {
// this._persistentTerminalId = shellLaunchConfig.attachPersistentTerminal.id;
// this._onProcessReady.fire();
// setTimeout(() => {
// this._onProcessTitleChanged.fire(this._shellLaunchConfig.attachPersistentTerminal!.title);
// }, 0);
// TODO: Set this._persistentTerminalId
return this._localPtyService.start(this._localPtyId);
}

View file

@ -10,7 +10,7 @@ import { coalesce } from 'vs/base/common/arrays';
import { normalize, basename } from 'vs/base/common/path';
import { enumeratePowerShellInstallations } from 'vs/base/node/powershell';
import { getWindowsBuildNumber } from 'vs/platform/terminal/node/terminalEnvironment';
import { IShellDefinition, LinuxDistro } from 'vs/platform/terminal/common/terminal';
import { IShellDefinition, LinuxDistro } from 'vs/workbench/contrib/terminal/common/terminal';
let detectedDistro = LinuxDistro.Unknown;
if (platform.isLinux) {