Git - add dedicated commands to view changes (#209942)

This commit is contained in:
Ladislau Szomoru 2024-04-09 14:33:13 +02:00 committed by GitHub
parent 5d77214b3f
commit f9554073cc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 90 additions and 22 deletions

View file

@ -856,6 +856,27 @@
"title": "%command.openRepositoriesInParentFolders%",
"category": "Git"
},
{
"command": "git.viewChanges",
"title": "%command.viewChanges%",
"icon": "$(diff-multiple)",
"category": "Git",
"enablement": "!operationInProgress"
},
{
"command": "git.viewStagedChanges",
"title": "%command.viewStagedChanges%",
"icon": "$(diff-multiple)",
"category": "Git",
"enablement": "!operationInProgress"
},
{
"command": "git.viewUntrackedChanges",
"title": "%command.viewUntrackedChanges%",
"icon": "$(diff-multiple)",
"category": "Git",
"enablement": "!operationInProgress"
},
{
"command": "git.viewCommit",
"title": "%command.viewCommit%",
@ -1511,6 +1532,16 @@
"when": "scmProvider == git && scmResourceGroup == index",
"group": "inline@2"
},
{
"command": "git.viewStagedChanges",
"when": "scmProvider == git && scmResourceGroup == index && config.multiDiffEditor.experimental.enabled",
"group": "inline@1"
},
{
"command": "git.viewChanges",
"when": "scmProvider == git && scmResourceGroup == workingTree && config.multiDiffEditor.experimental.enabled",
"group": "inline@1"
},
{
"command": "git.cleanAll",
"when": "scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges == mixed",
@ -1561,6 +1592,11 @@
"when": "scmProvider == git && scmResourceGroup == untracked",
"group": "1_modification"
},
{
"command": "git.viewUntrackedChanges",
"when": "scmProvider == git && scmResourceGroup == untracked && config.multiDiffEditor.experimental.enabled",
"group": "inline@1"
},
{
"command": "git.cleanAllUntracked",
"when": "scmProvider == git && scmResourceGroup == untracked",

View file

@ -118,6 +118,9 @@
"command.timelineCompareWithSelected": "Compare with Selected",
"command.manageUnsafeRepositories": "Manage Unsafe Repositories",
"command.openRepositoriesInParentFolders": "Open Repositories In Parent Folders",
"command.viewChanges": "View Changes",
"command.viewStagedChanges": "View Staged Changes",
"command.viewUntrackedChanges": "View Untracked Changes",
"command.viewAllChanges": "View All Changes",
"command.viewCommit": "View Commit",
"command.api.getRepositories": "Get Repositories",

View file

@ -11,7 +11,7 @@ import { uniqueNamesGenerator, adjectives, animals, colors, NumberDictionary } f
import { ForcePushMode, GitErrorCodes, Ref, RefType, Status, CommitOptions, RemoteSourcePublisher, Remote } from './api/git';
import { Git, Stash } from './git';
import { Model } from './model';
import { Repository, Resource, ResourceGroupType } from './repository';
import { GitResourceGroup, Repository, Resource, ResourceGroupType } from './repository';
import { DiffEditorSelectionHunkToolbarContext, applyLineChanges, getModifiedRange, intersectDiffWithRange, invertLineChange, toLineRanges } from './staging';
import { fromGitUri, toGitUri, isGitUri, toMergeUris, toMultiFileDiffEditorUris } from './uri';
import { dispose, grep, isDefined, isDescendant, pathEquals, relativePath } from './util';
@ -4143,6 +4143,33 @@ export class CommandCenter {
}
}
@command('git.viewChanges', { repository: true })
async viewChanges(repository: Repository): Promise<void> {
await this._viewResourceGroupChanges(repository, repository.workingTreeGroup);
}
@command('git.viewStagedChanges', { repository: true })
async viewStagedChanges(repository: Repository): Promise<void> {
await this._viewResourceGroupChanges(repository, repository.indexGroup);
}
@command('git.viewUntrackedChanges', { repository: true })
async viewUnstagedChanges(repository: Repository): Promise<void> {
await this._viewResourceGroupChanges(repository, repository.untrackedGroup);
}
private async _viewResourceGroupChanges(repository: Repository, resourceGroup: GitResourceGroup): Promise<void> {
if (resourceGroup.resourceStates.length === 0) {
return;
}
await commands.executeCommand('_workbench.openScmMultiDiffEditor', {
title: `${repository.sourceControl.label}: ${resourceGroup.label}`,
repositoryUri: Uri.file(repository.root),
resourceGroupId: resourceGroup.id
});
}
@command('git.viewCommit', { repository: true })
async viewCommit(repository: Repository, historyItem: SourceControlHistoryItem): Promise<void> {
if (!repository || !historyItem) {

View file

@ -527,6 +527,11 @@ function registerOpenEditorAPICommands(): void {
label: options.title,
});
});
CommandsRegistry.registerCommand('_workbench.openScmMultiDiffEditor', async (accessor: ServicesAccessor, options: OpenScmMultiFileDiffEditorOptions) => {
const commandService = accessor.get(ICommandService);
await commandService.executeCommand('multiDiffEditor.openScmDiff', options.title, URI.revive(options.repositoryUri), options.resourceGroupId);
});
}
interface OpenMultiFileDiffEditorOptions {
@ -535,6 +540,12 @@ interface OpenMultiFileDiffEditorOptions {
resources?: { originalUri: UriComponents; modifiedUri: UriComponents }[];
}
interface OpenScmMultiFileDiffEditorOptions {
title: string;
repositoryUri: UriComponents;
resourceGroupId: string;
}
function registerOpenEditorAtIndexCommands(): void {
const openEditorAtIndex: ICommandHandler = (accessor: ServicesAccessor, editorIndex: number): void => {
const editorService = accessor.get(IEditorService);

View file

@ -3,15 +3,14 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Codicon } from 'vs/base/common/codicons';
import { Disposable } from 'vs/base/common/lifecycle';
import { observableFromEvent, waitForState } from 'vs/base/common/observable';
import { ValueWithChangeEventFromObservable } from 'vs/base/common/observableInternal/utils';
import { URI } from 'vs/base/common/uri';
import { IMultiDiffEditorOptions } from 'vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl';
import { localize, localize2 } from 'vs/nls';
import { Action2, MenuId } from 'vs/platform/actions/common/actions';
import { ContextKeyExpr, ContextKeyValue } from 'vs/platform/contextkey/common/contextkey';
import { localize2 } from 'vs/nls';
import { Action2 } from 'vs/platform/actions/common/actions';
import { ContextKeyValue } from 'vs/platform/contextkey/common/contextkey';
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { IMultiDiffSourceResolver, IMultiDiffSourceResolverService, IResolvedMultiDiffSource, MultiDiffEditorItem } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService';
import { ISCMRepository, ISCMResourceGroup, ISCMService } from 'vs/workbench/contrib/scm/common/scm';
@ -112,13 +111,12 @@ export class ScmMultiDiffSourceResolverContribution extends Disposable {
}
export class OpenScmGroupAction extends Action2 {
public static async openMultiFileDiffEditor(group: ISCMResourceGroup, editorService: IEditorService, options?: IMultiDiffEditorOptions) {
if (!group.provider.rootUri) {
public static async openMultiFileDiffEditor(editorService: IEditorService, label: string, repositoryRootUri: URI | undefined, resourceGroupId: string, options?: IMultiDiffEditorOptions) {
if (!repositoryRootUri) {
return;
}
const multiDiffSource = ScmMultiDiffSourceResolver.getMultiDiffSourceUri(group.provider.rootUri.toString(), group.id);
const label = localize('scmDiffLabel', '{0}: {1}', group.provider.label, group.label);
const multiDiffSource = ScmMultiDiffSourceResolver.getMultiDiffSourceUri(repositoryRootUri.toString(), resourceGroupId);
return await editorService.openEditor({ label, multiDiffSource, options });
}
@ -126,21 +124,12 @@ export class OpenScmGroupAction extends Action2 {
super({
id: 'multiDiffEditor.openScmDiff',
title: localize2('viewChanges', 'View Changes'),
icon: Codicon.diffMultiple,
menu: {
when: ContextKeyExpr.and(
ContextKeyExpr.has('config.multiDiffEditor.experimental.enabled'),
ContextKeyExpr.has('multiDiffEditorEnableViewChanges'),
),
id: MenuId.SCMResourceGroupContext,
group: 'inline',
},
f1: false,
f1: false
});
}
async run(accessor: ServicesAccessor, group: ISCMResourceGroup): Promise<void> {
async run(accessor: ServicesAccessor, title: string, repositoryRootUri: URI, resourceGroupId: string): Promise<void> {
const editorService = accessor.get(IEditorService);
await OpenScmGroupAction.openMultiFileDiffEditor(group, editorService);
await OpenScmGroupAction.openMultiFileDiffEditor(editorService, title, repositoryRootUri, resourceGroupId);
}
}

View file

@ -3093,7 +3093,9 @@ export class SCMViewPane extends ViewPane {
} else if (isSCMResource(e.element)) {
if (e.element.command?.id === API_OPEN_EDITOR_COMMAND_ID || e.element.command?.id === API_OPEN_DIFF_EDITOR_COMMAND_ID) {
if (isPointerEvent(e.browserEvent) && e.browserEvent.button === 1) {
await OpenScmGroupAction.openMultiFileDiffEditor(e.element.resourceGroup, this.editorService, {
const resourceGroup = e.element.resourceGroup;
const title = `${resourceGroup.provider.label}: ${resourceGroup.label}`;
await OpenScmGroupAction.openMultiFileDiffEditor(this.editorService, title, resourceGroup.provider.rootUri, resourceGroup.id, {
...e.editorOptions,
viewState: {
revealData: {