From 3b6d62e7814b9c0da4f5e2e9eeeaf2d3f8e96220 Mon Sep 17 00:00:00 2001 From: Alexey Katsman Date: Tue, 4 Aug 2026 11:39:43 +0200 Subject: [PATCH] PY-91416 show missing SDK notification for WSL uv projects Skip uv SDK configuration when the associated module has no resolvable base directory. This avoids missing-working-directory failures and preserves the normal missing-SDK notification path. (cherry picked from commit 5aa7b369b7b658e311c47a616b332f2b40d8392a) IJ-MR-216899 GitOrigin-RevId: 77878855d244c1fb6446d025edc8a6ddb744f147 --- .../sdk/configuration/PyUvBaseSdkConfiguration.kt | 2 +- .../uv/sdk/configuration/PyUvSdkConfiguration.kt | 2 +- .../jetbrains/python/uv/sdk/configuration/uvVenv.kt | 13 ++++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/python/src/com/jetbrains/python/uv/sdk/configuration/PyUvBaseSdkConfiguration.kt b/python/src/com/jetbrains/python/uv/sdk/configuration/PyUvBaseSdkConfiguration.kt index 0718aae8e95f..0ae954f148a6 100644 --- a/python/src/com/jetbrains/python/uv/sdk/configuration/PyUvBaseSdkConfiguration.kt +++ b/python/src/com/jetbrains/python/uv/sdk/configuration/PyUvBaseSdkConfiguration.kt @@ -19,7 +19,7 @@ internal class PyUvBaseSdkConfiguration : PyProjectSdkConfigurationExtension { override suspend fun checkEnvironmentAndPrepareSdkCreator(module: Module, venvsInModule: List): CreateSdkInfo? = prepareSdkCreator( - { checkManageableUvEnvBase(venvsInModule) } + { checkManageableUvEnvBase(module, toolId, venvsInModule) } ) { envExists -> { createUvSdk(module, toolId, venvsInModule, envExists) } } override fun asPyProjectTomlSdkConfigurationExtension(): PyProjectTomlConfigurationExtension? = null diff --git a/python/src/com/jetbrains/python/uv/sdk/configuration/PyUvSdkConfiguration.kt b/python/src/com/jetbrains/python/uv/sdk/configuration/PyUvSdkConfiguration.kt index 5b6a139794d6..9d368c7199c6 100644 --- a/python/src/com/jetbrains/python/uv/sdk/configuration/PyUvSdkConfiguration.kt +++ b/python/src/com/jetbrains/python/uv/sdk/configuration/PyUvSdkConfiguration.kt @@ -34,7 +34,7 @@ internal class PyUvSdkConfiguration : PyProjectTomlConfigurationExtension { venvsInModule: List, tomlCheckedByWorkspaceTools: Boolean ): EnvCheckerResult { - val baseCheckResult = checkManageableUvEnvBase(venvsInModule) + val baseCheckResult = checkManageableUvEnvBase(module, toolId, venvsInModule) return when (baseCheckResult) { is EnvCheckerResult.EnvFound, is EnvCheckerResult.SuggestToolInstallation -> baseCheckResult is EnvCheckerResult.EnvNotFound -> if (tomlCheckedByWorkspaceTools || findUvLock(module) != null) baseCheckResult else EnvCheckerResult.CannotConfigure diff --git a/python/src/com/jetbrains/python/uv/sdk/configuration/uvVenv.kt b/python/src/com/jetbrains/python/uv/sdk/configuration/uvVenv.kt index 86fc7f83fa73..37995f64faf5 100644 --- a/python/src/com/jetbrains/python/uv/sdk/configuration/uvVenv.kt +++ b/python/src/com/jetbrains/python/uv/sdk/configuration/uvVenv.kt @@ -8,32 +8,35 @@ import com.intellij.openapi.projectRoots.Sdk import com.intellij.python.community.common.tools.ToolId import com.jetbrains.python.PyBundle import com.jetbrains.python.PythonBinary +import com.jetbrains.python.errorProcessing.ErrorSink import com.jetbrains.python.errorProcessing.PyResult +import com.jetbrains.python.errorProcessing.withProject import com.jetbrains.python.onSuccess +import com.jetbrains.python.sdk.PythonEnvironment import com.jetbrains.python.sdk.baseDir import com.jetbrains.python.sdk.configuration.EnvCheckerResult import com.jetbrains.python.sdk.configuration.findEnvOrNull import com.jetbrains.python.sdk.configuration.getSdkAssociatedModule -import com.jetbrains.python.sdk.PythonEnvironment import com.jetbrains.python.sdk.detectPythonEnvironment import com.jetbrains.python.sdk.setAssociationToModule import com.jetbrains.python.sdk.uv.impl.getUvExecutableLocal import com.jetbrains.python.sdk.uv.setupExistingEnvAndSdk import com.jetbrains.python.sdk.uv.setupNewUvSdkAndEnv -import com.jetbrains.python.errorProcessing.ErrorSink -import com.jetbrains.python.errorProcessing.withProject import com.jetbrains.python.venvReader.tryResolvePath import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.nio.file.Path -import kotlin.collections.contains private val logger = fileLogger() internal suspend fun checkManageableUvEnvBase( + module: Module, + toolId: ToolId, venvsInModule: List, ): EnvCheckerResult { getUvExecutableLocal() ?: return EnvCheckerResult.CannotConfigure + val sdkAssociatedModule = module.getSdkAssociatedModule(toolId) + tryResolvePath(sdkAssociatedModule.baseDir?.path) ?: return EnvCheckerResult.CannotConfigure val intentionName = PyBundle.message("sdk.set.up.uv.environment") val envFound = getUvEnv(venvsInModule)?.findEnvOrNull(intentionName) return envFound ?: EnvCheckerResult.EnvNotFound(intentionName) @@ -71,4 +74,4 @@ private fun getUvEnv(venvsInModule: List): PythonBinary? = venvsIn internal fun PythonBinary.isUvEnv(): Boolean { return detectPythonEnvironment().successOrNull?.let { it is PythonEnvironment.Venv && "uv" in it.config } == true -} \ No newline at end of file +}