Graph - add command to compare references (#273635)

This commit is contained in:
Ladislau Szomoru
2025-10-27 23:37:10 +01:00
committed by GitHub
parent f4f6a86655
commit 3fff78b18a
3 changed files with 75 additions and 0 deletions

View File

@@ -514,6 +514,12 @@
"category": "Git",
"enablement": "!operationInProgress"
},
{
"command": "git.graph.compareBranches",
"title": "%command.graphCompareBranches%",
"category": "Git",
"enablement": "!operationInProgress"
},
{
"command": "git.deleteRemoteBranch",
"title": "%command.deleteRemoteBranch%",
@@ -1594,6 +1600,10 @@
"command": "git.graph.deleteBranch",
"when": "false"
},
{
"command": "git.graph.compareBranches",
"when": "false"
},
{
"command": "git.graph.deleteTag",
"when": "false"
@@ -2265,6 +2275,11 @@
"when": "scmProvider == git && scmHistoryItemRef =~ /^refs\\/heads\\/|^refs\\/remotes\\//",
"group": "2_branch@2"
},
{
"command": "git.graph.compareBranches",
"when": "scmProvider == git && scmHistoryItemRef =~ /^refs\\/heads\\//",
"group": "2_branch@3"
},
{
"command": "git.graph.deleteTag",
"when": "scmProvider == git && scmHistoryItemRef =~ /^refs\\/tags\\//",

View File

@@ -135,6 +135,7 @@
"command.graphCheckout": "Checkout",
"command.graphCheckoutDetached": "Checkout (Detached)",
"command.graphCherryPick": "Cherry Pick",
"command.graphCompareBranches": "Compare Branches...",
"command.graphDeleteBranch": "Delete Branch",
"command.graphDeleteTag": "Delete Tag",
"command.blameToggleEditorDecoration": "Toggle Git Blame Editor Decoration",

View File

@@ -3114,6 +3114,65 @@ export class CommandCenter {
await this._deleteBranch(repository, undefined, undefined, { remote: true });
}
@command('git.graph.compareBranches', { repository: true })
async compareBranches(repository: Repository, historyItem?: SourceControlHistoryItem, historyItemRefId?: string): Promise<void> {
const historyItemRef = historyItem?.references?.find(r => r.id === historyItemRefId);
if (!historyItemRefId || !historyItemRef) {
return;
}
const config = workspace.getConfiguration('git');
const showRefDetails = config.get<boolean>('showReferenceDetails') === true;
const getBranchPicks = async () => {
const refs = await repository.getRefs({ includeCommitDetails: showRefDetails });
const processors = [
new RefProcessor(RefType.Head, BranchItem),
new RefProcessor(RefType.Tag, BranchItem)
];
const itemsProcessor = new RefItemsProcessor(repository, processors);
return itemsProcessor.processRefs(refs);
};
const placeHolder = l10n.t('Select a source reference to compare to');
const sourceRef = await this.pickRef(getBranchPicks(), placeHolder);
if (!(sourceRef instanceof BranchItem)) {
return;
}
if (historyItemRefId === sourceRef.refId) {
window.showInformationMessage(l10n.t('The selected references are the same.'));
return;
}
try {
const changes = await repository.diffTrees(historyItemRefId, sourceRef.refId);
if (changes.length === 0) {
window.showInformationMessage(l10n.t('The selected references have no differences.'));
return;
}
const resources = changes.map(change => toMultiFileDiffEditorUris(change, sourceRef.refId, historyItemRefId));
const title = `${sourceRef.ref.name}${historyItemRef.name}`;
const multiDiffSourceUri = Uri.from({
scheme: 'git-branch-compare',
path: `${repository.root}/${sourceRef.refId}..${historyItemRefId}`
});
await commands.executeCommand('_workbench.openMultiDiffEditor', {
multiDiffSourceUri,
title,
resources
});
} catch (err) {
throw new Error(l10n.t('Failed to compare references: {0}', err.message ?? err));
}
}
private async _deleteBranch(repository: Repository, remote: string | undefined, name: string | undefined, options: { remote: boolean; force?: boolean }): Promise<void> {
let run: (force?: boolean) => Promise<void>;