diff --git a/python/python-sdk/src/com/jetbrains/python/sdk/PythonSdkAdditionalData.java b/python/python-sdk/src/com/jetbrains/python/sdk/PythonSdkAdditionalData.java index edd740711386..f1af77fe25d1 100644 --- a/python/python-sdk/src/com/jetbrains/python/sdk/PythonSdkAdditionalData.java +++ b/python/python-sdk/src/com/jetbrains/python/sdk/PythonSdkAdditionalData.java @@ -11,6 +11,7 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkAdditionalData; import com.intellij.openapi.util.JDOMExternalizer; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.NioPathUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -274,9 +275,10 @@ public class PythonSdkAdditionalData implements SdkAdditionalData { } } - if (!hasValidWorkingDirectory()) { + if (!hasValidWorkingDirectory() || !myWorkingDirectoryIsCanonical) { Path workingDirectory = flavorMigration.workingDirectory(); if (workingDirectory == null) workingDirectory = requirementsWorkingDirectory; + if (workingDirectory == null && hasValidWorkingDirectory()) workingDirectory = myWorkingDirectory; if (workingDirectory == null) workingDirectory = fallbackWorkingDirectory; if (workingDirectory != null && !workingDirectory.toString().isBlank()) { @@ -321,6 +323,14 @@ public class PythonSdkAdditionalData implements SdkAdditionalData { myWorkingDirectoryIsCanonical = false; myMigrationRequired = true; } + else if (myAssociatedModulePath != null) { + Path associatedModulePath = NioPathUtil.toNioPathOrNull(myAssociatedModulePath); + if (associatedModulePath != null && !Objects.equals(associatedModulePath, EMPTY_WORKING_DIRECTORY)) { + myWorkingDirectory = associatedModulePath; + myWorkingDirectoryIsCanonical = false; + myMigrationRequired = true; + } + } myRequirementsFile = element.getAttributeValue(REQUIREMENTS_FILE); String legacyRequiredTxtPath = element.getAttributeValue(ASSOCIATED_REQUIRED_TXT_PATH); myLegacyRequiredTxtPath = legacyRequiredTxtPath == null ? null : Path.of(legacyRequiredTxtPath); diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkAdditionalDataMigrationActivity.kt b/python/src/com/jetbrains/python/sdk/PythonSdkAdditionalDataMigrationActivity.kt index 314bf22b1b32..ed23957c14a2 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkAdditionalDataMigrationActivity.kt +++ b/python/src/com/jetbrains/python/sdk/PythonSdkAdditionalDataMigrationActivity.kt @@ -10,6 +10,8 @@ import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.startup.ProjectActivity +import com.intellij.platform.backend.workspace.WorkspaceModel +import com.intellij.platform.backend.workspace.impl.WorkspaceModelInternal import com.intellij.util.concurrency.annotations.RequiresWriteLock import org.jetbrains.annotations.ApiStatus import java.nio.file.Path @@ -19,6 +21,10 @@ class PythonSdkAdditionalDataMigrationActivity : ProjectActivity, DumbAware { override suspend fun execute(project: Project) { if (project.isDisposed) return + @Suppress("UnsafeOpenServiceCast") + (WorkspaceModel.getInstance(project) as WorkspaceModelInternal).awaitSynchronizationWithJpsModel() + if (project.isDisposed) return + val pythonSdks = ProjectJdkTable.getInstance().allJdks.filter { PythonSdkUtil.isPythonSdk(it) } writeAction { migratePythonSdkAdditionalData(project, pythonSdks)