Skip to content

Commit abb5d14

Browse files
committed
Disables the use of a terminal to activate an environment (#9967)
* Disables the use of a terminal to activate an environment * Fix tests * Fix linter
1 parent 415cab4 commit abb5d14

File tree

4 files changed

+15
-6
lines changed

4 files changed

+15
-6
lines changed

src/client/interpreter/activation/service.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { IPlatformService } from '../../common/platform/types';
1212
import { IProcessServiceFactory } from '../../common/process/types';
1313
import { ITerminalHelper, TerminalShellType } from '../../common/terminal/types';
1414
import { ICurrentProcess, IDisposable, Resource } from '../../common/types';
15+
import { cacheResourceSpecificInterpreterData, clearCachedResourceSpecificIngterpreterData } from '../../common/utils/decorators';
1516
import { OSType } from '../../common/utils/platform';
1617
import { IEnvironmentVariablesProvider } from '../../common/variables/types';
1718
import { EXTENSION_ROOT_DIR } from '../../constants';
@@ -21,6 +22,7 @@ import { PythonInterpreter } from '../contracts';
2122
import { IEnvironmentActivationService } from './types';
2223

2324
const getEnvironmentPrefix = 'e8b39361-0157-4923-80e1-22d70d46dee6';
25+
const cacheDuration = 10 * 60 * 1000;
2426
export const getEnvironmentTimeout = 30000;
2527

2628
// The shell under which we'll execute activation scripts.
@@ -40,13 +42,16 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
4042
@inject(IProcessServiceFactory) private processServiceFactory: IProcessServiceFactory,
4143
@inject(ICurrentProcess) private currentProcess: ICurrentProcess,
4244
@inject(IEnvironmentVariablesProvider) private readonly envVarsService: IEnvironmentVariablesProvider
43-
) {}
45+
) {
46+
this.envVarsService.onDidEnvironmentVariablesChange(this.onDidEnvironmentVariablesChange, this, this.disposables);
47+
}
4448

