From d43bd846424aa8d0b3faf180c6cf8449dbb74ff1 Mon Sep 17 00:00:00 2001 From: Isabel Zimmerman <54685329+isabelizimm@users.noreply.github.com> Date: Fri, 30 Aug 2024 13:20:41 -0400 Subject: [PATCH] python: do not refresh interpreters on quickpick open (#4462) related to #3944 Keeps the lists of interpreters the same, rather than refreshing only the first time the Select Interpreter QuickPick is opened which makes it seem like the Positron dropdown is out of sync. This nudges people towards refreshing manually when they have created a new environment, which I believe to be the desired behavior since Positron will not have to continually watch for new envs (which can be expensive, some discussion https://github.com/posit-dev/positron/issues/2003). I've opened #4269 to track better UI to make refreshing interpreters more obvious. ### QA Notes Scenario 1: 1. Open Positron 2. Create new pyenv environment via something like `pyenv virtualenv 3.9.4 test-startup` 3. Check: no new env discovered in Positron dropdown, no new env discovered in `Python: Select Interpreter` 4. Refresh envs using button in `Python: Select Interpreter` 5. See env populate in both locations Scenario 2: 1. Open Positron 2. Create new pyenv environment via something like `pyenv virtualenv 3.9.4 test-startup` 3. Close Positron 4. Open Positron 5. See env populate in both locations --- .../src/client/extensionActivation.ts | 4 +++- .../commands/setInterpreter.ts | 17 +++++++++++----- .../src/client/pythonEnvironments/index.ts | 20 +++++++++++++++++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/extensions/positron-python/src/client/extensionActivation.ts b/extensions/positron-python/src/client/extensionActivation.ts index 9f3bf592c6e..d9878bf544b 100644 --- a/extensions/positron-python/src/client/extensionActivation.ts +++ b/extensions/positron-python/src/client/extensionActivation.ts @@ -87,7 +87,9 @@ export async function activateComponents( } const promises: Promise[] = [ // More component activations will go here - pythonEnvironments.activate(components.pythonEnvs, ext), + // --- Start Positron --- + pythonEnvironments.activateAndRefreshEnvs(components.pythonEnvs), + // --- End Positron ]; return Promise.all([legacyActivationResult, ...promises]); } diff --git a/extensions/positron-python/src/client/interpreter/configuration/interpreterSelector/commands/setInterpreter.ts b/extensions/positron-python/src/client/interpreter/configuration/interpreterSelector/commands/setInterpreter.ts index bc271a64d2f..1a868e334c6 100644 --- a/extensions/positron-python/src/client/interpreter/configuration/interpreterSelector/commands/setInterpreter.ts +++ b/extensions/positron-python/src/client/interpreter/configuration/interpreterSelector/commands/setInterpreter.ts @@ -208,12 +208,19 @@ export class SetInterpreterCommand extends BaseInterpreterSelectorCommand implem // always trigger a refresh. if (this.interpreterService.getInterpreters().length === 0) { this.refreshCallback(quickPick, { showBackButton: params?.showBackButton }); - } else { - this.refreshCallback(quickPick, { - ifNotTriggerredAlready: true, - showBackButton: params?.showBackButton, - }); } + // --- Start Positron --- + // Do not trigger a refresh when QuickPick is opened, to keep behavior the same + // between the Quick Pick and the Positron Interpreter Selector + + // else { + // this.refreshCallback(quickPick, { + // ifNotTriggerredAlready: true, + // showBackButton: params?.showBackButton, + // }); + // } + + // --- End Positron --- }, onChangeItem: { event: this.interpreterService.onDidChangeInterpreters, diff --git a/extensions/positron-python/src/client/pythonEnvironments/index.ts b/extensions/positron-python/src/client/pythonEnvironments/index.ts index 0bd766b4553..284638d880c 100644 --- a/extensions/positron-python/src/client/pythonEnvironments/index.ts +++ b/extensions/positron-python/src/client/pythonEnvironments/index.ts @@ -59,6 +59,26 @@ export async function initialize(ext: ExtensionState): Promise { return api; } +// --- Start Positron --- +/** + * Make use of the component (e.g. register with VS Code). + */ +export async function activateAndRefreshEnvs(api: IDiscoveryAPI): Promise { + /** + * Force a background refresh of the environments for each extension activation + * + * Based off activate(), but not including the logic around triggering only if + * it has not previously been triggered + */ + + api.triggerRefresh().ignoreErrors(); + + return { + fullyReady: Promise.resolve(), + }; +} +// --- End Positron --- + /** * Make use of the component (e.g. register with VS Code). */