Change:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Read our guide about submitting issues: --<!-- Search existing issues to avoid creating duplicates. --<!-- Test using the latest Insiders build to see if your issue has already been fixed: --<!-- Instead of creating your report here, use 'Report Issue' from the 'Help' menu in VS Code to pre-fill useful information. --<!-- Launch with to check. --Does this issue occur when all extensions are disabled?: No, issue is with extension contributed context menus. <!-- If you answered No above, use 'Help: Start Extension Bisect' from Command Palette to try to identify the cause. --<!-- Issues caused by an extension need to be reported directly to the extension publisher. The 'Help Report Issue' dialog can assist with this. --- VS Code Version: 1.89.0-insider OS Version: Mac OS X (ARM) Steps to Reproduce: a context menu in Stable and compare it to the same menu in Insiders. I verified the issue reproduces for multiple extensions including GitLens. Stable: <img width="424" alt="image" src=""Insiders: <img width="420" alt="image" src=""
If this is a confirmed regression, it would help to know which change caused it. We maintain a based CLI tool  that automatically downloads and runs previous VS Code insiders and asks for each build if the issue reproduces. It takes up to 8 steps to find exactly the build that caused the regression. Steps: install (if not yet done) follow the instructions until you found the offending build (its fine to leave the commit empty) report back the commit range in this issue Thanks!
Bisect points to My money would be on Reproduces by looking at the context menu of "Commits" when GitLens is installed: !

Discussion:
import { ElementsDragAndDropData, ListViewTargetSector } from 'vs/base/browser/ui/list/listView'; import { IAsyncDataSource, ITreeContextMenuEvent, ITreeDragAndDrop, ITreeDragOverReaction, ITreeNode, ITreeRenderer, TreeDragOverBubble } from 'vs/base/browser/ui/tree/tree'; import { CollapseAllAction } from 'vs/base/browser/ui/tree/treeDefaults'; <del> import { ActionRunner, IAction } from 'vs/base/common/actions'; </del> <ins> import { ActionRunner, IAction, Separator } from 'vs/base/common/actions'; </ins> import { timeout } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { Codicon } from 'vs/base/common/codicons';

this.contextKeyService = service; } <ins> private filterNonUniversalActions(groups: Map<string, IAction>[], newActions: IAction[]) { const newActionsSet: Set<string> = new Set(newActions.map(a => a.id)); for (const group of groups) { const actions = group.keys(); for (const action of actions) { if (!newActionsSet.has(action)) { group.delete(action); } } } } private buildMenu(groups: Map<string, IAction>[]): IAction[] { const result: IAction[] = []; for (const group of groups) { if (group.size > 0) { if (result.length) { result.push(new Separator()); } result.push(...group.values()); } } return result; } private createGroups(actions: IAction[]): Map<string, IAction>[] { const groups: Map<string, IAction>[] = []; let group: Map<string, IAction> = new Map(); for (const action of actions) { if (action instanceof Separator) { groups.push(group); group = new Map(); } else { group.set(action.id, action); } } groups.push(group); return groups; } </ins> private getActions(menuId: MenuId, elements: ITreeItem[], listen?: DisposableStore): { primary: IAction[]; secondary: IAction[] } { if (!this.contextKeyService) { return { primary: [], secondary: [] }; } <del> const allowedPrimary = new Map<string, IAction>(); const allowedSecondary = new Map<string, IAction>(); </del> <ins> let primaryGroups: Map<string, IAction>[] = []; let secondaryGroups: Map<string, IAction>[] = []; </ins> for (let i = 0; i < elements.length; i++) { const element = elements[i]; const contextKeyService = this.contextKeyService.createOverlay([

const result = { primary, secondary, menu }; createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, 'inline'); if (i === 0) { <del> for (const action of result.primary) { allowedPrimary.set(action.id, action); } for (const action of result.secondary) { allowedSecondary.set(action.id, action); } </del> <ins> primaryGroups = this.createGroups(result.primary); secondaryGroups = this.createGroups(result.secondary); </ins> } else { <del> const primaryKeys = allowedPrimary.keys(); for (const key of primaryKeys) { if (!result.primary.some(action => action.id === key)) { allowedPrimary.delete(key); } } const secondaryKeys = allowedSecondary.keys(); for (const key of secondaryKeys) { if (!result.secondary.some(action => action.id === key)) { allowedSecondary.delete(key); } } </del> <ins> this.filterNonUniversalActions(primaryGroups, result.primary); this.filterNonUniversalActions(secondaryGroups, result.secondary); </ins> } if (listen && elements.length === 1) { listen.add(menu.onDidChange(() => this._onDidChange.fire(element)));

} } <del> return { primary: Array.from(allowedPrimary.values()), secondary: Array.from(allowedSecondary.values()) }; </del> <ins> return { primary: this.buildMenu(primaryGroups), secondary: this.buildMenu(secondaryGroups) }; </ins> } dispose() {