diff --git a/platform/dvcs-impl/BUILD.bazel b/platform/dvcs-impl/BUILD.bazel index 318de0605b6b..099b0fac298f 100644 --- a/platform/dvcs-impl/BUILD.bazel +++ b/platform/dvcs-impl/BUILD.bazel @@ -34,6 +34,7 @@ jvm_library( "//platform/dvcs-api:vcs-dvcs", "@lib//:miglayout-swing", "@lib//:stream_ex", + "//platform/util/jdom", "//platform/util:util-ui", "//platform/core-ui", "//platform/diff-impl", @@ -81,6 +82,7 @@ jvm_library( "//platform/vcs-tests:vcs-testFramework", "@lib//:miglayout-swing", "@lib//:stream_ex", + "//platform/util/jdom", "//platform/util:util-ui", "//platform/core-ui", "//platform/diff-impl", diff --git a/platform/dvcs-impl/intellij.platform.vcs.dvcs.impl.iml b/platform/dvcs-impl/intellij.platform.vcs.dvcs.impl.iml index 21bed64c8d73..c73bbe97335e 100644 --- a/platform/dvcs-impl/intellij.platform.vcs.dvcs.impl.iml +++ b/platform/dvcs-impl/intellij.platform.vcs.dvcs.impl.iml @@ -33,6 +33,7 @@ + diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/ignore/IgnoredToExcludedSynchronizer.kt b/platform/dvcs-impl/src/com/intellij/dvcs/ignore/IgnoredToExcludedSynchronizer.kt index b0678ecc9baf..0ab6192fdae4 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/ignore/IgnoredToExcludedSynchronizer.kt +++ b/platform/dvcs-impl/src/com/intellij/dvcs/ignore/IgnoredToExcludedSynchronizer.kt @@ -33,7 +33,8 @@ import com.intellij.openapi.vcs.VcsConfiguration import com.intellij.openapi.vcs.VcsNotificationIdsHolder.Companion.IGNORED_TO_EXCLUDE_NOT_FOUND import com.intellij.openapi.vcs.VcsNotifier import com.intellij.openapi.vcs.changes.ChangeListManager -import com.intellij.openapi.vcs.changes.VcsIgnoreManagerImpl +import com.intellij.openapi.vcs.changes.ChangeListManagerImpl +import com.intellij.openapi.vcs.changes.VcsManagedFilesHolder import com.intellij.openapi.vcs.changes.ignore.lang.IgnoreFileType import com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager import com.intellij.openapi.vcs.changes.ui.SelectFilesDialog @@ -47,9 +48,11 @@ import com.intellij.ui.EditorNotificationPanel import com.intellij.ui.EditorNotificationProvider import com.intellij.ui.EditorNotifications import com.intellij.util.Alarm +import com.intellij.util.messages.impl.subscribeAsFlow import com.intellij.util.ui.update.MergingUpdateQueue import com.intellij.util.ui.update.Update import kotlinx.coroutines.* +import kotlinx.coroutines.flow.first import kotlinx.coroutines.sync.Mutex import org.jetbrains.annotations.ApiStatus import java.util.* @@ -178,7 +181,7 @@ class IgnoredToExcludedSynchronizer(project: Project, private val cs: CoroutineS try { val dirsToExclude = withModalProgress(project, ActionsBundle.message("action.CheckIgnoredAndNotExcludedDirectories.progress")) { - VcsIgnoreManagerImpl.getInstanceImpl(project).awaitRefreshQueue() + awaitIgnoredFilesUpdate(project) val ignoredFilePaths = ChangeListManager.getInstance(project).ignoredFilePaths determineIgnoredDirsToExclude(project, ignoredFilePaths) } @@ -228,6 +231,20 @@ private fun containsShelfDirectoryOrUnderIt(filePath: FilePath, shelfPath: Strin FileUtil.isAncestor(shelfPath, filePath.path, false) || FileUtil.isAncestor(filePath.path, shelfPath, false) +private suspend fun awaitIgnoredFilesUpdate(project: Project) { + withContext(Dispatchers.Default) { + project.messageBus.subscribeAsFlow(VcsManagedFilesHolder.TOPIC) { + send(Unit) + VcsManagedFilesHolder.VcsManagedFilesHolderListener { + trySend(Unit) + } + }.first { + val clm = ChangeListManagerImpl.getInstanceImpl(project) + !clm.isIgnoredInUpdateMode + } + } +} + private fun determineIgnoredDirsToExclude(project: Project, ignoredPaths: Collection): List { val sourceRoots = getProjectSourceRoots(project) val fileIndex = ProjectFileIndex.getInstance(project) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoreManagerImpl.kt b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoreManagerImpl.kt index e2dabbca9094..2b61efcb6156 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoreManagerImpl.kt +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoreManagerImpl.kt @@ -11,7 +11,6 @@ import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.fileTypes.FileTypeManager import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.runBlockingCancellable -import com.intellij.openapi.progress.util.ProgressIndicatorUtils import com.intellij.openapi.project.InitialVfsRefreshService import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectCloseListener @@ -31,7 +30,6 @@ import com.intellij.vcsUtil.VcsUtil import kotlinx.coroutines.CoroutineScope import org.jetbrains.annotations.ApiStatus.Internal import java.io.IOException -import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit import kotlin.io.path.invariantSeparatorsPathString @@ -88,14 +86,6 @@ class VcsIgnoreManagerImpl(private val project: Project, coroutineScope: Corouti } } - fun awaitRefreshQueue() { - assert(!ApplicationManager.getApplication().isReadAccessAllowed) - if (ignoreRefreshQueue.isEmpty) return - val waiter = CountDownLatch(1) - ignoreRefreshQueue.queue(Update.create(waiter) { waiter.countDown() }) - ProgressIndicatorUtils.awaitWithCheckCanceled(waiter) - } - fun findIgnoreFileType(vcs: AbstractVcs): IgnoreFileType? { val ignoredFileContentProvider = findIgnoredFileContentProvider(vcs) ?: return null return FileTypeManager.getInstance().getFileTypeByFileName(ignoredFileContentProvider.fileName) as? IgnoreFileType