Skip to content

Commit

Permalink
adopt DAP attribute "runInTerminal.shellProcessId"; fixes #63434
Browse files Browse the repository at this point in the history
  • Loading branch information
weinand committed Nov 19, 2018
1 parent ea771bd commit e40df57
Show file tree
Hide file tree
Showing 11 changed files with 67 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb
return Promise.resolve(this._proxy.$substituteVariables(folder ? folder.uri : undefined, config));
}

runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<void> {
runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<number | undefined> {
return Promise.resolve(this._proxy.$runInTerminal(args, config));
}

Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/api/node/extHost.protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -978,7 +978,7 @@ export type IDebugSessionDto = IDebugSessionFullDto | DebugSessionUUID;

export interface ExtHostDebugServiceShape {
$substituteVariables(folder: UriComponents | undefined, config: IConfig): Thenable<IConfig>;
$runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Thenable<void>;
$runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Thenable<number | undefined>;
$startDASession(handle: number, session: IDebugSessionDto): Thenable<void>;
$stopDASession(handle: number): Thenable<void>;
$sendDAMessage(handle: number, message: DebugProtocol.ProtocolMessage): void;
Expand Down
14 changes: 7 additions & 7 deletions src/vs/workbench/api/node/extHostDebugService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape {

// RPC methods (ExtHostDebugServiceShape)

public $runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Thenable<void> {
public $runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Thenable<number | undefined> {

if (args.kind === 'integrated') {

Expand Down Expand Up @@ -311,12 +311,12 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape {

this._integratedTerminalInstance.show();

return new Promise((resolve) => {
setTimeout(_ => {
const command = prepareCommand(args, config);
this._integratedTerminalInstance.sendText(command, true);
resolve(void 0);
}, 500);
return this._integratedTerminalInstance.processId.then(shellProcessId => {

const command = prepareCommand(args, config);
this._integratedTerminalInstance.sendText(command, true);

return shellProcessId;
});
});

Expand Down
6 changes: 3 additions & 3 deletions src/vs/workbench/parts/debug/common/debug.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ export interface IExpression extends IReplElement, IExpressionContainer {

export interface IDebugger {
createDebugAdapter(session: IDebugSession, outputService: IOutputService): Promise<IDebugAdapter>;
runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments): Promise<void>;
runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments): Promise<number | undefined>;
getCustomTelemetryService(): Thenable<TelemetryService>;
}

Expand Down Expand Up @@ -543,7 +543,7 @@ export interface IDebugAdapterProvider {
}

export interface ITerminalLauncher {
runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<void>;
runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<number | undefined>;
}

export interface ITerminalSettings {
Expand Down Expand Up @@ -602,7 +602,7 @@ export interface IConfigurationManager {
createDebugAdapter(session: IDebugSession): IDebugAdapter;

substituteVariables(debugType: string, folder: IWorkspaceFolder, config: IConfig): Promise<IConfig>;
runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<void>;
runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<number | undefined>;
}

export interface ILaunch {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ export class ConfigurationManager implements IConfigurationManager {
return Promise.resolve(config);
}

public runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<void> {
public runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<number | undefined> {
let tl: ITerminalLauncher = this.debugAdapterFactories.get(debugType);
if (!tl) {
if (!this.terminalLauncher) {
Expand Down
11 changes: 8 additions & 3 deletions src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts
Original file line number Diff line number Diff line change
Expand Up @@ -475,9 +475,14 @@ export class RawDebugSession {

switch (request.command) {
case 'runInTerminal':
dbgr.runInTerminal(<DebugProtocol.RunInTerminalRequestArguments>request.arguments).then(_ => {
response.body = {};
safeSendResponse(response);
dbgr.runInTerminal(request.arguments as DebugProtocol.RunInTerminalRequestArguments).then(shellProcessId => {
const resp = response as DebugProtocol.RunInTerminalResponse;
if (typeof shellProcessId === 'number') {
resp.body = {
shellProcessId: shellProcessId
};
}
safeSendResponse(resp);
}, err => {
response.success = false;
response.message = err.message;
Expand Down
30 changes: 24 additions & 6 deletions src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export class TerminalLauncher implements ITerminalLauncher {
) {
}

runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<void> {
runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<number | undefined> {

if (args.kind === 'external') {
return this.nativeTerminalService.runInTerminal(args.title, args.cwd, args.args, args.env || {});
Expand All @@ -44,12 +44,30 @@ export class TerminalLauncher implements ITerminalLauncher {
this.terminalService.setActiveInstance(t);
this.terminalService.showPanel(true);

return new Promise((resolve, error) => {
return new Promise<number | undefined>((resolve, error) => {

if (typeof t.processId === 'number') {
// no need to wait
resolve(t.processId);
}

// shell not ready: wait for ready event
const toDispose = t.onProcessIdReady(t => {
toDispose.dispose();
resolve(t.processId);
});

// do not wait longer than 1 second
setTimeout(_ => {
const command = prepareCommand(args, config);
t.sendText(command, true);
resolve(void 0);
}, 500);
error(new Error('terminal shell timeout'));
}, 1000);

}).then(shellProcessId => {

const command = prepareCommand(args, config);
t.sendText(command, true);

return shellProcessId;
});
}
}
2 changes: 1 addition & 1 deletion src/vs/workbench/parts/debug/node/debugger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export class Debugger implements IDebugger {
}
}

runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments): Promise<void> {
runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments): Promise<number | undefined> {
const config = this.configurationService.getValue<ITerminalSettings>('terminal');
return this.configurationManager.runInTerminal(this.inExtHost() ? this.type : '*', args, config);
}
Expand Down
22 changes: 11 additions & 11 deletions src/vs/workbench/parts/debug/node/terminals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ export function getDefaultTerminalWindows(): string {
}

abstract class TerminalLauncher implements ITerminalLauncher {
public runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<void> {
public runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<number | undefined> {
return this.runInTerminal0(args.title, args.cwd, args.args, args.env || {}, config);
}
runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, config): Promise<void> {
runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, config): Promise<number | undefined> {
return void 0;
}
}
Expand All @@ -79,11 +79,11 @@ class WinTerminalService extends TerminalLauncher {

private static readonly CMD = 'cmd.exe';

public runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise<void> {
public runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise<number | undefined> {

const exec = configuration.external.windowsExec || getDefaultTerminalWindows();

return new Promise<void>((c, e) => {
return new Promise<number | undefined>((c, e) => {

const title = `"${dir} - ${TERMINAL_TITLE}"`;
const command = `""${args.join('" "')}" & pause"`; // use '|' to only pause on non-zero exit code
Expand All @@ -107,7 +107,7 @@ class WinTerminalService extends TerminalLauncher {
const cmd = cp.spawn(WinTerminalService.CMD, cmdArgs, options);
cmd.on('error', e);

c(null);
c(undefined);
});
}
}
Expand All @@ -117,11 +117,11 @@ class MacTerminalService extends TerminalLauncher {
private static readonly DEFAULT_TERMINAL_OSX = 'Terminal.app';
private static readonly OSASCRIPT = '/usr/bin/osascript'; // osascript is the AppleScript interpreter on OS X

public runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise<void> {
public runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise<number | undefined> {

const terminalApp = configuration.external.osxExec || MacTerminalService.DEFAULT_TERMINAL_OSX;

return new Promise<void>((c, e) => {
return new Promise<number | undefined>((c, e) => {

if (terminalApp === MacTerminalService.DEFAULT_TERMINAL_OSX || terminalApp === 'iTerm.app') {

Expand Down Expand Up @@ -163,7 +163,7 @@ class MacTerminalService extends TerminalLauncher {
});
osa.on('exit', (code: number) => {
if (code === 0) { // OK
c(null);
c(undefined);
} else {
if (stderr) {
const lines = stderr.split('\n', 1);
Expand All @@ -184,12 +184,12 @@ class LinuxTerminalService extends TerminalLauncher {

private static readonly WAIT_MESSAGE = nls.localize('press.any.key', "Press any key to continue...");

public runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise<void> {
public runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise<number | undefined> {

const terminalConfig = configuration.external;
const execThenable: Thenable<string> = terminalConfig.linuxExec ? Promise.resolve(terminalConfig.linuxExec) : getDefaultTerminalLinuxReady();

return new Promise<void>((c, e) => {
return new Promise<number | undefined>((c, e) => {

let termArgs: string[] = [];
//termArgs.push('--title');
Expand Down Expand Up @@ -225,7 +225,7 @@ class LinuxTerminalService extends TerminalLauncher {
});
cmd.on('exit', (code: number) => {
if (code === 0) { // OK
c(null);
c(undefined);
} else {
if (stderr) {
const lines = stderr.split('\n', 1);
Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/parts/execution/common/execution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ export const ITerminalService = createDecorator<ITerminalService>('nativeTermina
export interface ITerminalService {
_serviceBrand: any;
openTerminal(path: string): void;
runInTerminal(title: string, cwd: string, args: string[], env: IProcessEnvironment): Promise<void>;
runInTerminal(title: string, cwd: string, args: string[], env: IProcessEnvironment): Promise<number | undefined>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@ export class WinTerminalService implements ITerminalService {
this.spawnTerminal(cp, configuration, processes.getWindowsShell(), cwd);
}

public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise<void> {
public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise<number | undefined> {

const configuration = this._configurationService.getValue<ITerminalConfiguration>();
const terminalConfig = configuration.terminal.external;
const exec = terminalConfig.windowsExec || getDefaultTerminalWindows();

return new Promise<void>((c, e) => {
return new Promise<number | undefined>((c, e) => {

const title = `"${dir} - ${TERMINAL_TITLE}"`;
const command = `""${args.join('" "')}" & pause"`; // use '|' to only pause on non-zero exit code
Expand All @@ -67,7 +67,7 @@ export class WinTerminalService implements ITerminalService {
const cmd = cp.spawn(WinTerminalService.CMD, cmdArgs, options);
cmd.on('error', e);

c();
c(undefined);
});
}

Expand Down Expand Up @@ -128,13 +128,13 @@ export class MacTerminalService implements ITerminalService {
this.spawnTerminal(cp, configuration, cwd);
}

public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise<void> {
public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise<number | undefined> {

const configuration = this._configurationService.getValue<ITerminalConfiguration>();
const terminalConfig = configuration.terminal.external;
const terminalApp = terminalConfig.osxExec || DEFAULT_TERMINAL_OSX;

return new Promise<void>((c, e) => {
return new Promise<number | undefined>((c, e) => {

if (terminalApp === DEFAULT_TERMINAL_OSX || terminalApp === 'iTerm.app') {

Expand Down Expand Up @@ -176,7 +176,7 @@ export class MacTerminalService implements ITerminalService {
});
osa.on('exit', (code: number) => {
if (code === 0) { // OK
c();
c(undefined);
} else {
if (stderr) {
const lines = stderr.split('\n', 1);
Expand Down Expand Up @@ -220,13 +220,13 @@ export class LinuxTerminalService implements ITerminalService {
this.spawnTerminal(cp, configuration, cwd);
}

public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise<void> {
public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise<number | undefined> {

const configuration = this._configurationService.getValue<ITerminalConfiguration>();
const terminalConfig = configuration.terminal.external;
const execPromise = terminalConfig.linuxExec ? Promise.resolve(terminalConfig.linuxExec) : getDefaultTerminalLinuxReady();

return new Promise<void>((c, e) => {
return new Promise<number | undefined>((c, e) => {

let termArgs: string[] = [];
//termArgs.push('--title');
Expand Down Expand Up @@ -262,7 +262,7 @@ export class LinuxTerminalService implements ITerminalService {
});
cmd.on('exit', (code: number) => {
if (code === 0) { // OK
c();
c(undefined);
} else {
if (stderr) {
const lines = stderr.split('\n', 1);
Expand Down

0 comments on commit e40df57

Please sign in to comment.