4549
public dispose(): void {
4650
this.disposables.forEach(d => d.dispose());
4751
}
4852
@traceDecorators.verbose('getActivatedEnvironmentVariables', LogOptions.Arguments)
4953
@captureTelemetry(EventName.PYTHON_INTERPRETER_ACTIVATION_ENVIRONMENT_VARIABLES, { failed: false }, true)
54+
@cacheResourceSpecificInterpreterData('ActivatedEnvironmentVariables', cacheDuration)
5055
public async getActivatedEnvironmentVariables(resource: Resource, interpreter?: PythonInterpreter, allowExceptions?: boolean): Promise<NodeJS.ProcessEnv | undefined> {
5156
const shellInfo = defaultShells[this.platform.osType];
5257
if (!shellInfo) {
@@ -110,6 +115,9 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
110115
}
111116
}
112117
}
118+
protected onDidEnvironmentVariablesChange(affectedResource: Resource) {
119+
clearCachedResourceSpecificIngterpreterData('ActivatedEnvironmentVariables', affectedResource);
120+
}
113121
protected fixActivationCommands(commands: string[]): string[] {
114122
// Replace 'source ' with '. ' as that works in shell exec
115123
return commands.map(cmd => cmd.replace(/^source\s+/, '. '));

src/client/interpreter/serviceRegistry.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { PreWarmActivatedEnvironmentVariables } from './activation/preWarmVariab
99
import { EnvironmentActivationService } from './activation/service';
1010
import { TerminalEnvironmentActivationService } from './activation/terminalEnvironmentActivationService';
1111
import { IEnvironmentActivationService } from './activation/types';
12-
import { WrapperEnvironmentActivationService } from './activation/wrapperEnvironmentActivationService';
1312
import { InterpreterAutoSelectionService } from './autoSelection/index';
1413
import { InterpreterAutoSeletionProxyService } from './autoSelection/proxy';
1514
import { CachedInterpretersAutoSelectionRule } from './autoSelection/rules/cached';
@@ -155,5 +154,5 @@ export function registerTypes(serviceManager: IServiceManager) {
155154
serviceManager.addSingleton<IInterpreterAutoSeletionProxyService>(IInterpreterAutoSeletionProxyService, InterpreterAutoSeletionProxyService);
156155
serviceManager.addSingleton<IEnvironmentActivationService>(EnvironmentActivationService, EnvironmentActivationService);
157156
serviceManager.addSingleton<IEnvironmentActivationService>(TerminalEnvironmentActivationService, TerminalEnvironmentActivationService);
158-
serviceManager.addSingleton<IEnvironmentActivationService>(IEnvironmentActivationService, WrapperEnvironmentActivationService);
157+
serviceManager.addSingleton<IEnvironmentActivationService>(IEnvironmentActivationService, EnvironmentActivationService);
159158
}

src/test/interpreters/activation/service.unit.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as path from 'path';
88
import { SemVer } from 'semver';
99
import { anything, capture, instance, mock, verify, when } from 'ts-mockito';
1010
import * as typemoq from 'typemoq';
11-
import { Uri, workspace as workspaceType, WorkspaceConfiguration } from 'vscode';
11+
import { EventEmitter, Uri, workspace as workspaceType, WorkspaceConfiguration } from 'vscode';
1212
import { PlatformService } from '../../../client/common/platform/platformService';
1313
import { IPlatformService } from '../../../client/common/platform/types';
1414
import { CurrentProcess } from '../../../client/common/process/currentProcess';
@@ -18,6 +18,7 @@ import { IProcessService, IProcessServiceFactory } from '../../../client/common/
1818
import { TerminalHelper } from '../../../client/common/terminal/helper';
1919
import { ITerminalHelper } from '../../../client/common/terminal/types';
2020
import { ICurrentProcess } from '../../../client/common/types';
21+
import { clearCache } from '../../../client/common/utils/cacheUtils';
2122
import { getNamesAndValues } from '../../../client/common/utils/enum';
2223
import { Architecture, OSType } from '../../../client/common/utils/platform';
2324
import { EnvironmentVariablesProvider } from '../../../client/common/variables/environmentVariablesProvider';
@@ -63,6 +64,7 @@ suite('Interpreters Activation - Python Environment Variables', () => {
6364
currentProcess = mock(CurrentProcess);
6465
envVarsService = mock(EnvironmentVariablesProvider);
6566
workspace = mockedVSCodeNamespaces.workspace!;
67+
when(envVarsService.onDidEnvironmentVariablesChange).thenReturn(new EventEmitter<Uri | undefined>().event);
6668
service = new EnvironmentActivationService(instance(helper), instance(platform), instance(processServiceFactory), instance(currentProcess), instance(envVarsService));
6769

6870
const cfg = typemoq.Mock.ofType<WorkspaceConfiguration>();
@@ -71,6 +73,7 @@ suite('Interpreters Activation - Python Environment Variables', () => {
7173
cfg.setup(c => c.inspect(typemoq.It.isValue('pythonPath'))).returns(() => {
7274
return { globalValue: 'GlobalValuepython' } as any;
7375
});
76+
clearCache();
7477
}
7578
teardown(() => {
7679
mockedVSCodeNamespaces.workspace!.reset();

src/test/interpreters/serviceRegistry.unit.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { IExtensionActivationService, IExtensionSingleActivationService } from '
1010
import { EnvironmentActivationService } from '../../client/interpreter/activation/service';
1111
import { TerminalEnvironmentActivationService } from '../../client/interpreter/activation/terminalEnvironmentActivationService';
1212
import { IEnvironmentActivationService } from '../../client/interpreter/activation/types';
13-
import { WrapperEnvironmentActivationService } from '../../client/interpreter/activation/wrapperEnvironmentActivationService';
1413
import { InterpreterAutoSelectionService } from '../../client/interpreter/autoSelection';
1514
import { InterpreterAutoSeletionProxyService } from '../../client/interpreter/autoSelection/proxy';
1615
import { CachedInterpretersAutoSelectionRule } from '../../client/interpreter/autoSelection/rules/cached';
@@ -146,7 +145,7 @@ suite('Interpreters - Service Registry', () => {
146145

147146
[EnvironmentActivationService, EnvironmentActivationService],
148147
[TerminalEnvironmentActivationService, TerminalEnvironmentActivationService],
149-
[IEnvironmentActivationService, WrapperEnvironmentActivationService],
148+
[IEnvironmentActivationService, EnvironmentActivationService],
150149
[IExtensionActivationService, CondaInheritEnvPrompt],
151150

152151
[WindowsStoreInterpreter, WindowsStoreInterpreter],

0 commit comments

Comments
 (0)