move externalTerminalService from electron-browser to node; fixes #76174

This commit is contained in:
Andre Weinand 2019-07-03 10:29:54 +02:00
parent 9e818acf0a
commit 33c187558e
8 changed files with 105 additions and 113 deletions

View file

@ -133,7 +133,7 @@ class MacTerminalService extends TerminalLauncher {
// and then launches the program inside that window.
const script = terminalApp === MacTerminalService.DEFAULT_TERMINAL_OSX ? 'TerminalHelper' : 'iTermHelper';
const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/electron-browser/${script}.scpt`);
const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/node/${script}.scpt`);
const osaArgs = [
scriptpath,

View file

@ -4,19 +4,13 @@
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls';
import * as env from 'vs/base/common/platform';
import { Registry } from 'vs/platform/registry/common/platform';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
import * as paths from 'vs/base/common/path';
import { URI as uri } from 'vs/base/common/uri';
import { IExternalTerminalConfiguration, IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal';
import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions';
import { KeyMod, KeyCode } from 'vs/base/common/keyCodes';
import { Extensions, IConfigurationRegistry, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
import { ITerminalService as IIntegratedTerminalService, KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal';
import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal';
import { WindowsExternalTerminalService, MacExternalTerminalService, LinuxExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminalService';
import { IHistoryService } from 'vs/workbench/services/history/common/history';
import { ResourceContextKey } from 'vs/workbench/common/resources';
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
@ -28,56 +22,6 @@ import { Schemas } from 'vs/base/common/network';
import { distinct } from 'vs/base/common/arrays';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
if (env.isWindows) {
registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true);
} else if (env.isMacintosh) {
registerSingleton(IExternalTerminalService, MacExternalTerminalService, true);
} else if (env.isLinux) {
registerSingleton(IExternalTerminalService, LinuxExternalTerminalService, true);
}
getDefaultTerminalLinuxReady().then(defaultTerminalLinux => {
let configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
configurationRegistry.registerConfiguration({
id: 'externalTerminal',
order: 100,
title: nls.localize('terminalConfigurationTitle', "External Terminal"),
type: 'object',
properties: {
'terminal.explorerKind': {
type: 'string',
enum: [
'integrated',
'external'
],
enumDescriptions: [
nls.localize('terminal.explorerKind.integrated', "Use VS Code's integrated terminal."),
nls.localize('terminal.explorerKind.external', "Use the configured external terminal.")
],
description: nls.localize('explorer.openInTerminalKind', "Customizes what kind of terminal to launch."),
default: 'integrated'
},
'terminal.external.windowsExec': {
type: 'string',
description: nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."),
default: getDefaultTerminalWindows(),
scope: ConfigurationScope.APPLICATION
},
'terminal.external.osxExec': {
type: 'string',
description: nls.localize('terminal.external.osxExec', "Customizes which terminal application to run on macOS."),
default: DEFAULT_TERMINAL_OSX,
scope: ConfigurationScope.APPLICATION
},
'terminal.external.linuxExec': {
type: 'string',
description: nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."),
default: defaultTerminalLinux,
scope: ConfigurationScope.APPLICATION
}
}
});
});
const OPEN_IN_TERMINAL_COMMAND_ID = 'openInTerminal';
CommandsRegistry.registerCommand({

View file

@ -1,47 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as env from 'vs/base/common/platform';
import * as pfs from 'vs/base/node/pfs';
let _DEFAULT_TERMINAL_LINUX_READY: Promise<string> | null = null;
export function getDefaultTerminalLinuxReady(): Promise<string> {
if (!_DEFAULT_TERMINAL_LINUX_READY) {
_DEFAULT_TERMINAL_LINUX_READY = new Promise<string>(c => {
if (env.isLinux) {
Promise.all([pfs.exists('/etc/debian_version'), process.lazyEnv || Promise.resolve(undefined)]).then(([isDebian]) => {
if (isDebian) {
c('x-terminal-emulator');
} else if (process.env.DESKTOP_SESSION === 'gnome' || process.env.DESKTOP_SESSION === 'gnome-classic') {
c('gnome-terminal');
} else if (process.env.DESKTOP_SESSION === 'kde-plasma') {
c('konsole');
} else if (process.env.COLORTERM) {
c(process.env.COLORTERM);
} else if (process.env.TERM) {
c(process.env.TERM);
} else {
c('xterm');
}
});
return;
}
c('xterm');
});
}
return _DEFAULT_TERMINAL_LINUX_READY;
}
export const DEFAULT_TERMINAL_OSX = 'Terminal.app';
let _DEFAULT_TERMINAL_WINDOWS: string | null = null;
export function getDefaultTerminalWindows(): string {
if (!_DEFAULT_TERMINAL_WINDOWS) {
const isWoW64 = !!process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432');
_DEFAULT_TERMINAL_WINDOWS = `${process.env.windir ? process.env.windir : 'C:\\Windows'}\\${isWoW64 ? 'Sysnative' : 'System32'}\\cmd.exe`;
}
return _DEFAULT_TERMINAL_WINDOWS;
}

View file

@ -7,15 +7,21 @@ import * as cp from 'child_process';
import * as path from 'vs/base/common/path';
import * as processes from 'vs/base/node/processes';
import * as nls from 'vs/nls';
import * as pfs from 'vs/base/node/pfs';
import * as env from 'vs/base/common/platform';
import { assign } from 'vs/base/common/objects';
import { IExternalTerminalService, IExternalTerminalConfiguration } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal';
import { IProcessEnvironment } from 'vs/base/common/platform';
import { getPathFromAmdModule } from 'vs/base/common/amd';
import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
import { Registry } from 'vs/platform/registry/common/platform';
export const DEFAULT_TERMINAL_OSX = 'Terminal.app';
const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console");
enum WinSpawnType {
CMD,
CMDER
@ -37,7 +43,7 @@ export class WindowsExternalTerminalService implements IExternalTerminalService
this.spawnTerminal(cp, configuration, processes.getWindowsShell(), cwd);
}
public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise<number | undefined> {
public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise<number | undefined> {
const configuration = this._configurationService.getValue<IExternalTerminalConfiguration>();
const terminalConfig = configuration.terminal.external;
@ -128,7 +134,7 @@ export class MacExternalTerminalService implements IExternalTerminalService {
this.spawnTerminal(cp, configuration, cwd);
}
public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise<number | undefined> {
public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise<number | undefined> {
const configuration = this._configurationService.getValue<IExternalTerminalConfiguration>();
const terminalConfig = configuration.terminal.external;
@ -142,7 +148,7 @@ export class MacExternalTerminalService implements IExternalTerminalService {
// and then launches the program inside that window.
const script = terminalApp === DEFAULT_TERMINAL_OSX ? 'TerminalHelper' : 'iTermHelper';
const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/electron-browser/${script}.scpt`);
const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/node/${script}.scpt`);
const osaArgs = [
scriptpath,
@ -224,7 +230,7 @@ export class LinuxExternalTerminalService implements IExternalTerminalService {
this.spawnTerminal(cp, configuration, cwd);
}
public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise<number | undefined> {
public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise<number | undefined> {
const configuration = this._configurationService.getValue<IExternalTerminalConfiguration>();
const terminalConfig = configuration.terminal.external;
@ -310,3 +316,92 @@ function quote(args: string[]): string {
}
return r;
}
let _DEFAULT_TERMINAL_WINDOWS: string | null = null;
export function getDefaultTerminalWindows(): string {
if (!_DEFAULT_TERMINAL_WINDOWS) {
const isWoW64 = !!process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432');
_DEFAULT_TERMINAL_WINDOWS = `${process.env.windir ? process.env.windir : 'C:\\Windows'}\\${isWoW64 ? 'Sysnative' : 'System32'}\\cmd.exe`;
}
return _DEFAULT_TERMINAL_WINDOWS;
}
let _DEFAULT_TERMINAL_LINUX_READY: Promise<string> | null = null;
export function getDefaultTerminalLinuxReady(): Promise<string> {
if (!_DEFAULT_TERMINAL_LINUX_READY) {
_DEFAULT_TERMINAL_LINUX_READY = new Promise<string>(c => {
if (env.isLinux) {
Promise.all([pfs.exists('/etc/debian_version'), process.lazyEnv || Promise.resolve(undefined)]).then(([isDebian]) => {
if (isDebian) {
c('x-terminal-emulator');
} else if (process.env.DESKTOP_SESSION === 'gnome' || process.env.DESKTOP_SESSION === 'gnome-classic') {
c('gnome-terminal');
} else if (process.env.DESKTOP_SESSION === 'kde-plasma') {
c('konsole');
} else if (process.env.COLORTERM) {
c(process.env.COLORTERM);
} else if (process.env.TERM) {
c(process.env.TERM);
} else {
c('xterm');
}
});
return;
}
c('xterm');
});
}
return _DEFAULT_TERMINAL_LINUX_READY;
}
if (env.isWindows) {
registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true);
} else if (env.isMacintosh) {
registerSingleton(IExternalTerminalService, MacExternalTerminalService, true);
} else if (env.isLinux) {
registerSingleton(IExternalTerminalService, LinuxExternalTerminalService, true);
}
getDefaultTerminalLinuxReady().then(defaultTerminalLinux => {
let configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
configurationRegistry.registerConfiguration({
id: 'externalTerminal',
order: 100,
title: nls.localize('terminalConfigurationTitle', "External Terminal"),
type: 'object',
properties: {
'terminal.explorerKind': {
type: 'string',
enum: [
'integrated',
'external'
],
enumDescriptions: [
nls.localize('terminal.explorerKind.integrated', "Use VS Code's integrated terminal."),
nls.localize('terminal.explorerKind.external', "Use the configured external terminal.")
],
description: nls.localize('explorer.openInTerminalKind', "Customizes what kind of terminal to launch."),
default: 'integrated'
},
'terminal.external.windowsExec': {
type: 'string',
description: nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."),
default: getDefaultTerminalWindows(),
scope: ConfigurationScope.APPLICATION
},
'terminal.external.osxExec': {
type: 'string',
description: nls.localize('terminal.external.osxExec', "Customizes which terminal application to run on macOS."),
default: DEFAULT_TERMINAL_OSX,
scope: ConfigurationScope.APPLICATION
},
'terminal.external.linuxExec': {
type: 'string',
description: nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."),
default: defaultTerminalLinux,
scope: ConfigurationScope.APPLICATION
}
}
});
});

View file

@ -4,8 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { deepEqual, equal } from 'assert';
import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminalService';
import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal';
import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService, DEFAULT_TERMINAL_OSX, getDefaultTerminalWindows, getDefaultTerminalLinuxReady } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService';
suite('ExternalTerminalService', () => {
let mockOnExit: Function;

View file

@ -287,7 +287,8 @@ import 'vs/workbench/contrib/codeEditor/browser/codeEditor.contribution';
import 'vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution';
// Execution
import 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal.contribution';
import 'vs/workbench/contrib/externalTerminal/node/externalTerminalService';
import 'vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution';
// Snippets
import 'vs/workbench/contrib/snippets/browser/snippets.contribution';