From 2c09414b446bace791195bed318a56f977360eab Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Mon, 26 Feb 2024 22:48:26 +0530 Subject: [PATCH] Reactivate terminals if `.env` file changes (#22969) Closes https://github.com/microsoft/vscode-python/issues/22920 --- .../terminals/envCollectionActivation/service.ts | 11 ++++++++++- .../terminalEnvVarCollectionService.unit.test.ts | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/client/terminals/envCollectionActivation/service.ts b/src/client/terminals/envCollectionActivation/service.ts index aaa4ccf23bea..3ca0b39582ae 100644 --- a/src/client/terminals/envCollectionActivation/service.ts +++ b/src/client/terminals/envCollectionActivation/service.ts @@ -32,7 +32,7 @@ import { defaultShells } from '../../interpreter/activation/service'; import { IEnvironmentActivationService } from '../../interpreter/activation/types'; import { EnvironmentType, PythonEnvironment } from '../../pythonEnvironments/info'; import { getSearchPathEnvVarNames } from '../../common/utils/exec'; -import { EnvironmentVariables } from '../../common/variables/types'; +import { EnvironmentVariables, IEnvironmentVariablesProvider } from '../../common/variables/types'; import { TerminalShellType } from '../../common/terminal/types'; import { OSType } from '../../common/utils/platform'; import { normCase } from '../../common/platform/fs-paths'; @@ -81,6 +81,8 @@ export class TerminalEnvVarCollectionService implements IExtensionActivationServ @inject(ITerminalDeactivateService) private readonly terminalDeactivateService: ITerminalDeactivateService, @inject(IPathUtils) private readonly pathUtils: IPathUtils, @inject(IShellIntegrationService) private readonly shellIntegrationService: IShellIntegrationService, + @inject(IEnvironmentVariablesProvider) + private readonly environmentVariablesProvider: IEnvironmentVariablesProvider, ) { this.separator = platform.osType === OSType.Windows ? ';' : ':'; this.progressService = new ProgressService(this.shell); @@ -119,6 +121,13 @@ export class TerminalEnvVarCollectionService implements IExtensionActivationServ this, this.disposables, ); + this.environmentVariablesProvider.onDidEnvironmentVariablesChange( + async (r: Resource) => { + await this._applyCollection(r).ignoreErrors(); + }, + this, + this.disposables, + ); this.applicationEnvironment.onDidChangeShell( async (shell: string) => { this.processEnvVars = undefined; diff --git a/src/test/interpreters/activation/terminalEnvVarCollectionService.unit.test.ts b/src/test/interpreters/activation/terminalEnvVarCollectionService.unit.test.ts index 251c0d1aabaf..22b5dcf7477a 100644 --- a/src/test/interpreters/activation/terminalEnvVarCollectionService.unit.test.ts +++ b/src/test/interpreters/activation/terminalEnvVarCollectionService.unit.test.ts @@ -38,6 +38,7 @@ import { PathUtils } from '../../../client/common/platform/pathUtils'; import { PythonEnvType } from '../../../client/pythonEnvironments/base/info'; import { PythonEnvironment } from '../../../client/pythonEnvironments/info'; import { IShellIntegrationService, ITerminalDeactivateService } from '../../../client/terminals/types'; +import { IEnvironmentVariablesProvider } from '../../../client/common/variables/types'; suite('Terminal Environment Variable Collection Service', () => { let platform: IPlatformService; @@ -74,6 +75,7 @@ suite('Terminal Environment Variable Collection Service', () => { interpreterService = mock(); context = mock(); shell = mock(); + const envVarProvider = mock(); shellIntegrationService = mock(); when(shellIntegrationService.isWorking()).thenResolve(true); globalCollection = mock(); @@ -113,6 +115,7 @@ suite('Terminal Environment Variable Collection Service', () => { instance(terminalDeactivateService), new PathUtils(getOSType() === OSType.Windows), instance(shellIntegrationService), + instance(envVarProvider), ); });