Skip to content

Commit 933d269

Browse files
authored
Fix python path for install checker (#23165)
Closes #22959
1 parent 8b4b267 commit 933d269

File tree

6 files changed

+56
-36
lines changed

6 files changed

+56
-36
lines changed

src/client/extensionActivation.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,17 @@ export function activateFeatures(ext: ExtensionState, _components: Components):
9494
const interpreterPathService: IInterpreterPathService = ext.legacyIOC.serviceContainer.get<IInterpreterPathService>(
9595
IInterpreterPathService,
9696
);
97+
const interpreterService: IInterpreterService = ext.legacyIOC.serviceContainer.get<IInterpreterService>(
98+
IInterpreterService,
99+
);
97100
const pathUtils = ext.legacyIOC.serviceContainer.get<IPathUtils>(IPathUtils);
98-
registerAllCreateEnvironmentFeatures(ext.disposables, interpreterQuickPick, interpreterPathService, pathUtils);
101+
registerAllCreateEnvironmentFeatures(
102+
ext.disposables,
103+
interpreterQuickPick,
104+
interpreterPathService,
105+
interpreterService,
106+
pathUtils,
107+
);
99108
}
100109

101110
/// //////////////////////////

src/client/pythonEnvironments/creation/common/installCheckUtils.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import { Diagnostic, DiagnosticSeverity, l10n, Range, TextDocument, Uri } from 'vscode';
55
import { installedCheckScript } from '../../../common/process/internal/scripts';
66
import { plainExec } from '../../../common/process/rawProcessApis';
7-
import { IInterpreterPathService } from '../../../common/types';
87
import { traceInfo, traceVerbose, traceError } from '../../../logging';
98
import { getConfiguration } from '../../../common/vscodeApis/workspaceApis';
9+
import { IInterpreterService } from '../../../interpreter/contracts';
1010

