From 685e2fd0ce2310d574a72c6a7278336ea43b2023 Mon Sep 17 00:00:00 2001 From: "Nikita.Ashihmin" Date: Mon, 7 Jul 2025 16:23:03 +0400 Subject: [PATCH] PY-82457 PythonSdk: Cannot configure from inspection from requirements.txt Signed-off-by: Nikita.Ashihmin GitOrigin-RevId: 405dc648ccb26a6aa8e9b48e052bb27d9ff24a5e --- .../intellij.pycharm.community.ide.impl.xml | 3 +- .../ide/impl/PythonSdkConfigurator.kt | 7 ++- ...equirementsTxtOrSetupPySdkConfiguration.kt | 43 +++++++++++++------ .../packaging/setupPy/SetupPyManager.kt | 4 +- .../PyProjectSdkConfiguration.kt | 6 ++- 5 files changed, 44 insertions(+), 19 deletions(-) diff --git a/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml b/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml index dced022205ab..ae035a9324f9 100644 --- a/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml +++ b/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml @@ -128,7 +128,8 @@ + id=" + requirementsTxtOrSetupPy"/> diff --git a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PythonSdkConfigurator.kt b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PythonSdkConfigurator.kt index b6f23da0b104..d6fe4a592acd 100644 --- a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PythonSdkConfigurator.kt +++ b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PythonSdkConfigurator.kt @@ -69,10 +69,9 @@ class PythonSdkConfigurator : DirectoryProjectConfigurator { StartupManager.getInstance(project).runWhenProjectIsInitialized { PyPackageCoroutine.launch(project) { - val extension = findExtension(module) - val lifetime = extension?.let { suppressTipAndInspectionsFor(module, it) } - - withBackgroundProgress(project, PySdkBundle.message("python.configuring.interpreter.progress"), extension == null) { + withBackgroundProgress(project, PySdkBundle.message("python.configuring.interpreter.progress"), true) { + val extension = findExtension(module) + val lifetime = extension?.let { suppressTipAndInspectionsFor(module, it) } lifetime.use { configureSdk(project, module, extension) } } } diff --git a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/configuration/PyRequirementsTxtOrSetupPySdkConfiguration.kt b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/configuration/PyRequirementsTxtOrSetupPySdkConfiguration.kt index e46a05743f58..2d41b8ee7db0 100644 --- a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/configuration/PyRequirementsTxtOrSetupPySdkConfiguration.kt +++ b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/configuration/PyRequirementsTxtOrSetupPySdkConfiguration.kt @@ -9,7 +9,6 @@ import com.intellij.openapi.diagnostic.fileLogger import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.fileTypes.FileTypeRegistry import com.intellij.openapi.module.Module -import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil @@ -20,6 +19,7 @@ import com.intellij.openapi.util.NlsSafe import com.intellij.openapi.util.use import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile +import com.intellij.platform.util.progress.reportRawProgress import com.intellij.pycharm.community.ide.impl.PyCharmCommunityCustomizationBundle import com.intellij.pycharm.community.ide.impl.configuration.PySdkConfigurationCollector.InputData import com.intellij.pycharm.community.ide.impl.configuration.PySdkConfigurationCollector.Source @@ -32,13 +32,16 @@ import com.jetbrains.python.PyBundle import com.jetbrains.python.PySdkBundle import com.jetbrains.python.packaging.PyPackageManager import com.jetbrains.python.packaging.PyPackageUtil -import com.jetbrains.python.packaging.PyTargetEnvironmentPackageManager +import com.jetbrains.python.packaging.management.PythonPackageManager +import com.jetbrains.python.packaging.requirementsTxt.PythonRequirementTxtSdkUtils +import com.jetbrains.python.packaging.setupPy.SetupPyManager import com.jetbrains.python.requirements.RequirementsFileType import com.jetbrains.python.sdk.basePath import com.jetbrains.python.sdk.configuration.PyProjectSdkConfigurationExtension import com.jetbrains.python.sdk.configuration.createVirtualEnvAndSdkSynchronously import com.jetbrains.python.sdk.isTargetBased import com.jetbrains.python.sdk.showSdkExecutionException +import com.jetbrains.python.util.ShowingMessageErrorSync import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.awt.BorderLayout @@ -86,20 +89,24 @@ class PyRequirementsTxtOrSetupPySdkConfiguration : PyProjectSdkConfigurationExte return sdk } - thisLogger().debug("Installing packages") - ProgressManager.progress(PyBundle.message("python.packaging.installing.packages")) - val basePath = module.basePath + val isRequirements = requirementsTxtOrSetupPyFile.name != SetupPyManager.SETUP_PY - val packageManager = PyPackageManager.getInstance(sdk) - val command = getCommandForPipInstall(requirementsTxtOrSetupPyFile) + if (isRequirements) { + PythonRequirementTxtSdkUtils.saveRequirementsTxtPath(module.project, sdk, requirementsTxtOrSetupPyFile.toNioPath()) + } - // FIXME: lame cast... - if (!sdk.isTargetBased() && packageManager is PyTargetEnvironmentPackageManager) { - packageManager.install(emptyList(), command, basePath) + if (!sdk.isTargetBased()) { + val pythonPackageManager = PythonPackageManager.forSdk(module.project, sdk) + pythonPackageManager.sync().getOr { + PySdkConfigurationCollector.logVirtualEnv(module.project, VirtualEnvResult.INSTALLATION_FAILURE) + ShowingMessageErrorSync.emit(it.error) + return null + } } else { - // TODO: double check installing over remote target - packageManager.install(emptyList(), command) + withContext(Dispatchers.Default) { + createTargetBased(sdk, requirementsTxtOrSetupPyFile) + } } return sdk @@ -112,6 +119,18 @@ class PyRequirementsTxtOrSetupPySdkConfiguration : PyProjectSdkConfigurationExte } } + private suspend fun createTargetBased( + sdk: Sdk, + requirementsTxtOrSetupPyFile: VirtualFile, + ) { + reportRawProgress { + it.text(PyBundle.message("python.packaging.installing.packages")) + val packageManager = PyPackageManager.getInstance(sdk) + val command = getCommandForPipInstall(requirementsTxtOrSetupPyFile) + packageManager.install(emptyList(), command) + } + } + private fun getRequirementsTxtOrSetupPy(module: Module) = PyPackageUtil.findRequirementsTxt(module) ?: PyPackageUtil.findSetupPy(module)?.virtualFile diff --git a/python/src/com/jetbrains/python/packaging/setupPy/SetupPyManager.kt b/python/src/com/jetbrains/python/packaging/setupPy/SetupPyManager.kt index 8f939d5b861f..18e25891fc13 100644 --- a/python/src/com/jetbrains/python/packaging/setupPy/SetupPyManager.kt +++ b/python/src/com/jetbrains/python/packaging/setupPy/SetupPyManager.kt @@ -14,7 +14,6 @@ import com.intellij.psi.PsiManager import com.jetbrains.python.PythonPluginDisposable import com.jetbrains.python.packaging.PyRequirement import com.jetbrains.python.packaging.dependencies.cache.PythonDependenciesManagerCached -import com.jetbrains.python.packaging.setupPy.SetupPyHelpers.SETUP_PY import com.jetbrains.python.psi.PyFile import com.jetbrains.python.sdk.associatedModuleDir import com.jetbrains.python.sdk.sdkFlavor @@ -60,6 +59,9 @@ class SetupPyManager private constructor(project: Project, val sdk: Sdk) : Pytho companion object { private val KEY = Key(this::class.java.name) + @ApiStatus.Internal + const val SETUP_PY: String = SetupPyHelpers.SETUP_PY + @JvmStatic fun getInstance(project: Project, sdk: Sdk): SetupPyManager = sdk.getOrCreateUserDataUnsafe(KEY) { SetupPyManager(project, sdk).also { diff --git a/python/src/com/jetbrains/python/sdk/configuration/PyProjectSdkConfiguration.kt b/python/src/com/jetbrains/python/sdk/configuration/PyProjectSdkConfiguration.kt index 748dbd0adba2..4329bb9166ac 100644 --- a/python/src/com/jetbrains/python/sdk/configuration/PyProjectSdkConfiguration.kt +++ b/python/src/com/jetbrains/python/sdk/configuration/PyProjectSdkConfiguration.kt @@ -30,6 +30,8 @@ import com.jetbrains.python.psi.PyFile import com.jetbrains.python.sdk.PySdkPopupFactory import com.jetbrains.python.sdk.configurePythonSdk import com.jetbrains.python.sdk.uv.isUv +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext object PyProjectSdkConfiguration { @@ -45,7 +47,9 @@ object PyProjectSdkConfiguration { setSdkUsingExtension(module, extension) { reportRawProgress { it.text(extension.getIntention(module) ?: "") - extension.createAndAddSdkForInspection(module) + withContext(Dispatchers.Default) { + extension.createAndAddSdkForInspection(module) + } } } }