vcs: extract common branch sync policy update logic

GitOrigin-RevId: 16b3e9da6a8d71951e58123f2b1695096e34a635
This commit is contained in:
Dmitry Zhuravlev
2023-02-02 21:19:13 +00:00
committed by intellij-monorepo-bot
parent e422065eb9
commit a5d1f7e704
3 changed files with 60 additions and 35 deletions
@@ -1,25 +1,20 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.dvcs.branch;
import com.intellij.dvcs.DvcsNotificationIdsHolder;
import com.intellij.dvcs.DvcsUtil;
import com.intellij.dvcs.repo.AbstractRepositoryManager;
import com.intellij.dvcs.repo.Repository;
import com.intellij.dvcs.ui.BranchActionGroupPopup;
import com.intellij.dvcs.ui.DvcsBundle;
import com.intellij.dvcs.ui.LightActionGroup;
import com.intellij.notification.NotificationAction;
import com.intellij.notification.NotificationType;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.ListPopup;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.VcsNotifier;
import com.intellij.ui.ExperimentalUI;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.Nls;
@@ -28,8 +23,6 @@ import org.jetbrains.annotations.Nullable;
import java.util.List;
import static com.intellij.openapi.vcs.VcsNotifier.STANDARD_NOTIFICATION;
public abstract class DvcsBranchPopup<Repo extends Repository> {
@NotNull protected final Project myProject;
@NotNull protected final AbstractRepositoryManager<Repo> myRepositoryManager;
@@ -57,7 +50,7 @@ public abstract class DvcsBranchPopup<Repo extends Repository> {
myInSpecificRepository = myRepositoryManager.moreThanOneRoot() && myVcsSettings.getSyncSetting() == DvcsSyncSettings.Value.DONT_SYNC;
String title = buildTitle(currentRepository);
myPopup = new BranchActionGroupPopup(title, myProject, preselectActionCondition, createActions(), dimensionKey, dataContext);
initBranchSyncPolicyIfNotInitialized();
new DvcsBranchSyncPolicyUpdateNotifier<>(myProject, myVcs, myVcsSettings, myRepositoryManager).initBranchSyncPolicyIfNotInitialized();
warnThatBranchesDivergedIfNeeded();
if (myRepositoryManager.moreThanOneRoot()) {
myPopup.addToolbarAction(new DefaultTrackReposSynchronouslyAction(myVcsSettings), true);
@@ -79,32 +72,6 @@ public abstract class DvcsBranchPopup<Repo extends Repository> {
return myPopup;
}
private void initBranchSyncPolicyIfNotInitialized() {
if (myRepositoryManager.moreThanOneRoot() && myVcsSettings.getSyncSetting() == DvcsSyncSettings.Value.NOT_DECIDED) {
if (myRepositoryManager.shouldProposeSyncControl()) {
notifyAboutSyncedBranches();
myVcsSettings.setSyncSetting(DvcsSyncSettings.Value.SYNC);
}
else {
myVcsSettings.setSyncSetting(DvcsSyncSettings.Value.DONT_SYNC);
}
}
}
private void notifyAboutSyncedBranches() {
VcsNotifier.getInstance(myProject).notify(
STANDARD_NOTIFICATION
.createNotification(DvcsBundle.message("notification.message.branch.operations.are.executed.on.all.roots"), NotificationType.INFORMATION)
.setDisplayId(DvcsNotificationIdsHolder.BRANCH_OPERATIONS_ON_ALL_ROOTS)
.addAction(
NotificationAction.create(DvcsBundle.message("action.NotificationAction.DvcsBranchPopup.text.disable"), (event, notification) -> {
ShowSettingsUtil.getInstance().showSettingsDialog(myProject, myVcs.getDisplayName());
if (myVcsSettings.getSyncSetting() == DvcsSyncSettings.Value.DONT_SYNC) {
notification.expire();
}
})));
}
@NotNull
private ActionGroup createActions() {
LightActionGroup popupGroup = new LightActionGroup(false);
@@ -0,0 +1,52 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.dvcs.branch
import com.intellij.dvcs.DvcsNotificationIdsHolder
import com.intellij.dvcs.repo.AbstractRepositoryManager
import com.intellij.dvcs.repo.Repository
import com.intellij.dvcs.ui.DvcsBundle
import com.intellij.notification.Notification
import com.intellij.notification.NotificationAction
import com.intellij.notification.NotificationType
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.options.ShowSettingsUtil
import com.intellij.openapi.project.Project
import com.intellij.openapi.vcs.AbstractVcs
import com.intellij.openapi.vcs.VcsNotifier
class DvcsBranchSyncPolicyUpdateNotifier<Repo : Repository>(
private val project: Project,
private val vcs: AbstractVcs,
private val dvcsSyncSettings: DvcsSyncSettings,
private val repositoryManager: AbstractRepositoryManager<Repo>
) {
fun initBranchSyncPolicyIfNotInitialized() {
if (repositoryManager.moreThanOneRoot() && dvcsSyncSettings.syncSetting == DvcsSyncSettings.Value.NOT_DECIDED) {
if (repositoryManager.shouldProposeSyncControl()) {
notifyAboutSyncedBranches()
dvcsSyncSettings.syncSetting = DvcsSyncSettings.Value.SYNC
}
else {
dvcsSyncSettings.syncSetting = DvcsSyncSettings.Value.DONT_SYNC
}
}
}
private fun notifyAboutSyncedBranches() {
VcsNotifier.getInstance(project).notify(
VcsNotifier.STANDARD_NOTIFICATION
.createNotification(DvcsBundle.message("notification.message.branch.operations.are.executed.on.all.roots"),
NotificationType.INFORMATION)
.setDisplayId(DvcsNotificationIdsHolder.BRANCH_OPERATIONS_ON_ALL_ROOTS)
.addAction(
NotificationAction.create(DvcsBundle.message("action.NotificationAction.DvcsBranchPopup.text.disable")
) { _: AnActionEvent?, notification: Notification ->
ShowSettingsUtil.getInstance().showSettingsDialog(project,
vcs.displayName)
if (dvcsSyncSettings.syncSetting == DvcsSyncSettings.Value.DONT_SYNC) {
notification.expire()
}
}))
}
}
@@ -3,6 +3,7 @@ package git4idea.ui.branch.popup
import com.intellij.dvcs.DvcsUtil
import com.intellij.dvcs.branch.DvcsBranchManager
import com.intellij.dvcs.branch.DvcsBranchSyncPolicyUpdateNotifier
import com.intellij.dvcs.branch.DvcsBranchesDivergedBanner
import com.intellij.dvcs.branch.GroupingKey
import com.intellij.dvcs.ui.DvcsBundle
@@ -40,8 +41,10 @@ import com.intellij.util.ui.UIUtil
import com.intellij.util.ui.components.BorderLayoutPanel
import com.intellij.util.ui.tree.TreeUtil
import git4idea.GitBranch
import git4idea.GitVcs
import git4idea.actions.branch.GitBranchActionsUtil
import git4idea.branch.GitBranchType
import git4idea.config.GitVcsSettings
import git4idea.i18n.GitBundle
import git4idea.repo.GitRepository
import git4idea.repo.GitRepositoryChangeListener
@@ -112,6 +115,9 @@ class GitBranchesTreePopup(project: Project, step: GitBranchesTreePopupStep, par
installRepoListener()
installResizeListener()
warnThatBranchesDivergedIfNeeded()
DvcsBranchSyncPolicyUpdateNotifier(project, GitVcs.getInstance(project),
GitVcsSettings.getInstance(project), GitRepositoryManager.getInstance(project))
.initBranchSyncPolicyIfNotInitialized()
}
installBranchSettingsListener()
DataManager.registerDataProvider(component, DataProvider { dataId ->