Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
shellStartupVarsMgr.initialize(),
]);

resolveDefaultInterpreter(nativeFinder, envManagers, api);
await resolveDefaultInterpreter(nativeFinder, envManagers, api);

sendTelemetryEvent(EventNames.EXTENSION_MANAGER_REGISTRATION_DURATION, start.elapsedTime);
await terminalManager.initialize(api);
Expand Down
124 changes: 72 additions & 52 deletions src/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,29 @@ export function getEnvManagerAndPackageManagerConfigLevels() {
}

/**
* Sets the default Python interpreter for the workspace if the user has not explicitly set 'defaultEnvManager' or it is set to venv.
* Returns the user-configured value for a configuration key if set at any level (workspace folder, workspace, or global),
* otherwise returns undefined.
*/
export function getUserConfiguredSetting<T>(section: string, key: string): T | undefined {
const config = getConfiguration(section);
const inspect = config.inspect<T>(key);
if (!inspect) {
return undefined;
}
if (inspect.workspaceFolderValue !== undefined) {
return inspect.workspaceFolderValue;
}
if (inspect.workspaceValue !== undefined) {
return inspect.workspaceValue;
}
if (inspect.globalValue !== undefined) {
return inspect.globalValue;
}
return undefined;
}

/**
* Sets the default Python interpreter for the workspace if the user has not explicitly set 'defaultEnvManager'.
* @param nativeFinder - used to resolve interpreter paths.
* @param envManagers - contains all registered managers.
* @param api - The PythonEnvironmentApi for environment resolution and setting.
Expand All @@ -126,63 +148,61 @@ export async function resolveDefaultInterpreter(
envManagers: EnvironmentManagers,
api: PythonEnvironmentApi,
) {
const defaultInterpreterPath = getConfiguration('python').get<string>('defaultInterpreterPath');
const userSetdefaultInterpreter = getUserConfiguredSetting<string>('python', 'defaultInterpreterPath');
const userSetDefaultManager = getUserConfiguredSetting<string>('python-envs', 'defaultEnvManager');
traceInfo(
`[resolveDefaultInterpreter] User configured defaultInterpreterPath: ${userSetdefaultInterpreter} and defaultEnvManager: ${userSetDefaultManager}`,
);

if (defaultInterpreterPath) {
const config = getConfiguration('python-envs');
const inspect = config.inspect<string>('defaultEnvManager');
const userDefinedDefaultManager =
inspect?.workspaceFolderValue !== undefined ||
inspect?.workspaceValue !== undefined ||
inspect?.globalValue !== undefined;
if (!userDefinedDefaultManager) {
try {
const resolved: NativeEnvInfo = await nativeFinder.resolve(defaultInterpreterPath);
if (resolved && resolved.executable) {
if (normalizePath(resolved.executable) === normalizePath(defaultInterpreterPath)) {
// no action required, the path is already correct
return;
}
const resolvedEnv = await api.resolveEnvironment(Uri.file(resolved.executable));
traceInfo(`[resolveDefaultInterpreter] API resolved environment: ${JSON.stringify(resolvedEnv)}`);
// Only proceed if the user has explicitly set defaultInterpreterPath but nothing is saved for defaultEnvManager
if (userSetdefaultInterpreter && !userSetDefaultManager) {
try {
const resolved: NativeEnvInfo = await nativeFinder.resolve(userSetdefaultInterpreter);
if (resolved && resolved.executable) {
if (normalizePath(resolved.executable) === normalizePath(userSetdefaultInterpreter)) {
// no action required, the path is already correct
return;
}
const resolvedEnv = await api.resolveEnvironment(Uri.file(resolved.executable));
traceInfo(`[resolveDefaultInterpreter] API resolved environment: ${JSON.stringify(resolvedEnv)}`);

let findEnvManager = envManagers.managers.find((m) => m.id === resolvedEnv?.envId.managerId);
if (!findEnvManager) {
findEnvManager = envManagers.managers.find((m) => m.id === 'ms-python.python:system');
}
if (resolvedEnv) {
const newEnv: PythonEnvironment = {
envId: {
id: resolvedEnv?.envId.id,
managerId: resolvedEnv?.envId.managerId ?? '',
},
name: 'defaultInterpreterPath: ' + (resolved.version ?? ''),
displayName: 'defaultInterpreterPath: ' + (resolved.version ?? ''),
version: resolved.version ?? '',
displayPath: defaultInterpreterPath ?? '',
environmentPath: defaultInterpreterPath ? Uri.file(defaultInterpreterPath) : Uri.file(''),
sysPrefix: resolved.arch ?? '',
execInfo: {
run: {
executable: defaultInterpreterPath ?? '',
},
let findEnvManager = envManagers.managers.find((m) => m.id === resolvedEnv?.envId.managerId);
if (!findEnvManager) {
findEnvManager = envManagers.managers.find((m) => m.id === 'ms-python.python:system');
}
const randomString = Math.random().toString(36).substring(2, 15);
if (resolvedEnv) {
const newEnv: PythonEnvironment = {
envId: {
id: `${userSetdefaultInterpreter}_${randomString}`,
managerId: resolvedEnv?.envId.managerId ?? '',
},
name: 'defaultInterpreterPath: ' + (resolved.version ?? ''),
displayName: 'defaultInterpreterPath: ' + (resolved.version ?? ''),
version: resolved.version ?? '',
displayPath: userSetdefaultInterpreter ?? '',
environmentPath: userSetdefaultInterpreter ? Uri.file(userSetdefaultInterpreter) : Uri.file(''),
sysPrefix: resolved.arch ?? '',
execInfo: {
run: {
executable: userSetdefaultInterpreter ?? '',
},
};
if (workspace.workspaceFolders?.[0] && findEnvManager) {
traceInfo(
`[resolveDefaultInterpreter] Setting environment for workspace: ${workspace.workspaceFolders[0].uri.fsPath}`,
);
await api.setEnvironment(workspace.workspaceFolders[0].uri, newEnv);
}
},
};
if (workspace.workspaceFolders?.[0] && findEnvManager) {
traceInfo(
`[resolveDefaultInterpreter] Setting environment for workspace: ${workspace.workspaceFolders[0].uri.fsPath}`,
);
await api.setEnvironment(workspace.workspaceFolders[0].uri, newEnv);
}
} else {
traceWarn(
`[resolveDefaultInterpreter] NativeFinder did not resolve an executable for path: ${defaultInterpreterPath}`,
);
}
} catch (err) {
traceError(`[resolveDefaultInterpreter] Error resolving default interpreter: ${err}`);
} else {
traceWarn(
`[resolveDefaultInterpreter] NativeFinder did not resolve an executable for path: ${userSetdefaultInterpreter}`,
);
}
} catch (err) {
traceError(`[resolveDefaultInterpreter] Error resolving default interpreter: ${err}`);
}
}
}
Loading