diff --git a/python/ide/impl/src/com/jetbrains/python/PythonSdkConfigurator.kt b/python/ide/impl/src/com/jetbrains/python/PythonSdkConfigurator.kt index 03ad93f3d0fa..b330eaceaee9 100644 --- a/python/ide/impl/src/com/jetbrains/python/PythonSdkConfigurator.kt +++ b/python/ide/impl/src/com/jetbrains/python/PythonSdkConfigurator.kt @@ -70,6 +70,7 @@ class PythonSdkConfigurator : DirectoryProjectConfigurator { findExistingAssociatedSdk(module, existingSdks)?.let { SdkConfigurationUtil.setDirectoryProjectSdk(project, it) + module.excludeInnerVirtualEnv(it) return } @@ -78,6 +79,7 @@ class PythonSdkConfigurator : DirectoryProjectConfigurator { SdkConfigurationUtil.addSdk(newSdk) newSdk.associateWithModule(module, null) SdkConfigurationUtil.setDirectoryProjectSdk(project, newSdk) + module.excludeInnerVirtualEnv(it) return } diff --git a/python/src/com/jetbrains/python/sdk/PySdkExt.kt b/python/src/com/jetbrains/python/sdk/PySdkExt.kt index 41a5cb48bc43..42760dd7398a 100644 --- a/python/src/com/jetbrains/python/sdk/PySdkExt.kt +++ b/python/src/com/jetbrains/python/sdk/PySdkExt.kt @@ -17,6 +17,7 @@ package com.jetbrains.python.sdk import com.intellij.execution.ExecutionException import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.WriteAction import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.progress.ProgressManager @@ -26,13 +27,16 @@ import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.project.rootManager import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil +import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.util.Key import com.intellij.openapi.util.UserDataHolder import com.intellij.openapi.util.UserDataHolderBase import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.StandardFileSystems +import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.PathUtil import com.intellij.util.messages.Topic @@ -196,6 +200,21 @@ val Module.baseDir: VirtualFile? val Module.basePath: String? get() = baseDir?.path +fun Module.excludeInnerVirtualEnv(sdk: Sdk) { + val root = sdk.homePath?.let { PythonSdkUtil.getVirtualEnvRoot(it) }?.let { LocalFileSystem.getInstance().findFileByIoFile(it) } ?: return + + val model = ModuleRootManager.getInstance(this).modifiableModel + + val contentEntry = model.contentEntries.firstOrNull { + val contentFile = it.file + contentFile != null && VfsUtil.isAncestor(contentFile, root, true) + } ?: return + contentEntry.addExcludeFolder(root) + + WriteAction.run { + model.commit() + } +} private fun suggestAssociatedSdkName(sdkHome: String, associatedPath: String?): String? { val baseSdkName = PythonSdkType.suggestBaseSdkName(sdkHome) ?: return null diff --git a/python/src/com/jetbrains/python/sdk/add/PyAddNewVirtualEnvPanel.kt b/python/src/com/jetbrains/python/sdk/add/PyAddNewVirtualEnvPanel.kt index 17ed5610e3ce..ed4ae4e766f3 100644 --- a/python/src/com/jetbrains/python/sdk/add/PyAddNewVirtualEnvPanel.kt +++ b/python/src/com/jetbrains/python/sdk/add/PyAddNewVirtualEnvPanel.kt @@ -2,7 +2,6 @@ package com.jetbrains.python.sdk.add import com.intellij.execution.ExecutionException -import com.intellij.openapi.application.WriteAction import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleUtil @@ -11,13 +10,11 @@ import com.intellij.openapi.progress.Task import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.projectRoots.Sdk -import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.ui.TextFieldWithBrowseButton import com.intellij.openapi.ui.ValidationInfo import com.intellij.openapi.util.UserDataHolder import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.vfs.StandardFileSystems -import com.intellij.openapi.vfs.VfsUtil import com.intellij.ui.DocumentAdapter import com.intellij.ui.components.JBCheckBox import com.intellij.util.ui.FormBuilder @@ -103,7 +100,7 @@ class PyAddNewVirtualEnvPanel(private val project: Project?, if (!shared) { sdk.associateWithModule(module, newProjectPath) } - excludeDirectoryFromProject(root, project) + moduleToExcludeSdkFrom(root, project)?.excludeInnerVirtualEnv(sdk) with(PySdkSettings.instance) { setPreferredVirtualEnvBasePath(FileUtil.toSystemIndependentName(pathField.text), projectBasePath) preferredVirtualEnvBaseSdk = baseSdkField.selectedSdk?.homePath @@ -120,23 +117,14 @@ class PyAddNewVirtualEnvPanel(private val project: Project?, baseSdkField.childComponent.addItemListener { listener.run() } } - private fun excludeDirectoryFromProject(path: String, project: Project?) { + private fun moduleToExcludeSdkFrom(path: String, project: Project?): Module? { val possibleProjects = if (project != null) listOf(project) else ProjectManager.getInstance().openProjects.asList() - val rootFile = StandardFileSystems.local().refreshAndFindFileByPath(path) ?: return - val module = possibleProjects - .asSequence() - .map { ModuleUtil.findModuleForFile(rootFile, it) } - .filterNotNull() - .firstOrNull() ?: return - val model = ModuleRootManager.getInstance(module).modifiableModel - val contentEntry = model.contentEntries.firstOrNull { - val contentFile = it.file - contentFile != null && VfsUtil.isAncestor(contentFile, rootFile, true) - } ?: return - contentEntry.addExcludeFolder(rootFile) - WriteAction.run { - model.commit() - } + val rootFile = StandardFileSystems.local().refreshAndFindFileByPath(path) ?: return null + return possibleProjects + .asSequence() + .map { ModuleUtil.findModuleForFile(rootFile, it) } + .filterNotNull() + .firstOrNull() } private val projectBasePath: @SystemIndependent String?