PY-82457 PythonSdk: Cannot configure from inspection from requirements.txt

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

GitOrigin-RevId: 405dc648ccb26a6aa8e9b48e052bb27d9ff24a5e
This commit is contained in:
Nikita.Ashihmin
2025-07-07 14:28:13 +00:00
committed by intellij-monorepo-bot
parent 66b38c2248
commit 685e2fd0ce
5 changed files with 44 additions and 19 deletions
@@ -128,7 +128,8 @@
<extensions defaultExtensionNs="Pythonid">
<projectSdkConfigurationExtension
implementation="com.intellij.pycharm.community.ide.impl.configuration.PyRequirementsTxtOrSetupPySdkConfiguration"
id="requirementsTxtOrSetupPy"/>
id="
requirementsTxtOrSetupPy"/>
<projectSdkConfigurationExtension
implementation="com.intellij.pycharm.community.ide.impl.conda.PyEnvironmentYmlSdkConfiguration"
id="environmentYml"/>
@@ -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) }
}
}
@@ -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
@@ -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<SetupPyManager>(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 {
@@ -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)
}
}
}
}