Exclude inner venv on opening project directory (PY-39648)

GitOrigin-RevId: 63f3352991377875696f7acfb7c8a7d93cba6951
This commit is contained in:
Semyon Proshev
2019-12-11 17:31:39 +00:00
committed by intellij-monorepo-bot
parent 553688cd43
commit 1359157e7b
3 changed files with 29 additions and 20 deletions
@@ -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
}
@@ -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<Throwable> {
model.commit()
}
}
private fun suggestAssociatedSdkName(sdkHome: String, associatedPath: String?): String? {
val baseSdkName = PythonSdkType.suggestBaseSdkName(sdkHome) ?: return null
@@ -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<Throwable> {
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?