From 3dabdc6845076a316dc71f3a48128efd0d9fd62f Mon Sep 17 00:00:00 2001 From: Dmitry Zhuravlev Date: Tue, 9 Jul 2019 16:59:03 +0300 Subject: [PATCH] vcs: do not process externally added files under .idea directory (IDEA-215708 IDEA-217488) GitOrigin-RevId: 56981d69cbeceb9da61be6bbb868dc65f01b2347 --- .../vcs/ExternallyAddedFilesProcessorImpl.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ExternallyAddedFilesProcessorImpl.kt b/platform/vcs-impl/src/com/intellij/openapi/vcs/ExternallyAddedFilesProcessorImpl.kt index c5d89453e3b2..cd42a0ad6786 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ExternallyAddedFilesProcessorImpl.kt +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ExternallyAddedFilesProcessorImpl.kt @@ -13,9 +13,13 @@ import com.intellij.openapi.vcs.VcsShowConfirmationOption.Value.DO_NOTHING_SILEN import com.intellij.openapi.vcs.changes.ChangeListListener import com.intellij.openapi.vcs.changes.ChangeListManagerImpl import com.intellij.openapi.vcs.changes.VcsIgnoreManager +import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.newvfs.events.VFileCreateEvent import com.intellij.openapi.vfs.newvfs.events.VFileEvent +import com.intellij.project.isDirectoryBased +import com.intellij.project.stateStore import com.intellij.util.concurrency.QueueProcessor import com.intellij.vfs.AsyncVfsEventsListener import com.intellij.vfs.AsyncVfsEventsPostProcessor @@ -78,11 +82,13 @@ class ExternallyAddedFilesProcessorImpl(project: Project, override fun filesChanged(events: List) { if (!needProcessExternalFiles()) return + val configDir = project.getProjectConfigDir() val externallyAddedFiles = events.asSequence() .filter(VFileEvent::isFromRefresh) .filter { it is VFileCreateEvent } .mapNotNull(VFileEvent::getFile) + .filterNot { isProjectConfigDirOrUnderIt(configDir, it) } .toSet() if (externallyAddedFiles.isEmpty()) return @@ -146,6 +152,19 @@ class ExternallyAddedFilesProcessorImpl(project: Project, private fun isUnder(parents: Collection, child: VirtualFile) = generateSequence(child) { it.parent }.any { it in parents } + private fun isProjectConfigDirOrUnderIt(configDir: VirtualFile?, file: VirtualFile) = + configDir != null && VfsUtilCore.isAncestor(configDir, file, false) + + private fun Project.getProjectConfigDir(): VirtualFile? { + if (!isDirectoryBased || isDefault) return null + + val projectConfigDir = stateStore.projectConfigDir?.let(LocalFileSystem.getInstance()::findFileByPath) + if (projectConfigDir == null) { + LOG.warn("Cannot find project config directory for non-default and non-directory based project ${name}") + } + return projectConfigDir + } + @TestOnly fun waitForEventsProcessedInTestMode() { assert(ApplicationManager.getApplication().isUnitTestMode)