PY-78749 Packages: clear PPM from toolwindow tree methods

Signed-off-by: Nikita.Ashihmin <nikita.ashihmin@jetbrains.com>

GitOrigin-RevId: 556ff321b789a0600580fa590c0cd3be36c68e89
This commit is contained in:
Nikita.Ashihmin
2025-08-04 17:24:34 +00:00
committed by intellij-monorepo-bot
parent 9c922e5089
commit 0eb8ec9edb
5 changed files with 15 additions and 30 deletions
@@ -19,7 +19,6 @@ import com.jetbrains.python.getOrNull
import com.jetbrains.python.onFailure
import com.jetbrains.python.packaging.PyPackageManager
import com.jetbrains.python.packaging.PyPackageName
import com.jetbrains.python.packaging.PythonDependenciesExtractor
import com.jetbrains.python.packaging.common.PythonOutdatedPackage
import com.jetbrains.python.packaging.common.PythonPackage
import com.jetbrains.python.packaging.common.PythonPackageManagementListener
@@ -53,13 +52,10 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Dispos
}
@get:ApiStatus.Internal
@set:ApiStatus.Internal
protected open var dependencies: List<PythonPackage> = emptyList()
@ApiStatus.Internal
@Volatile
protected open var installedPackages: List<PythonPackage> = emptyList()
protected var installedPackages: List<PythonPackage> = emptyList()
@ApiStatus.Internal
@Volatile
@@ -102,7 +98,6 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Dispos
}
waitForInit()
reloadDependencies()
val normalizedPackagesNames = packages.map { PyPackageName.normalizePackageName(it) }
uninstallPackageCommand(*normalizedPackagesNames.toTypedArray()).getOr { return it }
@@ -115,7 +110,6 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Dispos
return it
}
reloadDependencies()
if (packages != installedPackages) {
installedPackages = packages
PyPackageCoroutine.launch(project) {
@@ -197,16 +191,6 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Dispos
@ApiStatus.Internal
protected abstract suspend fun loadOutdatedPackagesCommand(): PyResult<List<PythonOutdatedPackage>>
@ApiStatus.Internal
suspend fun reloadDependencies(): List<PythonPackage> {
val dependenciesExtractor = PythonDependenciesExtractor.forSdk(project, sdk) ?: return emptyList()
dependencies = dependenciesExtractor.extract()
return dependencies
}
@ApiStatus.Internal
fun listDependencies(): List<PythonPackage> = dependencies
@ApiStatus.Internal
suspend fun waitForInit() {
initializationJob?.join()
@@ -21,9 +21,7 @@ import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.VirtualFileManager
import com.jetbrains.python.PyBundle.message
import com.jetbrains.python.getOrNull
import com.jetbrains.python.packaging.PyPackageName
import com.jetbrains.python.packaging.PyPackageService
import com.jetbrains.python.packaging.PyPackageVersionNormalizer
import com.jetbrains.python.packaging.*
import com.jetbrains.python.packaging.cache.PythonSimpleRepositoryCache
import com.jetbrains.python.packaging.common.PythonPackage
import com.jetbrains.python.packaging.common.PythonPackageDetails
@@ -34,7 +32,6 @@ import com.jetbrains.python.packaging.management.*
import com.jetbrains.python.packaging.management.ui.PythonPackageManagerUI
import com.jetbrains.python.packaging.packageRequirements.PackageNode
import com.jetbrains.python.packaging.packageRequirements.PythonPackageRequirementsTreeExtractor
import com.jetbrains.python.packaging.pyRequirement
import com.jetbrains.python.packaging.repository.*
import com.jetbrains.python.packaging.statistics.PythonPackagesToolwindowStatisticsCollector
import com.jetbrains.python.packaging.toolwindow.model.*
@@ -285,9 +282,8 @@ class PyPackagingToolWindowService(val project: Project, val serviceScope: Corou
suspend fun refreshInstalledPackages() {
val sdk = currentSdk ?: return
val manager = manager ?: return
withContext(Dispatchers.Default) {
val declaredPackages = manager.reloadDependencies()
val declaredPackages = PythonDependenciesExtractor.forSdk(project, sdk)?.extract() ?: emptyList()
val installedDeclaredPackages = findInstalledDeclaredPackages(declaredPackages)
val treeExtractor = PythonPackageRequirementsTreeExtractor.forSdk(sdk)
@@ -313,9 +309,9 @@ class PyPackagingToolWindowService(val project: Project, val serviceScope: Corou
}
private suspend fun findInstalledDeclaredPackages(declaredPackages: List<PythonPackage>): List<PythonPackage> =
manager?.listInstalledPackages()?.filter {
manager.listInstalledPackages().filter {
it.name in declaredPackages.map { pkg -> pkg.name }
} ?: emptyList()
}
private suspend fun processPackagesWithRequirementsTree(
packages: List<PythonPackage>,
@@ -6,6 +6,7 @@ import com.intellij.openapi.projectRoots.Sdk
import com.jetbrains.python.PyBundle
import com.jetbrains.python.errorProcessing.PyResult
import com.jetbrains.python.packaging.PyPackageName
import com.jetbrains.python.packaging.PythonDependenciesExtractor
import com.jetbrains.python.packaging.common.PythonOutdatedPackage
import com.jetbrains.python.packaging.common.PythonPackage
import com.jetbrains.python.packaging.common.PythonRepositoryPackageSpecification
@@ -60,8 +61,8 @@ class PoetryPackageManager(project: Project, sdk: Sdk) : PythonPackageManager(pr
/**
* Categorizes packages into standalone packages and pyproject.toml declared packages.
*/
private fun categorizePackages(packages: Array<out String>): Pair<List<PyPackageName>, List<PyPackageName>> {
val dependencyNames = dependencies.map { it.name }.toSet()
private suspend fun categorizePackages(packages: Array<out String>): Pair<List<PyPackageName>, List<PyPackageName>> {
val dependencyNames = PythonDependenciesExtractor.forSdk(project, sdk)?.extract()?.map { it.name }?.toSet() ?: emptySet()
return packages
.map { PyPackageName.from(it) }
.partition { it.name !in dependencyNames }
@@ -5,6 +5,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
import com.jetbrains.python.errorProcessing.PyResult
import com.jetbrains.python.packaging.PyPackageName
import com.jetbrains.python.packaging.PythonDependenciesExtractor
import com.jetbrains.python.packaging.common.PythonOutdatedPackage
import com.jetbrains.python.packaging.common.PythonPackage
import com.jetbrains.python.packaging.common.PythonRepositoryPackageSpecification
@@ -53,8 +54,8 @@ internal class UvPackageManager(project: Project, sdk: Sdk, private val uv: UvLo
/**
* Categorizes packages into standalone packages and pyproject.toml declared packages.
*/
private fun categorizePackages(packages: Array<out String>): Pair<List<PyPackageName>, List<PyPackageName>> {
val dependencyNames = dependencies.map { it.name }.toSet()
private suspend fun categorizePackages(packages: Array<out String>): Pair<List<PyPackageName>, List<PyPackageName>> {
val dependencyNames = PythonDependenciesExtractor.forSdk(project, sdk)?.extract()?.map { it.name }?.toSet() ?: emptySet()
return packages
.map { PyPackageName.from(it) }
.partition { it.name !in dependencyNames || sdk.uvUsePackageManagement }
@@ -14,11 +14,14 @@ import org.jetbrains.annotations.TestOnly
@TestOnly
class TestPythonPackageManager(project: Project, sdk: Sdk) : PythonPackageManager(project, sdk) {
override var installedPackages: List<PythonPackage> = DEFAULT_PACKAGES.toMutableList()
private var packageNames: List<String> = emptyList()
private var packageDetails: PythonPackageDetails? = null
private var packageVersions: Map<String, List<String>> = emptyMap()
init {
installedPackages = DEFAULT_PACKAGES.toMutableList()
}
override val repositoryManager: TestPythonRepositoryManager
get() = TestPythonRepositoryManager(project)
.withPackageNames(packageNames)