From 58f79277e495816eb830b4726a84cccb24a780c7 Mon Sep 17 00:00:00 2001 From: eleanorjboyd <26030610+eleanorjboyd@users.noreply.github.com> Date: Thu, 11 Sep 2025 09:40:32 -0700 Subject: [PATCH] bug: fix default interpreter resolution with user configuration --- src/extension.ts | 2 +- src/helpers.ts | 124 +++++++++++++++++++++++++++-------------------- 2 files changed, 73 insertions(+), 53 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 3506e87b..60381ed5 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -498,7 +498,7 @@ export async function activate(context: ExtensionContext): Promise(section: string, key: string): T | undefined { + const config = getConfiguration(section); + const inspect = config.inspect(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. @@ -126,63 +148,61 @@ export async function resolveDefaultInterpreter( envManagers: EnvironmentManagers, api: PythonEnvironmentApi, ) { - const defaultInterpreterPath = getConfiguration('python').get('defaultInterpreterPath'); + const userSetdefaultInterpreter = getUserConfiguredSetting('python', 'defaultInterpreterPath'); + const userSetDefaultManager = getUserConfiguredSetting('python-envs', 'defaultEnvManager'); + traceInfo( + `[resolveDefaultInterpreter] User configured defaultInterpreterPath: ${userSetdefaultInterpreter} and defaultEnvManager: ${userSetDefaultManager}`, + ); - if (defaultInterpreterPath) { - const config = getConfiguration('python-envs'); - const inspect = config.inspect('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}`); } } }