From 122680eff1a3b60c7ac8e0e316776b3a08fb10fc Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 4 Dec 2024 10:32:07 -0800 Subject: [PATCH 1/6] guard against wsl --- src/client/common/terminal/service.ts | 4 ++-- src/client/common/utils/platform.ts | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/client/common/terminal/service.ts b/src/client/common/terminal/service.ts index e37539f1bc7c..90a074aa3a8c 100644 --- a/src/client/common/terminal/service.ts +++ b/src/client/common/terminal/service.ts @@ -21,7 +21,7 @@ import { } from './types'; import { traceVerbose } from '../../logging'; import { getConfiguration } from '../vscodeApis/workspaceApis'; -import { isWindows } from '../utils/platform'; +import { isWindows, isWsl } from '../utils/platform'; @injectable() export class TerminalService implements ITerminalService, Disposable { @@ -105,7 +105,7 @@ export class TerminalService implements ITerminalService, Disposable { const config = getConfiguration('python'); const pythonrcSetting = config.get('terminal.shellIntegration.enabled'); - if ((isPythonShell && !pythonrcSetting) || (isPythonShell && isWindows())) { + if ((isPythonShell && !pythonrcSetting) || (isPythonShell && isWindows()) || (isPythonShell && isWsl())) { // If user has explicitly disabled SI for Python, use sendText for inside Terminal REPL. terminal.sendText(commandLine); return undefined; diff --git a/src/client/common/utils/platform.ts b/src/client/common/utils/platform.ts index c86f5ff9364e..c81d93cf9739 100644 --- a/src/client/common/utils/platform.ts +++ b/src/client/common/utils/platform.ts @@ -3,8 +3,8 @@ 'use strict'; +import { env } from 'vscode'; import { EnvironmentVariables } from '../variables/types'; - export enum Architecture { Unknown = 1, x86 = 2, @@ -30,6 +30,10 @@ export function getOSType(platform: string = process.platform): OSType { } } +export function isWsl(): boolean { + return env.remoteName === 'wsl'; +} + const architectures: Record = { x86: Architecture.x86, // 32-bit x64: Architecture.x64, // 64-bit From 40ca44fd786be0808c41ce8fe7c94dd1c415e2a6 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 4 Dec 2024 10:33:36 -0800 Subject: [PATCH 2/6] test --- .../common/terminals/service.unit.test.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/common/terminals/service.unit.test.ts b/src/test/common/terminals/service.unit.test.ts index 147803a72598..b320d68d2459 100644 --- a/src/test/common/terminals/service.unit.test.ts +++ b/src/test/common/terminals/service.unit.test.ts @@ -44,6 +44,7 @@ suite('Terminal Service', () => { let pythonConfig: TypeMoq.IMock; let editorConfig: TypeMoq.IMock; let isWindowsStub: sinon.SinonStub; + let isWslStub: sinon.SinonStub; setup(() => { terminal = TypeMoq.Mock.ofType(); @@ -97,6 +98,7 @@ suite('Terminal Service', () => { mockServiceContainer.setup((c) => c.get(ITerminalAutoActivation)).returns(() => terminalAutoActivator.object); getConfigurationStub = sinon.stub(workspaceApis, 'getConfiguration'); isWindowsStub = sinon.stub(platform, 'isWindows'); + isWslStub = sinon.stub(platform, 'isWsl'); pythonConfig = TypeMoq.Mock.ofType(); editorConfig = TypeMoq.Mock.ofType(); getConfigurationStub.callsFake((section: string) => { @@ -278,6 +280,29 @@ suite('Terminal Service', () => { terminal.verify((t) => t.sendText(TypeMoq.It.isValue(textToSend)), TypeMoq.Times.exactly(1)); }); + test('Ensure sendText IS called even when Python shell integration and terminal shell integration are both enabled - WSL', async () => { + isWindowsStub.returns(false); + isWslStub.returns(true); + pythonConfig + .setup((p) => p.get('terminal.shellIntegration.enabled')) + .returns(() => true) + .verifiable(TypeMoq.Times.once()); + + terminalHelper + .setup((helper) => helper.getEnvironmentActivationCommands(TypeMoq.It.isAny(), TypeMoq.It.isAny())) + .returns(() => Promise.resolve(undefined)); + service = new TerminalService(mockServiceContainer.object); + const textToSend = 'Some Text'; + terminalHelper.setup((h) => h.identifyTerminalShell(TypeMoq.It.isAny())).returns(() => TerminalShellType.bash); + terminalManager.setup((t) => t.createTerminal(TypeMoq.It.isAny())).returns(() => terminal.object); + + service.ensureTerminal(); + service.executeCommand(textToSend, true); + + terminal.verify((t) => t.show(TypeMoq.It.isValue(true)), TypeMoq.Times.exactly(1)); + terminal.verify((t) => t.sendText(TypeMoq.It.isValue(textToSend)), TypeMoq.Times.exactly(1)); + }); + test('Ensure terminal is not shown if `hideFromUser` option is set to `true`', async () => { terminalHelper .setup((helper) => helper.getEnvironmentActivationCommands(TypeMoq.It.isAny(), TypeMoq.It.isAny())) From 72096c3f687820e28291a8ef4d0157aba5c91067 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 4 Dec 2024 10:42:44 -0800 Subject: [PATCH 3/6] default to false --- src/test/common/terminals/service.unit.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/common/terminals/service.unit.test.ts b/src/test/common/terminals/service.unit.test.ts index b320d68d2459..6dbfd6fe7a5f 100644 --- a/src/test/common/terminals/service.unit.test.ts +++ b/src/test/common/terminals/service.unit.test.ts @@ -107,6 +107,7 @@ suite('Terminal Service', () => { } return editorConfig.object; }); + isWindowsStub.returns(false); }); teardown(() => { if (service) { From 48855878fe8d22f09ffb836c06a280f06a9fa245 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 4 Dec 2024 10:44:37 -0800 Subject: [PATCH 4/6] take suggestion to refactor --- src/client/common/terminal/service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/common/terminal/service.ts b/src/client/common/terminal/service.ts index 90a074aa3a8c..ff94103c36e1 100644 --- a/src/client/common/terminal/service.ts +++ b/src/client/common/terminal/service.ts @@ -105,7 +105,7 @@ export class TerminalService implements ITerminalService, Disposable { const config = getConfiguration('python'); const pythonrcSetting = config.get('terminal.shellIntegration.enabled'); - if ((isPythonShell && !pythonrcSetting) || (isPythonShell && isWindows()) || (isPythonShell && isWsl())) { + if (isPythonShell && (!pythonrcSetting || isWindows() || isWsl())) { // If user has explicitly disabled SI for Python, use sendText for inside Terminal REPL. terminal.sendText(commandLine); return undefined; From a91bc957b47a4246f82a61e67885f1995a26d4af Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 4 Dec 2024 11:03:38 -0800 Subject: [PATCH 5/6] move isWsl to separate file outside of platform --- src/client/common/terminal/service.ts | 3 ++- src/client/common/utils/envApis.ts | 10 ++++++++++ src/client/common/utils/platform.ts | 5 ----- src/test/common/terminals/service.unit.test.ts | 3 ++- 4 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 src/client/common/utils/envApis.ts diff --git a/src/client/common/terminal/service.ts b/src/client/common/terminal/service.ts index ff94103c36e1..a51ffd88aa0c 100644 --- a/src/client/common/terminal/service.ts +++ b/src/client/common/terminal/service.ts @@ -21,7 +21,8 @@ import { } from './types'; import { traceVerbose } from '../../logging'; import { getConfiguration } from '../vscodeApis/workspaceApis'; -import { isWindows, isWsl } from '../utils/platform'; +import { isWindows } from '../utils/platform'; +import { isWsl } from '../utils/envApis'; @injectable() export class TerminalService implements ITerminalService, Disposable { diff --git a/src/client/common/utils/envApis.ts b/src/client/common/utils/envApis.ts new file mode 100644 index 000000000000..ad9889882f02 --- /dev/null +++ b/src/client/common/utils/envApis.ts @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { env } from 'vscode'; + +export function isWsl(): boolean { + return env.remoteName === 'wsl'; +} diff --git a/src/client/common/utils/platform.ts b/src/client/common/utils/platform.ts index c81d93cf9739..5dc846a61f0c 100644 --- a/src/client/common/utils/platform.ts +++ b/src/client/common/utils/platform.ts @@ -3,7 +3,6 @@ 'use strict'; -import { env } from 'vscode'; import { EnvironmentVariables } from '../variables/types'; export enum Architecture { Unknown = 1, @@ -30,10 +29,6 @@ export function getOSType(platform: string = process.platform): OSType { } } -export function isWsl(): boolean { - return env.remoteName === 'wsl'; -} - const architectures: Record = { x86: Architecture.x86, // 32-bit x64: Architecture.x64, // 64-bit diff --git a/src/test/common/terminals/service.unit.test.ts b/src/test/common/terminals/service.unit.test.ts index 6dbfd6fe7a5f..ed622ac10d37 100644 --- a/src/test/common/terminals/service.unit.test.ts +++ b/src/test/common/terminals/service.unit.test.ts @@ -25,6 +25,7 @@ import { ITerminalAutoActivation } from '../../../client/terminals/types'; import { createPythonInterpreter } from '../../utils/interpreters'; import * as workspaceApis from '../../../client/common/vscodeApis/workspaceApis'; import * as platform from '../../../client/common/utils/platform'; +import * as envApis from '../../../client/common/utils/envApis'; suite('Terminal Service', () => { let service: TerminalService; @@ -98,7 +99,7 @@ suite('Terminal Service', () => { mockServiceContainer.setup((c) => c.get(ITerminalAutoActivation)).returns(() => terminalAutoActivator.object); getConfigurationStub = sinon.stub(workspaceApis, 'getConfiguration'); isWindowsStub = sinon.stub(platform, 'isWindows'); - isWslStub = sinon.stub(platform, 'isWsl'); + isWslStub = sinon.stub(envApis, 'isWsl'); pythonConfig = TypeMoq.Mock.ofType(); editorConfig = TypeMoq.Mock.ofType(); getConfigurationStub.callsFake((section: string) => { From 494479f520bd3f98e7ed5d7e641f08bc5957adb4 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 4 Dec 2024 11:09:32 -0800 Subject: [PATCH 6/6] add env.remoteName mock to vscode-mock.ts --- src/test/vscode-mock.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/vscode-mock.ts b/src/test/vscode-mock.ts index 0605b1718166..9ef7bed28c61 100644 --- a/src/test/vscode-mock.ts +++ b/src/test/vscode-mock.ts @@ -45,6 +45,7 @@ export function initialize() { const clipboard = new MockClipboard(); when(mockedVSCodeNamespaces.env!.clipboard).thenReturn(clipboard); when(mockedVSCodeNamespaces.env!.appName).thenReturn('Insider'); + when(mockedVSCodeNamespaces.env!.remoteName).thenReturn('Notwsl'); // This API is used in src/client/telemetry/telemetry.ts const extension = mock>();