fix (vcs): Merge AllowExcludeFromCommitStateHolder into ChangesViewWorkflowManager

Previously `workflowManager.commitWorkflowHandler` with side effect of `updateCommitWorkflowHandler` was called in the constructor blocking EDT.
Also, get rid of `ChangesViewEx.isAllowExcludeFromCommit`.

Fixes IJPL-219614

GitOrigin-RevId: 22c4b55d2f96d317d3288a2c82fda492d2a1917b
This commit is contained in:
Ilia.Shulgin
2025-11-25 19:52:57 +00:00
committed by intellij-monorepo-bot
parent 4f837c4b3a
commit a866ebb5ea
10 changed files with 30 additions and 62 deletions
+1 -2
View File
@@ -758,7 +758,6 @@ f:com.intellij.openapi.vcs.changes.ChangesPreprocess
com.intellij.openapi.vcs.changes.ChangesViewEx
- com.intellij.openapi.vcs.changes.ChangesViewI
- a:getCommitWorkflowHandler():com.intellij.vcs.commit.ChangesViewCommitWorkflowHandler
- a:isAllowExcludeFromCommit():Z
- a:resetViewImmediatelyAndRefreshLater():V
- a:scheduleRefresh(java.lang.Runnable):V
com.intellij.openapi.vcs.changes.ChangesViewI
@@ -778,7 +777,6 @@ c:com.intellij.openapi.vcs.changes.ChangesViewManager
- s:getInstance(com.intellij.openapi.project.Project):com.intellij.openapi.vcs.changes.ChangesViewI
- s:getInstanceEx(com.intellij.openapi.project.Project):com.intellij.openapi.vcs.changes.ChangesViewEx
- s:getLocalChangesToolWindowName(com.intellij.openapi.project.Project):java.lang.String
- isAllowExcludeFromCommit():Z
- isDiffPreviewAvailable():Z
- resetViewImmediatelyAndRefreshLater():V
- scheduleRefresh():V
@@ -798,6 +796,7 @@ c:com.intellij.openapi.vcs.changes.ChangesViewManager$DisplayNameSupplier
Fa:com.intellij.openapi.vcs.changes.ChangesViewWorkflowManager
- sf:Companion:com.intellij.openapi.vcs.changes.ChangesViewWorkflowManager$Companion
- sf:TOPIC:com.intellij.util.messages.Topic
- a:getAllowExcludeFromCommit():kotlinx.coroutines.flow.StateFlow
- f:getCommitWorkflowHandler():com.intellij.vcs.commit.ChangesViewCommitWorkflowHandler
- sf:getInstance(com.intellij.openapi.project.Project):com.intellij.openapi.vcs.changes.ChangesViewWorkflowManager
com.intellij.openapi.vcs.changes.ChangesViewWorkflowManager$ChangesViewWorkflowListener
@@ -1,38 +0,0 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.vcs.changes
import com.intellij.openapi.components.Service
import com.intellij.openapi.project.Project
import com.intellij.vcs.commit.ChangesViewCommitWorkflowHandler
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@Service(Service.Level.PROJECT)
internal class AllowExcludeFromCommitStateHolder(project: Project) {
private val _allowExcludeFromCommit = MutableStateFlow(false)
val allowExcludeFromCommit: StateFlow<Boolean> = _allowExcludeFromCommit.asStateFlow()
init {
val workflowManager = ChangesViewWorkflowManager.getInstance(project)
project.messageBus.connect().subscribe(ChangesViewWorkflowManager.TOPIC, ChangesViewWorkflowManager.ChangesViewWorkflowListener {
registerListener(workflowManager.commitWorkflowHandler)
})
val currentWorkflowHandler = workflowManager.commitWorkflowHandler
registerListener(currentWorkflowHandler)
}
private fun registerListener(workflowHandler: ChangesViewCommitWorkflowHandler?) {
workflowHandler?.addActivityListener(object : ChangesViewCommitWorkflowHandler.ActivityListener {
override fun activityStateChanged() {
allowExcludeFromCommit(workflowHandler)
}
})
allowExcludeFromCommit(workflowHandler)
}
private fun allowExcludeFromCommit(workflowHandler: ChangesViewCommitWorkflowHandler?) {
_allowExcludeFromCommit.value = workflowHandler?.isActive == true
}
}
@@ -89,7 +89,7 @@ class ChangesViewDiffPreviewProcessor(
fun subscribeOnAllowExcludeFromCommit() {
VcsDisposable.getInstance(project).coroutineScope.launch {
project.serviceAsync<AllowExcludeFromCommitStateHolder>().allowExcludeFromCommit.collect {
project.serviceAsync<ChangesViewWorkflowManager>().allowExcludeFromCommit.collect {
withContext(Dispatchers.EDT) {
setAllowExcludeFromCommit(it)
}
@@ -16,8 +16,6 @@ interface ChangesViewEx : ChangesViewI {
@CalledInAny
fun scheduleRefresh(@RequiresBackgroundThread callback: Runnable)
val isAllowExcludeFromCommit: Boolean
@get:Deprecated("Use {@link ChangesViewWorkflowManager#getCommitWorkflowHandler}.")
val commitWorkflowHandler: ChangesViewCommitWorkflowHandler?
}
@@ -214,11 +214,6 @@ public class ChangesViewManager implements ChangesViewEx, Disposable {
myToolWindowPanel.updateCommitWorkflow();
}
@Override
public boolean isAllowExcludeFromCommit() {
return myProject.getService(AllowExcludeFromCommitStateHolder.class).getAllowExcludeFromCommit().getValue();
}
public void closeEditorPreview(boolean onlyIfEmpty) {
if (myToolWindowPanel == null) return;
myToolWindowPanel.closeEditorPreview(onlyIfEmpty);
@@ -5,6 +5,7 @@ import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.util.messages.Topic
import com.intellij.vcs.commit.ChangesViewCommitWorkflowHandler
import kotlinx.coroutines.flow.StateFlow
import org.jetbrains.annotations.ApiStatus
import java.util.*
@@ -13,6 +14,8 @@ abstract class ChangesViewWorkflowManager @ApiStatus.Internal protected construc
val commitWorkflowHandler: ChangesViewCommitWorkflowHandler?
get() = doGetCommitWorkflowHandler()
abstract val allowExcludeFromCommit: StateFlow<Boolean>
@ApiStatus.Internal
protected abstract fun doGetCommitWorkflowHandler(): ChangesViewCommitWorkflowHandler?
@@ -10,10 +10,15 @@ import com.intellij.openapi.util.Disposer
import com.intellij.util.concurrency.annotations.RequiresEdt
import com.intellij.vcs.commit.*
import com.intellij.vcs.commit.CommitModeManager.Companion.subscribeOnCommitModeChange
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
internal class ChangesViewWorkflowManagerImpl(
private val project: Project,
) : ChangesViewWorkflowManager(), Disposable {
private val _allowExcludeFromCommit = MutableStateFlow(false)
override val allowExcludeFromCommit: StateFlow<Boolean> = _allowExcludeFromCommit.asStateFlow()
private var _commitWorkflowHandler: ChangesViewCommitWorkflowHandler? = null
@@ -43,9 +48,7 @@ internal class ChangesViewWorkflowManagerImpl(
val changesView = (ChangesViewManager.getInstance(project) as ChangesViewManager).initChangesView()
val workflow = ChangesViewCommitWorkflow(project)
val commitPanel = ChangesViewCommitPanel(project, changesView)
_commitWorkflowHandler = ChangesViewCommitWorkflowHandler(workflow, commitPanel)
project.messageBus.syncPublisher(TOPIC).commitWorkflowChanged()
setCommitWorkflowHandler(ChangesViewCommitWorkflowHandler(workflow, commitPanel))
activity.end()
}
@@ -56,13 +59,26 @@ internal class ChangesViewWorkflowManagerImpl(
else {
if (currentHandler != null) {
Disposer.dispose(currentHandler)
_commitWorkflowHandler = null
project.messageBus.syncPublisher(TOPIC).commitWorkflowChanged()
setCommitWorkflowHandler(null)
}
}
}
private fun setCommitWorkflowHandler(handler: ChangesViewCommitWorkflowHandler?) {
_commitWorkflowHandler = handler
if (handler != null) {
handler.addActivityListener(object : ChangesViewCommitWorkflowHandler.ActivityListener {
override fun activityStateChanged() {
_allowExcludeFromCommit.value = handler.isActive
}
})
_allowExcludeFromCommit.value = handler.isActive
} else {
_allowExcludeFromCommit.value = false
}
project.messageBus.syncPublisher(TOPIC).commitWorkflowChanged()
}
override fun dispose() {
val handler = _commitWorkflowHandler
if (handler != null) {
@@ -56,11 +56,6 @@ class DummyChangesView implements ChangesViewEx {
public void scheduleRefresh(@NotNull Runnable callback) {
}
@Override
public boolean isAllowExcludeFromCommit() {
return false;
}
@Override
public @Nullable ChangesViewCommitWorkflowHandler getCommitWorkflowHandler() {
return null;
@@ -197,7 +197,7 @@ public class ShowDiffFromLocalChangesActionProvider implements AnActionExtension
}
private static void setAllowExcludeFromCommit(@NotNull Project project, @NotNull DiffRequestChain chain) {
boolean allowExcludeFromCommit = ChangesViewManager.getInstanceEx(project).isAllowExcludeFromCommit();
boolean allowExcludeFromCommit = ChangesViewWorkflowManager.getInstance(project).getAllowExcludeFromCommit().getValue();
chain.putUserData(ALLOW_EXCLUDE_FROM_COMMIT, allowExcludeFromCommit);
}
}
@@ -6,8 +6,8 @@ import com.intellij.openapi.components.serviceAsync
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.diagnostic.trace
import com.intellij.openapi.vcs.AbstractVcsHelper
import com.intellij.openapi.vcs.changes.AllowExcludeFromCommitStateHolder
import com.intellij.openapi.vcs.changes.ChangesUtil
import com.intellij.openapi.vcs.changes.ChangesViewWorkflowManager
import com.intellij.openapi.vcs.changes.InclusionListener
import com.intellij.openapi.vcs.changes.InclusionModel
import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager
@@ -56,7 +56,7 @@ internal class ChangesViewApiImpl : ChangesViewApi {
}
override suspend fun canExcludeFromCommit(projectId: ProjectId): Flow<Boolean> = getProjectScoped(projectId) { project ->
project.serviceAsync<AllowExcludeFromCommitStateHolder>().allowExcludeFromCommit
project.serviceAsync<ChangesViewWorkflowManager>().allowExcludeFromCommit
} ?: flowOf(false)
override suspend fun showResolveConflictsDialog(projectId: ProjectId, changeIds: List<ChangeId>) = projectScoped(projectId) { project ->