From 891a17ab5736b827acf162a2b7b1e85517f0e642 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 8 Jan 2024 21:39:07 +0100 Subject: [PATCH] Git - move "Open Commit" command from core to the git extension (#202042) * Initial implementation * Move the command to the git extension * Add missing enablement property --- extensions/git/package.json | 36 ++++++- extensions/git/package.nls.json | 2 +- extensions/git/src/commands.ts | 26 ++++- extensions/git/src/repository.ts | 9 +- src/vs/platform/actions/common/actions.ts | 3 +- src/vs/workbench/api/browser/mainThreadSCM.ts | 2 + src/vs/workbench/contrib/scm/browser/menus.ts | 17 ++-- .../contrib/scm/browser/scmViewPane.ts | 94 ++++++++----------- .../workbench/contrib/scm/common/history.ts | 3 +- .../actions/common/menusExtensionPoint.ts | 12 +++ .../common/extensionsApiProposals.ts | 1 + ...d.contribSourceControlHistoryItemMenu.d.ts | 7 ++ 12 files changed, 137 insertions(+), 75 deletions(-) create mode 100644 src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemMenu.d.ts diff --git a/extensions/git/package.json b/extensions/git/package.json index 9ac30f041e3..c41d7ceb386 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -24,7 +24,8 @@ "tabInputTextMerge", "timeline", "contribMergeEditorMenus", - "contribSourceControlInputBoxMenu" + "contribSourceControlInputBoxMenu", + "contribSourceControlHistoryItemMenu" ], "categories": [ "Other" @@ -708,7 +709,7 @@ }, { "command": "git.timeline.openCommit", - "title": "%command.timelineOpenCommit%", + "title": "%command.openCommit%", "icon": "$(diff-multiple)", "category": "Git" }, @@ -776,13 +777,22 @@ "command": "git.viewChanges", "title": "%command.viewChanges%", "icon": "$(diff-multiple)", - "category": "Git" + "category": "Git", + "enablement": "!operationInProgress" }, { "command": "git.viewStagedChanges", "title": "%command.viewStagedChanges%", "icon": "$(diff-multiple)", - "category": "Git" + "category": "Git", + "enablement": "!operationInProgress" + }, + { + "command": "git.openCommit", + "title": "%command.openCommit%", + "icon": "$(diff-multiple)", + "category": "Git", + "enablement": "!operationInProgress" } ], "continueEditSession": [ @@ -1274,6 +1284,10 @@ { "command": "git.viewStagedChanges", "when": "false" + }, + { + "command": "git.openCommit", + "when": "false" } ], "scm/title": [ @@ -1751,6 +1765,20 @@ "group": "1_modification@3" } ], + "scm/incoming/historyItem/context": [ + { + "command": "git.openCommit", + "when": "scmProvider == git && config.multiDiffEditor.experimental.enabled", + "group": "inline@1" + } + ], + "scm/outgoing/historyItem/context": [ + { + "command": "git.openCommit", + "when": "scmProvider == git && config.multiDiffEditor.experimental.enabled", + "group": "inline@1" + } + ], "editor/title": [ { "command": "git.openFile", diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 627b6195828..8903480d364 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -106,7 +106,6 @@ "command.stashDropAll": "Drop All Stashes...", "command.stashPreview": "Preview Stash...", "command.timelineOpenDiff": "Open Changes", - "command.timelineOpenCommit": "Open Commit", "command.timelineCopyCommitId": "Copy Commit ID", "command.timelineCopyCommitMessage": "Copy Commit Message", "command.timelineSelectForCompare": "Select for Compare", @@ -115,6 +114,7 @@ "command.openRepositoriesInParentFolders": "Open Repositories In Parent Folders", "command.viewChanges": "View Changes", "command.viewStagedChanges": "View Staged Changes", + "command.openCommit": "Open Commit", "command.api.getRepositories": "Get Repositories", "command.api.getRepositoryState": "Get Repository State", "command.api.getRemoteSources": "Get Remote Sources", diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 892e3698e56..ad4e32920b9 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -5,7 +5,7 @@ import * as os from 'os'; import * as path from 'path'; -import { Command, commands, Disposable, LineChange, MessageOptions, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider, InputBoxValidationSeverity, TabInputText, TabInputTextMerge, QuickPickItemKind, TextDocument, LogOutputChannel, l10n, Memento, UIKind, QuickInputButton, ThemeIcon } from 'vscode'; +import { Command, commands, Disposable, LineChange, MessageOptions, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider, InputBoxValidationSeverity, TabInputText, TabInputTextMerge, QuickPickItemKind, TextDocument, LogOutputChannel, l10n, Memento, UIKind, QuickInputButton, ThemeIcon, SourceControlHistoryItem } from 'vscode'; import TelemetryReporter from '@vscode/extension-telemetry'; import { uniqueNamesGenerator, adjectives, animals, colors, NumberDictionary } from '@joaomoreno/unique-names-generator'; import { ForcePushMode, GitErrorCodes, Ref, RefType, Status, CommitOptions, RemoteSourcePublisher, Remote } from './api/git'; @@ -3617,7 +3617,6 @@ export class CommandCenter { @command('git.timeline.openCommit', { repository: false }) async timelineOpenCommit(item: TimelineItem, uri: Uri | undefined, _source: string) { - console.log('timelineOpenCommit', item); if (!GitTimelineItem.is(item)) { return; } @@ -3840,6 +3839,29 @@ export class CommandCenter { commands.executeCommand('vscode.changes', title, args); } + @command('git.openCommit', { repository: true }) + async openCommit(repository: Repository, historyItem: SourceControlHistoryItem): Promise { + if (!repository || !historyItem) { + return; + } + + const historyProvider = repository.historyProvider; + const historyItemParentId = historyItem.parentIds.length > 0 ? historyItem.parentIds[0] : undefined; + const historyItemChanges = await historyProvider.provideHistoryItemChanges(historyItem.id, historyItemParentId); + + if (historyItemChanges.length === 0) { + return; + } + + const modifiedShortRef = historyItem.id.substring(0, 8); + const originalShortRef = historyItem.parentIds.length > 0 ? historyItem.parentIds[0].substring(0, 8) : `${modifiedShortRef}^`; + + const title = l10n.t('Changes ({0} ↔ {1})', originalShortRef, modifiedShortRef); + const args = historyItemChanges.map(change => [change.uri, change.originalUri, change.modifiedUri]); + + commands.executeCommand('vscode.changes', title, args); + } + private createCommand(id: string, key: string, method: Function, options: ScmCommandOptions): (...args: any[]) => any { const result = (...args: any[]) => { let result: Promise; diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 42f90428a2c..e512d5f0bed 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -796,6 +796,9 @@ export class Repository implements Disposable { return this.repository.dotGit; } + private _historyProvider: GitHistoryProvider; + get historyProvider(): GitHistoryProvider { return this._historyProvider; } + private isRepositoryHuge: false | { limit: number } = false; private didWarnAboutLimit = false; @@ -850,9 +853,9 @@ export class Repository implements Disposable { this._sourceControl.quickDiffProvider = this; - const historyProvider = new GitHistoryProvider(this, logger); - this._sourceControl.historyProvider = historyProvider; - this.disposables.push(historyProvider); + this._historyProvider = new GitHistoryProvider(this, logger); + this._sourceControl.historyProvider = this._historyProvider; + this.disposables.push(this._historyProvider); this._sourceControl.acceptInputCommand = { command: 'git.commit', title: l10n.t('Commit'), arguments: [this._sourceControl] }; this._sourceControl.inputBox.validateInput = this.validateInput.bind(this); diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 5b48ab3dfd6..9346da55bbf 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -107,7 +107,8 @@ export class MenuId { static readonly OpenEditorsContextShare = new MenuId('OpenEditorsContextShare'); static readonly ProblemsPanelContext = new MenuId('ProblemsPanelContext'); static readonly SCMInputBox = new MenuId('SCMInputBox'); - static readonly SCMHistoryItem = new MenuId('SCMHistoryItem'); + static readonly SCMIncomingHistoryItemContext = new MenuId('SCMIncomingHistoryItemContext'); + static readonly SCMOutgoingHistoryItemContext = new MenuId('SCMOutgoingHistoryItemContext'); static readonly SCMChangeContext = new MenuId('SCMChangeContext'); static readonly SCMResourceContext = new MenuId('SCMResourceContext'); static readonly SCMResourceContextShare = new MenuId('SCMResourceContextShare'); diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index f42a0b5d9f4..e0afc9bed49 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -158,6 +158,7 @@ class MainThreadSCMHistoryProvider implements ISCMHistoryProvider { id: historyItemGroupBase.id, label: historyItemGroupBase.label, icon: Codicon.arrowCircleDown, + direction: 'incoming', ancestor: ancestor.id, count: ancestor.behind, }; @@ -167,6 +168,7 @@ class MainThreadSCMHistoryProvider implements ISCMHistoryProvider { id: historyItemGroup.id, label: historyItemGroup.label, icon: Codicon.arrowCircleUp, + direction: 'outgoing', ancestor: ancestor.id, count: ancestor.ahead, }; diff --git a/src/vs/workbench/contrib/scm/browser/menus.ts b/src/vs/workbench/contrib/scm/browser/menus.ts index 7a2dce84f38..fecb988c5ad 100644 --- a/src/vs/workbench/contrib/scm/browser/menus.ts +++ b/src/vs/workbench/contrib/scm/browser/menus.ts @@ -15,7 +15,7 @@ import { equals } from 'vs/base/common/arrays'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { localize } from 'vs/nls'; -import { ISCMHistoryItem, ISCMHistoryProviderMenus } from 'vs/workbench/contrib/scm/common/history'; +import { ISCMHistoryItem, ISCMHistoryItemGroupEntry, ISCMHistoryProviderMenus } from 'vs/workbench/contrib/scm/common/history'; function actionEquals(a: IAction, b: IAction): boolean { return a.id === b.id; @@ -177,7 +177,7 @@ export class SCMRepositoryMenus implements ISCMRepositoryMenus, IDisposable { private _historyProviderMenu: SCMHistoryProviderMenus | undefined; get historyProviderMenu(): SCMHistoryProviderMenus | undefined { if (this.provider.historyProvider && !this._historyProviderMenu) { - this._historyProviderMenu = this.instantiationService.createInstance(SCMHistoryProviderMenus); + this._historyProviderMenu = new SCMHistoryProviderMenus(this.contextKeyService, this.menuService); this.disposables.add(this._historyProviderMenu); } @@ -189,7 +189,7 @@ export class SCMRepositoryMenus implements ISCMRepositoryMenus, IDisposable { constructor( private readonly provider: ISCMProvider, @IContextKeyService contextKeyService: IContextKeyService, - @IInstantiationService private readonly instantiationService: IInstantiationService, + @IInstantiationService instantiationService: IInstantiationService, @IMenuService private readonly menuService: IMenuService ) { this.contextKeyService = contextKeyService.createOverlay([ @@ -261,11 +261,11 @@ export class SCMHistoryProviderMenus implements ISCMHistoryProviderMenus, IDispo @IContextKeyService private readonly contextKeyService: IContextKeyService, @IMenuService private readonly menuService: IMenuService) { } - getHistoryItemMenu(historyItem: ISCMHistoryItem): IMenu { - return this.getOrCreateHistoryItemMenu(historyItem); + getHistoryItemMenu(historyItemGroup: ISCMHistoryItemGroupEntry, historyItem: ISCMHistoryItem): IMenu { + return this.getOrCreateHistoryItemMenu(historyItemGroup, historyItem); } - private getOrCreateHistoryItemMenu(historyItem: ISCMHistoryItem): IMenu { + private getOrCreateHistoryItemMenu(historyItemGroup: ISCMHistoryItemGroupEntry, historyItem: ISCMHistoryItem): IMenu { let result = this.historyItemMenus.get(historyItem); if (!result) { @@ -273,7 +273,10 @@ export class SCMHistoryProviderMenus implements ISCMHistoryProviderMenus, IDispo ['scmHistoryItem', historyItem.id], ]); - result = this.menuService.createMenu(MenuId.SCMHistoryItem, contextKeyService); + const menuId = historyItemGroup.direction === 'incoming' ? + MenuId.SCMIncomingHistoryItemContext : MenuId.SCMOutgoingHistoryItemContext; + + result = this.menuService.createMenu(menuId, contextKeyService); this.historyItemMenus.set(historyItem, result); } diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index f2aa3236d63..ca3168ffc3f 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -11,7 +11,7 @@ import { ViewPane, IViewPaneOptions, ViewAction } from 'vs/workbench/browser/par import { append, $, Dimension, asCSSUrl, trackFocus, clearNode, prepend } from 'vs/base/browser/dom'; import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; import { ISCMHistoryItem, ISCMHistoryItemChange, ISCMHistoryProviderCacheEntry, SCMHistoryItemChangeTreeElement, SCMHistoryItemGroupTreeElement, SCMHistoryItemTreeElement, SCMViewSeparatorElement } from 'vs/workbench/contrib/scm/common/history'; -import { ISCMResourceGroup, ISCMResource, InputValidationType, ISCMRepository, ISCMInput, IInputValidation, ISCMViewService, ISCMViewVisibleRepositoryChangeEvent, ISCMService, SCMInputChangeReason, VIEW_PANE_ID, ISCMActionButton, ISCMActionButtonDescriptor, ISCMRepositorySortKey, REPOSITORIES_VIEW_PANE_ID, ISCMInputValueProviderContext } from 'vs/workbench/contrib/scm/common/scm'; +import { ISCMResourceGroup, ISCMResource, InputValidationType, ISCMRepository, ISCMInput, IInputValidation, ISCMViewService, ISCMViewVisibleRepositoryChangeEvent, ISCMService, SCMInputChangeReason, VIEW_PANE_ID, ISCMActionButton, ISCMActionButtonDescriptor, ISCMRepositorySortKey, REPOSITORIES_VIEW_PANE_ID, ISCMInputValueProviderContext, ISCMProvider } from 'vs/workbench/contrib/scm/common/scm'; import { ResourceLabels, IResourceLabel, IFileLabelOptions } from 'vs/workbench/browser/labels'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -21,7 +21,7 @@ import { IContextKeyService, IContextKey, ContextKeyExpr, RawContextKey } from ' import { ICommandService } from 'vs/platform/commands/common/commands'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { MenuItemAction, IMenuService, registerAction2, MenuId, IAction2Options, MenuRegistry, Action2, IMenu } from 'vs/platform/actions/common/actions'; -import { IAction, ActionRunner, Action, Separator } from 'vs/base/common/actions'; +import { IAction, ActionRunner, Action, Separator, IActionRunner } from 'vs/base/common/actions'; import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; import { IThemeService, IFileIconTheme } from 'vs/platform/theme/common/themeService'; import { isSCMResource, isSCMResourceGroup, connectPrimaryMenuToInlineActionBar, isSCMRepository, isSCMInput, collectContextMenuActions, getActionViewItemProvider, isSCMActionButton, isSCMViewService, isSCMHistoryItemGroupTreeElement, isSCMHistoryItemTreeElement, isSCMHistoryItemChangeTreeElement, toDiffEditorArguments, isSCMResourceNode, isSCMHistoryItemChangeNode, isSCMViewSeparator } from './util'; @@ -808,6 +808,29 @@ class HistoryItemGroupRenderer implements ICompressibleTreeRenderer { + if (!(action instanceof MenuItemAction)) { + return super.runAction(action, context); + } + + const args: (ISCMProvider | ISCMHistoryItem)[] = []; + args.push(context.historyItemGroup.repository.provider); + args.push({ + id: context.id, + parentIds: context.parentIds, + label: context.label, + description: context.description, + icon: context.icon, + timestamp: context.timestamp, + statistics: context.statistics, + } satisfies ISCMHistoryItem); + + await action.run(...args); + } +} + interface HistoryItemTemplate { readonly iconContainer: HTMLElement; readonly label: IconLabel; @@ -826,6 +849,7 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer { registerAction2(CollapseAllRepositoriesAction); registerAction2(ExpandAllRepositoriesAction); -class HistoryItemViewChangesAction extends Action2 { - - constructor() { - super({ - id: `workbench.scm.action.historyItemViewChanges`, - title: localize('historyItemViewChanges', "View Changes"), - icon: Codicon.diffMultiple, - f1: false, - menu: { - id: MenuId.SCMHistoryItem, - group: 'inline', - when: ContextKeyExpr.has('config.multiDiffEditor.experimental.enabled'), - } - }); - } - - async run(accessor: ServicesAccessor, historyItem: SCMHistoryItemTreeElement): Promise { - const commandService = accessor.get(ICommandService); - - const historyProvider = historyItem.historyItemGroup.repository.provider.historyProvider; - if (!historyProvider) { - return; - } - - const historyItemParentId = historyItem.parentIds.length > 0 ? historyItem.parentIds[0] : undefined; - const historyItemChanges = await historyProvider.provideHistoryItemChanges(historyItem.id, historyItemParentId); - if (!historyItemChanges || historyItemChanges.length === 0) { - return; - } - - let [originalRef, modifiedRef] = historyItem.id.includes('..') - ? historyItem.id.split('..').map(id => id.substring(0, 8)) : [undefined, historyItem.id.substring(0, 8)]; - - if (!originalRef) { - originalRef = historyItem.parentIds.length > 0 ? historyItem.parentIds[0].substring(0, 8) : `${modifiedRef}^`; - } - - const title = localize('historyItemChangesTitle', "Changes ({0} ↔ {1})", originalRef, modifiedRef); - const args = historyItemChanges.map(change => [change.uri, change.originalUri, change.modifiedUri]); - - return commandService.executeCommand('_workbench.changes', title, args); - } - -} - -registerAction2(HistoryItemViewChangesAction); - const enum SCMInputWidgetCommandId { CancelAction = 'scm.input.cancelAction' } @@ -2742,9 +2720,13 @@ export class SCMViewPane extends ViewPane { this.listLabels = this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this.onDidChangeBodyVisibility }); this.disposables.add(this.listLabels); - const actionRunner = new RepositoryPaneActionRunner(() => this.getSelectedResources()); - actionRunner.onWillRun(() => this.tree.domFocus(), this, this.disposables); - this.disposables.add(actionRunner); + const resourceActionRunner = new RepositoryPaneActionRunner(() => this.getSelectedResources()); + resourceActionRunner.onWillRun(() => this.tree.domFocus(), this, this.disposables); + this.disposables.add(resourceActionRunner); + + const historyItemActionRunner = new HistoryItemActionRunner(); + historyItemActionRunner.onWillRun(() => this.tree.domFocus(), this, this.disposables); + this.disposables.add(historyItemActionRunner); const treeDataSource = this.instantiationService.createInstance(SCMTreeDataSource, () => this.viewMode, () => this.alwaysShowRepositories, () => this.showActionButton, () => this.showIncomingChanges, () => this.showOutgoingChanges); this.disposables.add(treeDataSource); @@ -2760,9 +2742,9 @@ export class SCMViewPane extends ViewPane { this.actionButtonRenderer, this.instantiationService.createInstance(RepositoryRenderer, MenuId.SCMTitle, getActionViewItemProvider(this.instantiationService)), this.instantiationService.createInstance(ResourceGroupRenderer, getActionViewItemProvider(this.instantiationService)), - this.instantiationService.createInstance(ResourceRenderer, () => this.viewMode, this.listLabels, getActionViewItemProvider(this.instantiationService), actionRunner), + this.instantiationService.createInstance(ResourceRenderer, () => this.viewMode, this.listLabels, getActionViewItemProvider(this.instantiationService), resourceActionRunner), this.instantiationService.createInstance(HistoryItemGroupRenderer), - this.instantiationService.createInstance(HistoryItemRenderer, getActionViewItemProvider(this.instantiationService)), + this.instantiationService.createInstance(HistoryItemRenderer, historyItemActionRunner, getActionViewItemProvider(this.instantiationService)), this.instantiationService.createInstance(HistoryItemChangeRenderer, () => this.viewMode, this.listLabels), this.instantiationService.createInstance(SeparatorRenderer) ], diff --git a/src/vs/workbench/contrib/scm/common/history.ts b/src/vs/workbench/contrib/scm/common/history.ts index d1e61ec676c..db2e8ed4bf7 100644 --- a/src/vs/workbench/contrib/scm/common/history.ts +++ b/src/vs/workbench/contrib/scm/common/history.ts @@ -10,7 +10,7 @@ import { IMenu } from 'vs/platform/actions/common/actions'; import { ISCMRepository } from 'vs/workbench/contrib/scm/common/scm'; export interface ISCMHistoryProviderMenus { - getHistoryItemMenu(historyItem: ISCMHistoryItem): IMenu; + getHistoryItemMenu(historyItemGroup: ISCMHistoryItemGroupEntry, historyItem: ISCMHistoryItem): IMenu; } export interface ISCMHistoryProvider { @@ -57,6 +57,7 @@ export interface ISCMHistoryItemGroupDetails { export interface ISCMHistoryItemGroupEntry { readonly id: string; readonly label: string; + readonly direction: 'incoming' | 'outgoing'; readonly icon?: URI | { light: URI; dark: URI } | ThemeIcon; readonly description?: string; readonly ancestor?: string; diff --git a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts index 8bf3f2c149f..3d62dc3f751 100644 --- a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts @@ -150,6 +150,18 @@ const apiMenus: IAPIMenu[] = [ description: localize('menus.input', "The Source Control input box menu"), proposed: 'contribSourceControlInputBoxMenu' }, + { + key: 'scm/incoming/historyItem/context', + id: MenuId.SCMIncomingHistoryItemContext, + description: localize('menus.incomingHistoryItemContext', "The Source Control incoming history item context menu"), + proposed: 'contribSourceControlHistoryItemMenu' + }, + { + key: 'scm/outgoing/historyItem/context', + id: MenuId.SCMOutgoingHistoryItemContext, + description: localize('menus.outgoingHistoryItemContext', "The Source Control outgoing history item context menu"), + proposed: 'contribSourceControlHistoryItemMenu' + }, { key: 'statusBar/remoteIndicator', id: MenuId.StatusBarRemoteIndicatorMenu, diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index 3ebb6ae371d..0d20d085e99 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -32,6 +32,7 @@ export const allApiProposals = Object.freeze({ contribNotebookStaticPreloads: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribNotebookStaticPreloads.d.ts', contribRemoteHelp: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribRemoteHelp.d.ts', contribShareMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribShareMenu.d.ts', + contribSourceControlHistoryItemMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemMenu.d.ts', contribSourceControlInputBoxMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlInputBoxMenu.d.ts', contribStatusBarItems: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribStatusBarItems.d.ts', contribViewsRemote: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribViewsRemote.d.ts', diff --git a/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemMenu.d.ts b/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemMenu.d.ts new file mode 100644 index 00000000000..44bfaf17b01 --- /dev/null +++ b/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemMenu.d.ts @@ -0,0 +1,7 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// empty placeholder declaration for the `scm/historyItem/context`-menu contribution point +// https://github.com/microsoft/vscode/issues/201997