PY-87236 Fix version-sensitive management detection in PipManagementInstaller

hasInstalledPackage(PythonPackage) matched both name and version, so
if the venv had any pip version other than the bundled 24.3.1 (e.g.
after a user upgrade), hasManagement() returned false. This caused a
redundant reinstall attempt which pip rejected with "To modify pip,
please run python -m pip".

Fix: check by package name only via hasInstalledPackage(String).


(cherry picked from commit b2dfd1a8b74c11fa2b04d687e31cb48b9ea774a0)

IJ-MR-194802

GitOrigin-RevId: 2a86cbab1978bc119f0e842c788c8355b8bc4bb1
This commit is contained in:
Vitaly Legchilkin
2026-03-05 19:28:08 +01:00
committed by intellij-monorepo-bot
parent 95d47787ec
commit 834c5b33d6

View File

@@ -110,7 +110,7 @@ class PipManagementInstaller(private val sdk: Sdk, private val manager: PythonPa
}
suspend fun hasManagement(): Boolean =
languageLevel < LanguageLevel.PYTHON27 || (manager.hasInstalledPackage(PIP_PACKAGE) && hasSetuptools())
languageLevel < LanguageLevel.PYTHON27 || (hasPip() && hasSetuptools())
private suspend fun installManagement(): PyResult<Unit> {
if (!hasPip()) installWheel(WheelFiles.PIP_WHEEL_NAME).getOr { return it }
@@ -126,21 +126,16 @@ class PipManagementInstaller(private val sdk: Sdk, private val manager: PythonPa
ExecService().execGetStdout(pythonPath, args).mapSuccess { }
}
private suspend fun hasPip(): Boolean = manager.hasInstalledPackage(PIP_PACKAGE)
private suspend fun hasPip(): Boolean = manager.hasInstalledPackage(PyPackageUtil.PIP)
private suspend fun hasSetuptools(): Boolean =
languageLevel >= LanguageLevel.PYTHON312 ||
manager.hasInstalledPackage(SETUPTOOLS_PACKAGE) ||
manager.hasInstalledPackage(DISTRIBUTE_PACKAGE)
manager.hasInstalledPackage(PyPackageUtil.SETUPTOOLS) ||
manager.hasInstalledPackage(PyPackageUtil.DISTRIBUTE)
private object WheelFiles {
const val SETUPTOOLS_WHEEL_NAME = "setuptools-44.1.1-py2.py3-none-any.whl"
const val PIP_WHEEL_NAME = "pip-24.3.1-py2.py3-none-any.whl"
}
companion object {
val PIP_PACKAGE: PythonPackage = PythonPackage(PyPackageUtil.PIP, "24.3.1", false)
val SETUPTOOLS_PACKAGE: PythonPackage = PythonPackage(PyPackageUtil.SETUPTOOLS, "44.1.1", false)
val DISTRIBUTE_PACKAGE: PythonPackage = PythonPackage(PyPackageUtil.DISTRIBUTE, "", false)
}
}