Skip to content

Commit a8c4728

Browse files
authored
Adopt native pyenv locator in TS land (#23359)
1 parent f484fb2 commit a8c4728

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

src/client/pythonEnvironments/base/locators/lowLevel/nativeLocator.ts

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { PythonEnvsChangedEvent } from '../../watcher';
1010
import { createDeferred } from '../../../../common/utils/async';
1111
import { PythonEnvKind, PythonVersion } from '../../info';
1212
import { Conda } from '../../../common/environmentManagers/conda';
13+
import { traceError } from '../../../../logging';
14+
import type { KnownEnvironmentTools } from '../../../../api/types';
15+
import { setPyEnvBinary } from '../../../common/environmentManagers/pyenv';
1316

1417
const NATIVE_LOCATOR = isWindows()
1518
? path.join(EXTENSION_ROOT_DIR, 'native_locator', 'bin', 'python-finder.exe')
@@ -25,15 +28,38 @@ interface NativeEnvInfo {
2528
}
2629

2730
interface EnvManager {
31+
tool: string;
2832
executablePath: string[];
2933
version?: string;
3034
}
3135

3236
function categoryToKind(category: string): PythonEnvKind {
33-
if (category === 'conda') {
34-
return PythonEnvKind.Conda;
37+
switch (category.toLowerCase()) {
38+
case 'conda':
39+
return PythonEnvKind.Conda;
40+
case 'system':
41+
return PythonEnvKind.System;
42+
case 'pyenv':
43+
return PythonEnvKind.Pyenv;
44+
case 'windowsstore':
45+
return PythonEnvKind.MicrosoftStore;
46+
default: {
47+
traceError(`Unknown Python Environment category '${category}' from Native Locator.`);
48+
return PythonEnvKind.Unknown;
49+
}
50+
}
51+
}
52+
function toolToKnownEnvironmentTool(tool: string): KnownEnvironmentTools {
53+
switch (tool.toLowerCase()) {
54+
case 'conda':
55+
return 'Conda';
56+
case 'pyenv':
57+
return 'Pyenv';
58+
default: {
59+
traceError(`Unknown Python Tool '${tool}' from Native Locator.`);
60+
return 'Unknown';
61+
}
3562
}
36-
return PythonEnvKind.Unknown;
3763
}
3864

3965
function parseVersion(version?: string): PythonVersion | undefined {
@@ -92,7 +118,19 @@ export class NativeLocator implements ILocator<BasicEnvInfo>, IDisposable {
92118
});
93119
});
94120
connection.onNotification('envManager', (data: EnvManager) => {
95-
Conda.setConda(data.executablePath[0]);
121+
switch (toolToKnownEnvironmentTool(data.tool)) {
122+
case 'Conda': {
123+
Conda.setConda(data.executablePath[0]);
124+
break;
125+
}
126+
case 'Pyenv': {
127+
setPyEnvBinary(data.executablePath[0]);
128+
break;
129+
}
130+
default: {
131+
break;
132+
}
133+
}
96134
});
97135
connection.onNotification('exit', () => {
98136
deferred.resolve();

src/client/pythonEnvironments/common/environmentManagers/pyenv.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,17 @@ export function getPyenvDir(): string {
2121
return pyenvDir;
2222
}
2323

24+
let pyenvBinary: string | undefined;
25+
26+
export function setPyEnvBinary(pyenvBin: string): void {
27+
pyenvBinary = pyenvBin;
28+
}
29+
2430
async function getPyenvBinary(): Promise<string> {
31+
if (pyenvBinary && (await pathExists(pyenvBinary))) {
32+
return pyenvBinary;
33+
}
34+
2535
const pyenvDir = getPyenvDir();
2636
const pyenvBin = path.join(pyenvDir, 'bin', 'pyenv');
2737
if (await pathExists(pyenvBin)) {

0 commit comments

Comments
 (0)