1111
interface PackageDiagnostic {
1212
package: string;
@@ -56,14 +56,17 @@ function getMissingPackageSeverity(doc: TextDocument): number {
5656
}
5757

5858
export async function getInstalledPackagesDiagnostics(
59-
interpreterPathService: IInterpreterPathService,
59+
interpreterService: IInterpreterService,
6060
doc: TextDocument,
6161
): Promise<Diagnostic[]> {
62-
const interpreter = interpreterPathService.get(doc.uri);
62+
const interpreter = await interpreterService.getActiveInterpreter(doc.uri);
63+
if (!interpreter) {
64+
return [];
65+
}
6366
const scriptPath = installedCheckScript();
6467
try {
6568
traceInfo('Running installed packages checker: ', interpreter, scriptPath, doc.uri.fsPath);
66-
const result = await plainExec(interpreter, [scriptPath, doc.uri.fsPath], {
69+
const result = await plainExec(interpreter.path, [scriptPath, doc.uri.fsPath], {
6770
env: {
6871
VSCODE_MISSING_PGK_SEVERITY: `${getMissingPackageSeverity(doc)}`,
6972
},

src/client/pythonEnvironments/creation/installedPackagesDiagnostic.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Licensed under the MIT License
33

44
import { Diagnostic, DiagnosticCollection, TextDocument, Uri } from 'vscode';
5-
import { IDisposableRegistry, IInterpreterPathService } from '../../common/types';
5+
import { IDisposableRegistry } from '../../common/types';
66
import { executeCommand } from '../../common/vscodeApis/commandApis';
77
import { createDiagnosticCollection, onDidChangeDiagnostics } from '../../common/vscodeApis/languageApis';
88
import { getActiveTextEditor, onDidChangeActiveTextEditor } from '../../common/vscodeApis/windowApis';
@@ -14,6 +14,7 @@ import {
1414
} from '../../common/vscodeApis/workspaceApis';
1515
import { traceVerbose } from '../../logging';
1616
import { getInstalledPackagesDiagnostics, INSTALL_CHECKER_SOURCE } from './common/installCheckUtils';
17+
import { IInterpreterService } from '../../interpreter/contracts';
1718

1819
export const DEPS_NOT_INSTALLED_KEY = 'pythonDepsNotInstalled';
1920

@@ -34,7 +35,7 @@ async function setContextForActiveEditor(diagnosticCollection: DiagnosticCollect
3435

3536
export function registerInstalledPackagesDiagnosticsProvider(
3637
disposables: IDisposableRegistry,
37-
interpreterPathService: IInterpreterPathService,
38+
interpreterService: IInterpreterService,
3839
): void {
3940
const diagnosticCollection = createDiagnosticCollection(INSTALL_CHECKER_SOURCE);
4041
const updateDiagnostics = (uri: Uri, diagnostics: Diagnostic[]) => {
@@ -49,13 +50,13 @@ export function registerInstalledPackagesDiagnosticsProvider(
4950
disposables.push(
5051
onDidOpenTextDocument(async (doc: TextDocument) => {
5152
if (doc.languageId === 'pip-requirements' || doc.fileName.endsWith('pyproject.toml')) {
52-
const diagnostics = await getInstalledPackagesDiagnostics(interpreterPathService, doc);
53+
const diagnostics = await getInstalledPackagesDiagnostics(interpreterService, doc);
5354
updateDiagnostics(doc.uri, diagnostics);
5455
}
5556
}),
5657
onDidSaveTextDocument(async (doc: TextDocument) => {
5758
if (doc.languageId === 'pip-requirements' || doc.fileName.endsWith('pyproject.toml')) {
58-
const diagnostics = await getInstalledPackagesDiagnostics(interpreterPathService, doc);
59+
const diagnostics = await getInstalledPackagesDiagnostics(interpreterService, doc);
5960
updateDiagnostics(doc.uri, diagnostics);
6061
}
6162
}),
@@ -68,10 +69,10 @@ export function registerInstalledPackagesDiagnosticsProvider(
6869
onDidChangeActiveTextEditor(async () => {
6970
await setContextForActiveEditor(diagnosticCollection);
7071
}),
71-
interpreterPathService.onDidChange(() => {
72+
interpreterService.onDidChangeInterpreter(() => {
7273
getOpenTextDocuments().forEach(async (doc: TextDocument) => {
7374
if (doc.languageId === 'pip-requirements' || doc.fileName.endsWith('pyproject.toml')) {
74-
const diagnostics = await getInstalledPackagesDiagnostics(interpreterPathService, doc);
75+
const diagnostics = await getInstalledPackagesDiagnostics(interpreterService, doc);
7576
updateDiagnostics(doc.uri, diagnostics);
7677
}
7778
});
@@ -80,7 +81,7 @@ export function registerInstalledPackagesDiagnosticsProvider(
8081

8182
getOpenTextDocuments().forEach(async (doc: TextDocument) => {
8283
if (doc.languageId === 'pip-requirements' || doc.fileName.endsWith('pyproject.toml')) {
83-
const diagnostics = await getInstalledPackagesDiagnostics(interpreterPathService, doc);
84+
const diagnostics = await getInstalledPackagesDiagnostics(interpreterService, doc);
8485
updateDiagnostics(doc.uri, diagnostics);
8586
}
8687
});

src/client/pythonEnvironments/creation/registrations.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import { IDisposableRegistry, IInterpreterPathService, IPathUtils } from '../../common/types';
55
import { IInterpreterQuickPick } from '../../interpreter/configuration/types';
6+
import { IInterpreterService } from '../../interpreter/contracts';
67
import { registerCreateEnvironmentFeatures } from './createEnvApi';
78
import { registerCreateEnvironmentButtonFeatures } from './createEnvButtonContext';
89
import { registerInstalledPackagesDiagnosticsProvider } from './installedPackagesDiagnostic';
@@ -12,10 +13,11 @@ export function registerAllCreateEnvironmentFeatures(
1213
disposables: IDisposableRegistry,
1314
interpreterQuickPick: IInterpreterQuickPick,
1415
interpreterPathService: IInterpreterPathService,
16+
interpreterService: IInterpreterService,
1517
pathUtils: IPathUtils,
1618
): void {
1719
registerCreateEnvironmentFeatures(disposables, interpreterQuickPick, interpreterPathService, pathUtils);
1820
registerCreateEnvironmentButtonFeatures(disposables);
1921
registerPyProjectTomlFeatures(disposables);
20-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService);
22+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService);
2123
}

src/test/pythonEnvironments/creation/common/installCheckUtils.unit.test.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ import { assert, use as chaiUse } from 'chai';
88
import { Diagnostic, TextDocument, Range, Uri, WorkspaceConfiguration, ConfigurationScope } from 'vscode';
99
import * as rawProcessApis from '../../../../client/common/process/rawProcessApis';
1010
import { getInstalledPackagesDiagnostics } from '../../../../client/pythonEnvironments/creation/common/installCheckUtils';
11-
import { IInterpreterPathService } from '../../../../client/common/types';
1211
import * as workspaceApis from '../../../../client/common/vscodeApis/workspaceApis';
1312
import { SpawnOptions } from '../../../../client/common/process/types';
13+
import { IInterpreterService } from '../../../../client/interpreter/contracts';
14+
import { PythonEnvironment } from '../../../../client/pythonEnvironments/info';
1415

1516
chaiUse(chaiAsPromised);
1617

@@ -38,14 +39,17 @@ const MISSING_PACKAGES: Diagnostic[] = [
3839

3940
suite('Install check diagnostics tests', () => {
4041
let plainExecStub: sinon.SinonStub;
41-
let interpreterPathService: typemoq.IMock<IInterpreterPathService>;
42+
let interpreterService: typemoq.IMock<IInterpreterService>;
4243
let getConfigurationStub: sinon.SinonStub;
4344
let configMock: typemoq.IMock<WorkspaceConfiguration>;
4445

4546
setup(() => {
4647
configMock = typemoq.Mock.ofType<WorkspaceConfiguration>();
4748
plainExecStub = sinon.stub(rawProcessApis, 'plainExec');
48-
interpreterPathService = typemoq.Mock.ofType<IInterpreterPathService>();
49+
interpreterService = typemoq.Mock.ofType<IInterpreterService>();
50+
interpreterService
51+
.setup((i) => i.getActiveInterpreter(typemoq.It.isAny()))
52+
.returns(() => Promise.resolve(({ path: 'python' } as unknown) as PythonEnvironment));
4953
getConfigurationStub = sinon.stub(workspaceApis, 'getConfiguration');
5054
getConfigurationStub.callsFake((section?: string, _scope?: ConfigurationScope | null) => {
5155
if (section === 'python') {
@@ -66,7 +70,7 @@ suite('Install check diagnostics tests', () => {
6670
.verifiable(typemoq.Times.atLeastOnce());
6771
plainExecStub.resolves({ stdout: MISSING_PACKAGES_STR, stderr: '' });
6872
const someFile = getSomeRequirementFile();
69-
const result = await getInstalledPackagesDiagnostics(interpreterPathService.object, someFile.object);
73+
const result = await getInstalledPackagesDiagnostics(interpreterService.object, someFile.object);
7074

7175
assert.deepStrictEqual(result, MISSING_PACKAGES);
7276
configMock.verifyAll();
@@ -79,7 +83,7 @@ suite('Install check diagnostics tests', () => {
7983
.verifiable(typemoq.Times.atLeastOnce());
8084
plainExecStub.resolves({ stdout: '', stderr: '' });
8185
const someFile = getSomeRequirementFile();
82-
const result = await getInstalledPackagesDiagnostics(interpreterPathService.object, someFile.object);
86+
const result = await getInstalledPackagesDiagnostics(interpreterService.object, someFile.object);
8387

8488
assert.deepStrictEqual(result, []);
8589
configMock.verifyAll();
@@ -104,7 +108,7 @@ suite('Install check diagnostics tests', () => {
104108
return { stdout: '', stderr: '' };
105109
});
106110
const someFile = getSomeRequirementFile();
107-
const result = await getInstalledPackagesDiagnostics(interpreterPathService.object, someFile.object);
111+
const result = await getInstalledPackagesDiagnostics(interpreterService.object, someFile.object);
108112

109113
assert.deepStrictEqual(result, []);
110114
assert.deepStrictEqual(severity, expected);

src/test/pythonEnvironments/creation/installedPackagesDiagnostics.unit.test.ts

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ import * as cmdApis from '../../../client/common/vscodeApis/commandApis';
1010
import * as workspaceApis from '../../../client/common/vscodeApis/workspaceApis';
1111
import * as languageApis from '../../../client/common/vscodeApis/languageApis';
1212
import * as windowApis from '../../../client/common/vscodeApis/windowApis';
13-
import { IDisposableRegistry, IInterpreterPathService } from '../../../client/common/types';
13+
import { IDisposableRegistry } from '../../../client/common/types';
1414
import * as installUtils from '../../../client/pythonEnvironments/creation/common/installCheckUtils';
1515
import {
1616
DEPS_NOT_INSTALLED_KEY,
1717
registerInstalledPackagesDiagnosticsProvider,
1818
} from '../../../client/pythonEnvironments/creation/installedPackagesDiagnostic';
19+
import { IInterpreterService } from '../../../client/interpreter/contracts';
1920

2021
chaiUse(chaiAsPromised);
2122

@@ -95,7 +96,7 @@ suite('Create Env content button settings tests', () => {
9596
let getActiveTextEditorStub: sinon.SinonStub;
9697
let textEditor: typemoq.IMock<TextEditor>;
9798
let getInstalledPackagesDiagnosticsStub: sinon.SinonStub;
98-
let interpreterPathService: typemoq.IMock<IInterpreterPathService>;
99+
let interpreterService: typemoq.IMock<IInterpreterService>;
99100

100101
setup(() => {
101102
executeCommandStub = sinon.stub(cmdApis, 'executeCommand');
@@ -127,9 +128,9 @@ suite('Create Env content button settings tests', () => {
127128
getActiveTextEditorStub.returns(textEditor.object);
128129

129130
getInstalledPackagesDiagnosticsStub = sinon.stub(installUtils, 'getInstalledPackagesDiagnostics');
130-
interpreterPathService = typemoq.Mock.ofType<IInterpreterPathService>();
131-
interpreterPathService
132-
.setup((i) => i.onDidChange(typemoq.It.isAny(), undefined, undefined))
131+
interpreterService = typemoq.Mock.ofType<IInterpreterService>();
132+
interpreterService
133+
.setup((i) => i.onDidChangeInterpreter(typemoq.It.isAny(), undefined, undefined))
133134
.returns(() => new FakeDisposable());
134135
});
135136

@@ -139,7 +140,7 @@ suite('Create Env content button settings tests', () => {
139140
});
140141

141142
test('Ensure nothing is run if there are no open documents', () => {
142-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
143+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
143144
assert.ok(executeCommandStub.notCalled);
144145
assert.ok(getInstalledPackagesDiagnosticsStub.notCalled);
145146
});
@@ -148,7 +149,7 @@ suite('Create Env content button settings tests', () => {
148149
const someFile = getSomeFile();
149150
const someTomlFile = getSomeTomlFile();
150151
getOpenTextDocumentsStub.returns([someFile.object, someTomlFile.object]);
151-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
152+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
152153
assert.ok(executeCommandStub.notCalled);
153154
assert.ok(getInstalledPackagesDiagnosticsStub.notCalled);
154155
});
@@ -157,7 +158,7 @@ suite('Create Env content button settings tests', () => {
157158
const reqFile = getSomeRequirementFile();
158159
const tomlFile = getPyProjectTomlFile();
159160
getOpenTextDocumentsStub.returns([reqFile.object, tomlFile.object]);
160-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
161+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
161162
assert.ok(getInstalledPackagesDiagnosticsStub.calledTwice);
162163
});
163164

@@ -171,7 +172,7 @@ suite('Create Env content button settings tests', () => {
171172
return new FakeDisposable();
172173
});
173174

174-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
175+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
175176
getInstalledPackagesDiagnosticsStub.reset();
176177

177178
getInstalledPackagesDiagnosticsStub.returns(Promise.resolve(MISSING_PACKAGES));
@@ -189,7 +190,7 @@ suite('Create Env content button settings tests', () => {
189190
return new FakeDisposable();
190191
});
191192

192-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
193+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
193194
getInstalledPackagesDiagnosticsStub.reset();
194195

195196
getInstalledPackagesDiagnosticsStub.returns(Promise.resolve(MISSING_PACKAGES));
@@ -207,7 +208,7 @@ suite('Create Env content button settings tests', () => {
207208
return new FakeDisposable();
208209
});
209210

210-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
211+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
211212

212213
diagnosticCollection.reset();
213214
diagnosticCollection.setup((d) => d.delete(typemoq.It.isAny())).verifiable(typemoq.Times.once());
@@ -229,7 +230,7 @@ suite('Create Env content button settings tests', () => {
229230
return new FakeDisposable();
230231
});
231232

232-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
233+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
233234

234235
getActiveTextEditorStub.returns({ document: file });
235236
diagnosticCollection.setup((d) => d.get(typemoq.It.isAny())).returns(() => MISSING_PACKAGES);
@@ -247,7 +248,7 @@ suite('Create Env content button settings tests', () => {
247248
return new FakeDisposable();
248249
});
249250

250-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
251+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
251252

252253
getActiveTextEditorStub.returns({ document: file });
253254
diagnosticCollection.setup((d) => d.get(typemoq.It.isAny())).returns(() => MISSING_PACKAGES);
@@ -267,7 +268,7 @@ suite('Create Env content button settings tests', () => {
267268
return new FakeDisposable();
268269
});
269270

270-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
271+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
271272
getInstalledPackagesDiagnosticsStub.reset();
272273

273274
getInstalledPackagesDiagnosticsStub.returns(Promise.resolve(MISSING_PACKAGES));
@@ -285,7 +286,7 @@ suite('Create Env content button settings tests', () => {
285286
return new FakeDisposable();
286287
});
287288

288-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
289+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
289290
getInstalledPackagesDiagnosticsStub.reset();
290291

291292
getInstalledPackagesDiagnosticsStub.returns(Promise.resolve(MISSING_PACKAGES));
@@ -303,7 +304,7 @@ suite('Create Env content button settings tests', () => {
303304
return new FakeDisposable();
304305
});
305306

306-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
307+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
307308

308309
getActiveTextEditorStub.returns({ document: file });
309310
diagnosticCollection.setup((d) => d.get(typemoq.It.isAny())).returns(() => []);
@@ -321,7 +322,7 @@ suite('Create Env content button settings tests', () => {
321322
return new FakeDisposable();
322323
});
323324

324-
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterPathService.object);
325+
registerInstalledPackagesDiagnosticsProvider(disposables, interpreterService.object);
325326

326327
getActiveTextEditorStub.returns({ document: file });
327328
diagnosticCollection.setup((d) => d.get(typemoq.It.isAny())).returns(() => []);

0 commit comments

Comments
 (0)