From 7cb0be8f1508b44f5b10cdc23bfe35e74fda226b Mon Sep 17 00:00:00 2001 From: Aleksandr Krasilnikov Date: Fri, 17 Oct 2025 11:56:45 +0200 Subject: [PATCH] [vcs] IJPL-213061 Log: Fix branch submenu presence IJ-MR-179021 GitOrigin-RevId: 84dfa2b4357cbd366c8b602bd4215a51582021b5 --- .../vcs/git/actions/GitSingleRefActions.kt | 6 +++ .../ui/branch/GitBranchActionWrapper.kt | 39 ++++++++++++++++--- .../ui/branch/GitBranchPopupActions.java | 5 +-- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/plugins/git4idea/shared/src/com/intellij/vcs/git/actions/GitSingleRefActions.kt b/plugins/git4idea/shared/src/com/intellij/vcs/git/actions/GitSingleRefActions.kt index 99fc4a189677..72e42a813be7 100644 --- a/plugins/git4idea/shared/src/com/intellij/vcs/git/actions/GitSingleRefActions.kt +++ b/plugins/git4idea/shared/src/com/intellij/vcs/git/actions/GitSingleRefActions.kt @@ -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 = 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() diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchActionWrapper.kt b/plugins/git4idea/src/git4idea/ui/branch/GitBranchActionWrapper.kt index 8aedc3a518ae..714e77d5453c 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchActionWrapper.kt +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchActionWrapper.kt @@ -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) = - if (action is GitSingleRefAction<*>) GitBranchActionWrapper(action, branch, selectedRepository, repositories) else action + fun wrapActions( + actions: Array, + e: AnActionEvent?, + branch: GitBranch, + selectedRepository: GitRepository, + repositories: List, + ): Array { + val wrappedActions = mutableListOf() + for (action in actions) { + doWrapActions(wrappedActions, e, action, branch, selectedRepository, repositories) + } + return wrappedActions.toTypedArray() + } + + private fun doWrapActions( + result: MutableList, + e: AnActionEvent?, + action: AnAction, + branch: GitBranch, + selectedRepository: GitRepository, + repositories: List, + ) { + 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) + } + } } } diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java index 33316b9567b9..a42780e53908 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java @@ -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); } }