[vcs] IJPL-176372 Enable non-modal commit by default

Neither reads nor writes to `VcsApplicationSettings.COMMIT_FROM_LOCAL_CHANGES` are performed anymore - toolwindow mode is enforced.
However, modal flow is not removed completely and still present for actions like "Fixup" and is activated if non-distributed VCS is present.

GitOrigin-RevId: 5a4bc6c33202b1678db831a75e97a233dd03eb28
This commit is contained in:
Ilia.Shulgin
2025-01-31 13:09:19 +00:00
committed by intellij-monorepo-bot
parent 81a6ae4479
commit 806d8e4a90
15 changed files with 11 additions and 129 deletions
@@ -794,9 +794,8 @@ inspection.SubjectBodySeparationInspection.display.name=Blank line between subje
inspection.BodyLimitInspection.display.name=Limit body line
inspection.CommitMessageSpellCheckingInspection.display.name=Spelling
inspection.SubjectLimitInspection.display.name=Limit subject line
settings.commit.without.dialog=Use non-modal commit interface
settings.commit.postpone.slow.checks=Run advanced checks after a commit is done
settings.commit.postpone.slow.checks.description=Failed checks will not prevent a commit in the non-modal interface
settings.commit.postpone.slow.checks.description=Failed checks will not prevent a commit
settings.commit.postpone.slow.checks.description.short=Failed checks will not prevent a commit
settings.confirmation.option.text.ask=Ask
settings.confirmation.option.text.no=No
@@ -940,7 +939,6 @@ commit.description.tooltip.path=Path: {0}
settings.version.control.option.group=Version Control
settings.commit.message.option.group=Commit message
settings.commit.option.group=Commit
settings.changelists.option.group=Changelists
settings.confirmation.option.group=Confirmation
dialog.title.files.created=Files Created
-3
View File
@@ -4876,15 +4876,12 @@ f:com.intellij.vcs.commit.CommitModeManager
- dispose():V
- f:getCurrentCommitMode():com.intellij.vcs.commit.CommitMode
- sf:getInstance(com.intellij.openapi.project.Project):com.intellij.vcs.commit.CommitModeManager
- sf:setCommitFromLocalChanges(com.intellij.openapi.project.Project,Z):V
- sf:subscribeOnCommitModeChange(com.intellij.util.messages.SimpleMessageBusConnection,com.intellij.vcs.commit.CommitModeManager$CommitModeListener):V
com.intellij.vcs.commit.CommitModeManager$CommitModeListener
- java.util.EventListener
- a:commitModeChanged():V
f:com.intellij.vcs.commit.CommitModeManager$Companion
- f:getInstance(com.intellij.openapi.project.Project):com.intellij.vcs.commit.CommitModeManager
- f:isNonModalInSettings():Z
- f:setCommitFromLocalChanges(com.intellij.openapi.project.Project,Z):V
- f:subscribeOnCommitModeChange(com.intellij.util.messages.SimpleMessageBusConnection,com.intellij.vcs.commit.CommitModeManager$CommitModeListener):V
com.intellij.vcs.commit.CommitModeManager$SettingsListener
- java.util.EventListener
@@ -79,10 +79,6 @@ object VcsStatisticsCollector : CounterUsagesCollector() {
}
}
fun logNonModalCommitStateChanged(project: Project?) {
NON_MODAL_COMMIT_STATE_CHANGED.log(project, VcsApplicationSettings.getInstance().COMMIT_FROM_LOCAL_CHANGES)
}
private fun <T> computeDelta(before: Collection<T>, after: Collection<T>): Int {
val beforeSet = before.toHashSet()
val afterSet = after.toHashSet()
@@ -7,16 +7,17 @@ import com.intellij.openapi.options.UnnamedConfigurable
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.DialogPanel
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.vcs.*
import com.intellij.openapi.vcs.CheckinProjectPanel
import com.intellij.openapi.vcs.ProjectLevelVcsManager
import com.intellij.openapi.vcs.VcsBundle
import com.intellij.openapi.vcs.VcsConfiguration
import com.intellij.openapi.vcs.changes.Change
import com.intellij.openapi.vcs.changes.CommitContext
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.ui.components.JBCheckBox
import com.intellij.ui.dsl.builder.AlignX
import com.intellij.ui.dsl.builder.TopGap
import com.intellij.ui.dsl.builder.bindSelected
import com.intellij.ui.dsl.builder.panel
import com.intellij.ui.layout.selected
import com.intellij.util.containers.mapNotNullLoggingErrors
import com.intellij.util.ui.UIUtil
import com.intellij.vcs.commit.*
@@ -49,18 +50,9 @@ class CommitDialogConfigurable(private val project: Project)
override fun createPanel(): DialogPanel {
val disposable = disposable!!
val appSettings = VcsApplicationSettings.getInstance()
val settings = VcsConfiguration.getInstance(project)
lateinit var nonModalCommitCheckBox: JBCheckBox
return panel {
row {
nonModalCommitCheckBox = checkBox(VcsBundle.message("settings.commit.without.dialog"))
.comment(VcsBundle.message("settings.commit.without.dialog.applies.to.git.mercurial"))
.bindSelected({ appSettings.COMMIT_FROM_LOCAL_CHANGES }, { CommitModeManager.setCommitFromLocalChanges(project, it) })
.component
}
row {
checkBox(VcsBundle.message("checkbox.clear.initial.commit.message"))
.bindSelected(settings::CLEAR_INITIAL_COMMIT_MESSAGE)
@@ -96,7 +88,6 @@ class CommitDialogConfigurable(private val project: Project)
row {
checkBox(VcsBundle.message("settings.commit.postpone.slow.checks"))
.comment(VcsBundle.message("settings.commit.postpone.slow.checks.description"))
.enabledIf(nonModalCommitCheckBox.selected)
.bindSelected({ settings.NON_MODAL_COMMIT_POSTPONE_SLOW_CHECKS }, { setRunSlowCommitChecksAfterCommit(project, it) })
}
}
@@ -6,20 +6,17 @@ import com.intellij.ide.ui.search.OptionDescription
import com.intellij.openapi.application.ApplicationBundle
import com.intellij.openapi.project.Project
import com.intellij.openapi.vcs.ProjectLevelVcsManager
import com.intellij.openapi.vcs.VcsApplicationSettings
import com.intellij.openapi.vcs.VcsBundle
import com.intellij.openapi.vcs.VcsConfiguration
import com.intellij.openapi.vcs.changes.conflicts.ChangelistConflictTracker
import com.intellij.openapi.vcs.contentAnnotation.VcsContentAnnotationSettings
import com.intellij.openapi.vcs.readOnlyHandler.ReadonlyStatusHandlerImpl
import com.intellij.openapi.vfs.ReadonlyStatusHandler
import com.intellij.vcs.commit.CommitModeManager.Companion.setCommitFromLocalChanges
import com.intellij.vcs.commit.message.CommitMessageInspectionProfile
import com.intellij.vcsUtil.VcsUtil
private val vcsOptionGroupName get() = VcsBundle.message("settings.version.control.option.group")
private val commitMessageOptionGroupName get() = VcsBundle.message("settings.commit.message.option.group")
private val commitOptionGroupName get() = VcsBundle.message("settings.commit.option.group")
private val confirmationOptionGroupName get() = VcsBundle.message("settings.confirmation.option.group")
private val changelistsOptionGroupName get() = VcsBundle.message("settings.changelists.option.group")
@@ -65,7 +62,6 @@ private fun cdIncludeShelfBaseContent(project: Project): CheckboxDescriptor =
private fun cdChangelistConflictDialog(project: Project): CheckboxDescriptor = CheckboxDescriptor(VcsBundle.message("settings.show.conflict.resolve.dialog.checkbox"), changelistsOptions(project)::SHOW_DIALOG, groupName = changelistsOptionGroupName)
private fun cdChangelistShowConflicts(project: Project): CheckboxDescriptor = CheckboxDescriptor(VcsBundle.message("settings.highlight.files.with.conflicts.checkbox"), changelistsOptions(project)::HIGHLIGHT_CONFLICTS, groupName = changelistsOptionGroupName)
private fun cdChangelistShowNonCurrent(project: Project): CheckboxDescriptor = CheckboxDescriptor(VcsBundle.message("settings.highlight.files.from.non.active.changelist.checkbox"), changelistsOptions(project)::HIGHLIGHT_NON_ACTIVE_CHANGELIST, groupName = changelistsOptionGroupName)
private fun cdNonModalCommit(project: Project): CheckboxDescriptor = CheckboxDescriptor(VcsBundle.message("settings.commit.without.dialog"), { VcsApplicationSettings.getInstance().COMMIT_FROM_LOCAL_CHANGES }, { setCommitFromLocalChanges(project, it) }, groupName = commitOptionGroupName)
// @formatter:on
internal class VcsOptionsTopHitProvider : VcsOptionsTopHitProviderBase() {
@@ -89,7 +85,6 @@ internal class VcsOptionsTopHitProvider : VcsOptionsTopHitProviderBase() {
cdChangelistConflictDialog(project),
cdChangelistShowConflicts(project),
cdChangelistShowNonCurrent(project),
cdNonModalCommit(project)
).map(CheckboxDescriptor::asOptionDescriptor)
}
}
@@ -92,7 +92,7 @@ class CommitModeManager(private val project: Project, private val coroutineScope
return CommitMode.ExternalCommitMode(singleVcs)
}
if (isNonModalInSettings() && canSetNonModal()) {
if (canSetNonModal()) {
return CommitMode.NonModalCommitMode(isToggleCommitUi)
}
@@ -144,18 +144,6 @@ class CommitModeManager(private val project: Project, private val coroutineScope
@JvmStatic
fun getInstance(project: Project): CommitModeManager = project.service()
@JvmStatic
fun setCommitFromLocalChanges(project: Project?, value: Boolean) {
val oldValue = appSettings.COMMIT_FROM_LOCAL_CHANGES
if (oldValue == value) return
appSettings.COMMIT_FROM_LOCAL_CHANGES = value
VcsStatisticsCollector.logNonModalCommitStateChanged(project)
getApplication().messageBus.syncPublisher(SETTINGS).settingsChanged()
}
fun isNonModalInSettings(): Boolean = isForceNonModalCommit.asBoolean() || appSettings.COMMIT_FROM_LOCAL_CHANGES
}
interface SettingsListener : EventListener {
@@ -179,7 +167,7 @@ sealed class CommitMode {
object PendingCommitMode : CommitMode() {
override fun useCommitToolWindow(): Boolean {
// Enable 'Commit' toolwindow before vcses are activated
return CommitModeManager.isNonModalInSettings()
return true
}
override fun disableDefaultCommitAction(): Boolean {
@@ -1,30 +0,0 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.vcs.commit
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.IdeActions.ACTION_CHECKIN_PROJECT
import com.intellij.openapi.actionSystem.ex.ActionUtil.invokeAction
import com.intellij.openapi.project.DumbAwareAction
import com.intellij.vcs.commit.CommitModeManager.Companion.setCommitFromLocalChanges
private class SwitchToCommitDialogAction : DumbAwareAction() {
override fun getActionUpdateThread(): ActionUpdateThread {
return ActionUpdateThread.BGT
}
override fun update(e: AnActionEvent) {
val project = e.project
e.presentation.isEnabledAndVisible = project != null &&
CommitModeManager.isNonModalInSettings() &&
CommitModeManager.getInstance(project).getCurrentCommitMode() != CommitMode.ModalCommitMode
}
override fun actionPerformed(e: AnActionEvent) {
setCommitFromLocalChanges(e.project, false)
val commitAction = ActionManager.getInstance().getAction(ACTION_CHECKIN_PROJECT) ?: return
invokeAction(commitAction, e.dataContext, e.place, e.inputEvent, null)
}
}
@@ -220,32 +220,6 @@ object GitLessonsUtil {
}
}
fun LessonContext.showWarningIfModalCommitEnabled() {
task {
val step = stateCheck {
VcsApplicationSettings.getInstance().COMMIT_FROM_LOCAL_CHANGES
}
val callbackId = LearningUiManager.addCallback {
CommitModeManager.setCommitFromLocalChanges(project, true)
step.complete(true)
}
showWarning(GitLessonsBundle.message("git.use.non.modal.commit.ui.warning",
action("ShowSettings"),
strong(VcsBundle.message("version.control.main.configurable.name")),
strong(VcsBundle.message("commit.dialog.configurable")),
strong(VcsBundle.message("settings.commit.without.dialog")))
+ " " + GitLessonsBundle.message("git.click.to.change.settings", callbackId)) {
!VcsApplicationSettings.getInstance().COMMIT_FROM_LOCAL_CHANGES
}
test {
if (!VcsApplicationSettings.getInstance().COMMIT_FROM_LOCAL_CHANGES) {
Thread.sleep(1000) // need to wait until LessonMessagePane become updated after restart and warning will be showed
clickLessonMessagePaneLink(" click ")
}
}
}
}
fun LessonContext.showWarningIfStagingAreaEnabled() {
task {
val step = stateCheck {
@@ -267,12 +241,10 @@ object GitLessonsUtil {
}
fun LessonContext.restoreCommitWindowStateInformer() {
val enabledModalInterface = !VcsApplicationSettings.getInstance().COMMIT_FROM_LOCAL_CHANGES
val enabledStagingArea = GitVcsApplicationSettings.getInstance().isStagingAreaEnabled
if (!enabledModalInterface && !enabledStagingArea) return
if (!enabledStagingArea) return
restoreChangedSettingsInformer {
if (enabledModalInterface) CommitModeManager.setCommitFromLocalChanges(null, false)
if (enabledStagingArea) enableStagingArea(true)
enableStagingArea(true)
}
}
@@ -39,7 +39,6 @@ import training.git.GitLessonsUtil.openCommitWindow
import training.git.GitLessonsUtil.restoreByUiAndBackgroundTask
import training.git.GitLessonsUtil.restoreCommitWindowStateInformer
import training.git.GitLessonsUtil.showWarningIfCommitWindowClosed
import training.git.GitLessonsUtil.showWarningIfModalCommitEnabled
import training.git.GitLessonsUtil.showWarningIfStagingAreaEnabled
import training.ui.LearningUiUtil.findComponentWithTimeout
import training.util.LessonEndInfo
@@ -73,7 +72,6 @@ class GitChangelistsAndShelveLesson : GitLesson("Git.ChangelistsAndShelf", GitLe
PsiDocumentManager.getInstance(project).commitAllDocuments()
}
showWarningIfModalCommitEnabled()
showWarningIfStagingAreaEnabled()
lateinit var highlightLineMarkerTaskId: TaskContext.TaskId
@@ -10,7 +10,6 @@ import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.ui.popup.Balloon
import com.intellij.openapi.vcs.VcsBundle
import com.intellij.openapi.vcs.VcsConfiguration
import com.intellij.openapi.vcs.VcsNotificationIdsHolder
import com.intellij.openapi.vcs.changes.ChangesViewWorkflowManager
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile
@@ -43,7 +42,6 @@ import training.git.GitLessonsUtil.resetGitLogWindow
import training.git.GitLessonsUtil.restoreCommitWindowStateInformer
import training.git.GitLessonsUtil.showWarningIfCommitWindowClosed
import training.git.GitLessonsUtil.showWarningIfGitWindowClosed
import training.git.GitLessonsUtil.showWarningIfModalCommitEnabled
import training.git.GitLessonsUtil.showWarningIfStagingAreaEnabled
import training.git.GitLessonsUtil.triggerOnChangeCheckboxShown
import training.git.GitLessonsUtil.triggerOnNotification
@@ -81,7 +79,6 @@ class GitCommitLesson : GitLesson("Git.Commit", GitLessonsBundle.message("git.co
modifyFiles()
}
showWarningIfModalCommitEnabled()
showWarningIfStagingAreaEnabled()
highlightToolWindowStripe(ToolWindowId.COMMIT)
@@ -38,7 +38,6 @@ import training.git.GitLessonsUtil.openCommitWindow
import training.git.GitLessonsUtil.restoreByUiAndBackgroundTask
import training.git.GitLessonsUtil.restoreCommitWindowStateInformer
import training.git.GitLessonsUtil.showWarningIfCommitWindowClosed
import training.git.GitLessonsUtil.showWarningIfModalCommitEnabled
import training.git.GitLessonsUtil.showWarningIfStagingAreaEnabled
import training.git.GitLessonsUtil.triggerOnChangeCheckboxShown
import training.git.GitLessonsUtil.triggerOnCheckout
@@ -68,7 +67,6 @@ class GitQuickStartLesson : GitLesson("Git.QuickStart", GitLessonsBundle.message
override val lessonContent: LessonContext.() -> Unit = {
val cloneActionText = GitBundle.message("action.Git.Clone.text")
showWarningIfModalCommitEnabled()
showWarningIfStagingAreaEnabled()
task {
+1 -2
View File
@@ -354,8 +354,7 @@ public final class GitVcs extends AbstractVcs {
@Override
public boolean isWithCustomLocalChanges() {
return GitVcsApplicationSettings.getInstance().isStagingAreaEnabled() &&
GitStageManagerKt.canEnableStagingArea();
return GitVcsApplicationSettings.getInstance().isStagingAreaEnabled();
}
@Override
@@ -50,7 +50,6 @@ import git4idea.branch.GitBranchIncomingOutgoingManager
import git4idea.config.GitExecutableSelectorPanel.Companion.createGitExecutableSelectorRow
import git4idea.config.gpg.GpgSignConfigurableRow.Companion.createGpgSignRow
import git4idea.i18n.GitBundle.message
import git4idea.index.canEnableStagingArea
import git4idea.index.enableStagingArea
import git4idea.repo.GitRepositoryManager
import git4idea.stash.ui.isStashTabAvailable
@@ -197,7 +196,6 @@ internal class GitVcsPanel(private val project: Project) :
group(message("settings.commit.group.title")) {
row {
checkBox(cdEnableStagingArea)
.enabledIf(StagingAreaAvailablePredicate(project, disposable!!))
}
row {
checkBox(cdWarnAboutCrlf(project))
@@ -381,18 +379,6 @@ internal class ExpandableTextFieldWithReadOnlyText(lineParser: ParserFunction,
fun JoinerFunction.join(vararg items: String): String = `fun`(items.toList())
}
class StagingAreaAvailablePredicate(val project: Project, val disposable: Disposable) : ComponentPredicate() {
override fun addListener(listener: (Boolean) -> Unit) {
project.messageBus.connect(disposable).subscribe(CommitModeManager.SETTINGS, object : CommitModeManager.SettingsListener {
override fun settingsChanged() {
listener(invoke())
}
})
}
override fun invoke(): Boolean = canEnableStagingArea()
}
class HasGitRootsPredicate(val project: Project, val disposable: Disposable) : ComponentPredicate() {
override fun addListener(listener: (Boolean) -> Unit) {
project.messageBus.connect(disposable).subscribe(VcsRepositoryManager.VCS_REPOSITORY_MAPPING_UPDATED,
@@ -46,8 +46,6 @@ fun enableStagingArea(enabled: Boolean) {
ApplicationManager.getApplication().messageBus.syncPublisher(CommitModeManager.SETTINGS).settingsChanged()
}
internal fun canEnableStagingArea() = CommitModeManager.isNonModalInSettings()
internal fun isStagingAreaAvailable(project: Project): Boolean {
val commitMode = CommitModeManager.getInstance(project).getCurrentCommitMode()
return commitMode is CommitMode.ExternalCommitMode &&
@@ -7,13 +7,12 @@ import com.intellij.openapi.project.DumbAwareToggleAction
import com.intellij.openapi.vcs.ProjectLevelVcsManager
import git4idea.GitVcs
import git4idea.config.GitVcsApplicationSettings
import git4idea.index.canEnableStagingArea
import git4idea.index.enableStagingArea
abstract class GitToggleStagingAreaAction(private val enable: Boolean) : DumbAwareToggleAction() {
override fun update(e: AnActionEvent) {
val project = e.project
if (project == null || !canEnableStagingArea() ||
if (project == null ||
ProjectLevelVcsManager.getInstance(project).singleVCS?.keyInstanceMethod != GitVcs.getKey()) {
e.presentation.isEnabledAndVisible = false
}