diff --git a/src/managers/builtin/pipManager.ts b/src/managers/builtin/pipManager.ts index 986299df..45753d81 100644 --- a/src/managers/builtin/pipManager.ts +++ b/src/managers/builtin/pipManager.ts @@ -54,7 +54,7 @@ export class PipPackageManager implements PackageManager, Disposable { if (selected.length === 0) { const projects = this.venv.getProjectsByEnvironment(environment); - selected = (await getWorkspacePackagesToInstall(this.api, options, projects)) ?? []; + selected = (await getWorkspacePackagesToInstall(this.api, options, projects, environment)) ?? []; } if (selected.length === 0) { diff --git a/src/managers/builtin/pipUtils.ts b/src/managers/builtin/pipUtils.ts index c3d1175f..3bbd6c87 100644 --- a/src/managers/builtin/pipUtils.ts +++ b/src/managers/builtin/pipUtils.ts @@ -4,7 +4,7 @@ import * as tomljs from '@iarna/toml'; import { LogOutputChannel, ProgressLocation, QuickInputButtons, Uri } from 'vscode'; import { showQuickPickWithButtons, withProgress } from '../../common/window.apis'; import { PackageManagement, Pickers, VenvManagerStrings } from '../../common/localize'; -import { PackageInstallOptions, PythonEnvironmentApi, PythonProject } from '../../api'; +import { PackageInstallOptions, PythonEnvironment, PythonEnvironmentApi, PythonProject } from '../../api'; import { findFiles } from '../../common/workspace.apis'; import { EXTENSION_ROOT_DIR } from '../../common/constants'; import { Installable, selectFromCommonPackagesToInstall, selectFromInstallableToInstall } from '../common/pickers'; @@ -76,6 +76,7 @@ async function selectWorkspaceOrCommon( installable: Installable[], common: Installable[], showSkipOption: boolean, + installed?: string[], ): Promise { if (installable.length === 0 && common.length === 0) { return undefined; @@ -116,7 +117,7 @@ async function selectWorkspaceOrCommon( if (selected.label === PackageManagement.workspaceDependencies) { return await selectFromInstallableToInstall(installable); } else if (selected.label === PackageManagement.commonPackages) { - return await selectFromCommonPackagesToInstall(common); + return await selectFromCommonPackagesToInstall(common, installed); } else { traceInfo('Package Installer: user selected skip package installation'); return undefined; @@ -135,10 +136,15 @@ export async function getWorkspacePackagesToInstall( api: PythonEnvironmentApi, options?: PackageInstallOptions, project?: PythonProject[], + environment?: PythonEnvironment, ): Promise { const installable = (await getProjectInstallable(api, project)) ?? []; const common = await getCommonPackages(); - return selectWorkspaceOrCommon(installable, common, !!options?.showSkipOption); + let installed: string[] | undefined; + if (environment) { + installed = (await api.getPackages(environment))?.map((pkg) => pkg.name); + } + return selectWorkspaceOrCommon(installable, common, !!options?.showSkipOption, installed); } export async function getProjectInstallable( diff --git a/src/managers/common/pickers.ts b/src/managers/common/pickers.ts index 71732090..81499562 100644 --- a/src/managers/common/pickers.ts +++ b/src/managers/common/pickers.ts @@ -119,14 +119,13 @@ async function enterPackageManually(filler?: string): Promise { const items: PackageQuickPickItem[] = common.map(installableToQuickPickItem); const preSelectedItems = items .filter((i) => i.kind !== QuickPickItemKind.Separator) - .filter((i) => - preSelected?.find((s) => s.label === i.label && s.description === i.description && s.detail === i.detail), - ); + .filter((i) => installed?.find((p) => i.id === p) || preSelected?.find((s) => s.id === i.id)); let selected: PackageQuickPickItem | PackageQuickPickItem[] | undefined; try { @@ -173,7 +172,7 @@ export async function selectFromCommonPackagesToInstall( return result; } catch (ex) { if (ex === QuickInputButtons.Back) { - return selectFromCommonPackagesToInstall(common, selected); + return selectFromCommonPackagesToInstall(common, installed, selected); } return undefined; }