From f23467a1be220aa32209e03f53ebe7873db08374 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Wed, 13 Mar 2024 13:54:59 +0100 Subject: [PATCH] IDEA-348926 git: better handle changelists during unshelve with an unfinished CLM refresh in progress Fix the case when the file modification inside 'computeUnderChangeListSync' is picked up by an prior-started CLM refresh, and is being processed before the 'setDefaultList' command reaches the updater ChangeListWorker(myMainWorker = false). GitOrigin-RevId: d95c2a0fb5bd3e9821365e93eb00964ff33692c8 --- .../openapi/vcs/impl/PartialChangesUtil.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/PartialChangesUtil.kt b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/PartialChangesUtil.kt index adf092314691..61f9ee9f2b07 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/PartialChangesUtil.kt +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/PartialChangesUtil.kt @@ -157,6 +157,7 @@ object PartialChangesUtil { val changeListManager = ChangeListManagerEx.getInstanceEx(project) val oldDefaultList = changeListManager.defaultChangeList if (targetChangeList == null || + targetChangeList == oldDefaultList || !changeListManager.areChangeListsEnabled()) { if (targetChangeList != null) { LOG.debug("Active changelist unchanged: ${targetChangeList.name}") @@ -164,6 +165,8 @@ object PartialChangesUtil { return task.compute() } + waitForChangeListManagerUpdate(project) + switchChangeList(changeListManager, targetChangeList, oldDefaultList) val clmConflictTracker = ChangelistConflictTracker.getInstance(project) try { @@ -172,16 +175,20 @@ object PartialChangesUtil { } finally { clmConflictTracker.setIgnoreModifications(false) - if (ApplicationManager.getApplication().isReadAccessAllowed) { - LOG.warn("Can't wait till changes are applied while holding read lock", Throwable()) - } - else { - ChangeListManagerEx.getInstanceEx(project).waitForUpdate() - } + waitForChangeListManagerUpdate(project) restoreChangeList(changeListManager, targetChangeList, oldDefaultList) } } + private fun waitForChangeListManagerUpdate(project: Project) { + if (ApplicationManager.getApplication().isReadAccessAllowed) { + LOG.warn("Can't wait till changes are applied while holding read lock", Throwable()) + } + else { + ChangeListManagerEx.getInstanceEx(project).waitForUpdate() + } + } + private fun switchChangeList(clm: ChangeListManagerEx, targetChangeList: LocalChangeList, oldDefaultList: LocalChangeList) {