[vcs] IJPL-213061 Log: Fix branch submenu presence

IJ-MR-179021

GitOrigin-RevId: 84dfa2b4357cbd366c8b602bd4215a51582021b5
This commit is contained in:
Aleksandr Krasilnikov
2025-10-20 19:40:11 +00:00
committed by intellij-monorepo-bot
parent b1d7e6c717
commit 7cb0be8f15
3 changed files with 40 additions and 10 deletions
@@ -5,6 +5,7 @@ import com.intellij.openapi.actionSystem.ActionGroup
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.DataKey
import com.intellij.openapi.actionSystem.DefaultActionGroup
import com.intellij.vcs.git.actions.GitSingleRefActions.GIT_SINGLE_REF_ACTION_GROUP
import git4idea.GitReference
import org.intellij.lang.annotations.Language
import org.jetbrains.annotations.ApiStatus
@@ -18,6 +19,11 @@ object GitSingleRefActions {
@JvmField
val SELECTED_REF_DATA_KEY: DataKey<GitReference> = DataKey.create("Git.Selected.Ref")
/**
* @return [ActionGroup] of [ActionGroup]s of actions for the single reference. The client code should handle it properly
*
* @see [GIT_SINGLE_REF_ACTION_GROUP] structure in intellij.vcs.git.shared.xml
*/
@JvmStatic
fun getSingleRefActionGroup(): ActionGroup =
ActionManager.getInstance().getAction(GIT_SINGLE_REF_ACTION_GROUP) as? ActionGroup ?: DefaultActionGroup()
@@ -1,10 +1,7 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package git4idea.ui.branch
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionWrapper
import com.intellij.openapi.actionSystem.DataSink
import com.intellij.openapi.actionSystem.DataSnapshotProvider
import com.intellij.openapi.actionSystem.*
import com.intellij.vcs.git.actions.GitSingleRefActions
import git4idea.GitBranch
import git4idea.actions.branch.GitBranchActionsDataKeys
@@ -25,7 +22,37 @@ internal class GitBranchActionWrapper(
companion object {
@JvmStatic
fun tryWrap(action: AnAction, branch: GitBranch, selectedRepository: GitRepository, repositories: List<GitRepository>) =
if (action is GitSingleRefAction<*>) GitBranchActionWrapper(action, branch, selectedRepository, repositories) else action
fun wrapActions(
actions: Array<AnAction>,
e: AnActionEvent?,
branch: GitBranch,
selectedRepository: GitRepository,
repositories: List<GitRepository>,
): Array<AnAction> {
val wrappedActions = mutableListOf<AnAction>()
for (action in actions) {
doWrapActions(wrappedActions, e, action, branch, selectedRepository, repositories)
}
return wrappedActions.toTypedArray()
}
private fun doWrapActions(
result: MutableList<AnAction>,
e: AnActionEvent?,
action: AnAction,
branch: GitBranch,
selectedRepository: GitRepository,
repositories: List<GitRepository>,
) {
when (action) {
is GitSingleRefAction<*> -> result.add(GitBranchActionWrapper(action, branch, selectedRepository, repositories))
is ActionGroup -> {
action.getChildren(e).forEach {
doWrapActions(result, e, it, branch, selectedRepository, repositories)
}
}
else -> result.add(action)
}
}
}
}
@@ -35,7 +35,6 @@ import java.util.*;
import static com.intellij.dvcs.DvcsUtil.getShortHash;
import static com.intellij.util.ObjectUtils.notNull;
import static com.intellij.util.containers.ContainerUtil.map2Array;
import static com.intellij.util.containers.ContainerUtil.map2SetNotNull;
import static git4idea.GitUtil.HEAD;
import static git4idea.branch.GitBranchType.LOCAL;
@@ -352,8 +351,6 @@ public final class GitBranchPopupActions {
@NotNull GitRepository selectedRepository,
@Nullable AnActionEvent e) {
AnAction[] actions = GitSingleRefActions.getSingleRefActionGroup().getChildren(e);
return map2Array(actions,
AnAction.class,
action -> GitBranchActionWrapper.tryWrap(action, branch, selectedRepository, repositories));
return GitBranchActionWrapper.wrapActions(actions, e, branch,selectedRepository, repositories);
}
}