Skip to content

Commit c71cce4

Browse files
authored
SCM - fix outgoing changes node rendering regression (#281818)
1 parent 3d04768 commit c71cce4

File tree

2 files changed

+48
-47
lines changed

2 files changed

+48
-47
lines changed

src/vs/workbench/contrib/scm/browser/scmHistory.ts

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -485,48 +485,45 @@ function addIncomingOutgoingChangesHistoryItems(
485485

486486
// Outgoing changes node
487487
if (addOutgoingChanges && currentHistoryItemRef?.revision && currentHistoryItemRef.revision !== mergeBase) {
488-
// Find the before/after indices using the merge base (might not be present if the current history item is not loaded yet)
489-
let beforeHistoryItemIndex = findLastIdx(viewModels, vm => vm.outputSwimlanes.some(node => node.id === currentHistoryItemRef.revision));
490-
const afterHistoryItemIndex = viewModels.findIndex(vm => vm.historyItem.id === currentHistoryItemRef.revision);
491-
492-
if (afterHistoryItemIndex !== -1) {
493-
if (beforeHistoryItemIndex === -1 && afterHistoryItemIndex > 0) {
494-
beforeHistoryItemIndex = afterHistoryItemIndex - 1;
495-
}
496-
497-
// Update the after node to point to the `outgoing-changes` node
498-
viewModels[afterHistoryItemIndex].inputSwimlanes.push({
499-
id: currentHistoryItemRef.revision,
500-
color: historyItemRefColor
501-
});
502-
503-
const inputSwimlanes = beforeHistoryItemIndex !== -1
504-
? viewModels[beforeHistoryItemIndex].outputSwimlanes
505-
.map(node => {
506-
return addIncomingChanges && node.id === mergeBase && node.color === historyItemRemoteRefColor
507-
? { ...node, id: SCMIncomingHistoryItemId }
508-
: node;
509-
})
510-
: [];
511-
const outputSwimlanes = viewModels[afterHistoryItemIndex].inputSwimlanes.slice(0);
512-
const displayIdLength = viewModels[0].historyItem.displayId?.length ?? 0;
488+
// Find the index of the current history item view model (might not be present if the current history item is not loaded yet)
489+
const currentHistoryItemRefIndex = viewModels.findIndex(vm => vm.kind === 'HEAD' && vm.historyItem.id === currentHistoryItemRef.revision);
513490

491+
if (currentHistoryItemRefIndex !== -1) {
492+
// Create outgoing changes node
514493
const outgoingChangesHistoryItem = {
515494
id: SCMOutgoingHistoryItemId,
516-
displayId: '0'.repeat(displayIdLength),
495+
displayId: viewModels[0].historyItem.displayId
496+
? '0'.repeat(viewModels[0].historyItem.displayId.length)
497+
: undefined,
517498
parentIds: [mergeBase],
518499
author: currentHistoryItemRef?.name,
519500
subject: localize('outgoingChanges', 'Outgoing Changes'),
520501
message: ''
521502
} satisfies ISCMHistoryItem;
522503

504+
// Copy the input swimlanes from the current history item ref
505+
const inputSwimlanes = viewModels[currentHistoryItemRefIndex].inputSwimlanes.slice(0);
506+
507+
// Copy the input swimlanes and add the current history item ref
508+
const outputSwimlanes = inputSwimlanes.slice(0).concat({
509+
id: currentHistoryItemRef.revision,
510+
color: historyItemRefColor
511+
} satisfies ISCMHistoryItemGraphNode);
512+
523513
// Insert outgoing changes node
524-
viewModels.splice(afterHistoryItemIndex, 0, {
514+
viewModels.splice(currentHistoryItemRefIndex, 0, {
525515
historyItem: outgoingChangesHistoryItem,
526516
kind: 'outgoing-changes',
527517
inputSwimlanes,
528518
outputSwimlanes
529519
});
520+
521+
// Update the input swimlane for the current history item
522+
// ref so that it connects with the outgoing changes node
523+
viewModels[currentHistoryItemRefIndex + 1].inputSwimlanes.push({
524+
id: currentHistoryItemRef.revision,
525+
color: historyItemRefColor
526+
} satisfies ISCMHistoryItemGraphNode);
530527
}
531528
}
532529
}

src/vs/workbench/contrib/scm/test/browser/scmHistory.test.ts

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ suite('toISCMHistoryItemViewModelArray', () => {
603603
* * e(f)
604604
* * f(g)
605605
*/
606-
test.skip('graph with incoming/outgoing changes (remote ref first)', () => {
606+
test('graph with incoming/outgoing changes (remote ref first)', () => {
607607
const models = [
608608
toSCMHistoryItem('a', ['b'], [{ id: 'origin/main', name: 'origin/main' }]),
609609
toSCMHistoryItem('b', ['e']),
@@ -645,51 +645,55 @@ suite('toISCMHistoryItemViewModelArray', () => {
645645
assert.strictEqual(viewModels[1].inputSwimlanes[0].color, historyItemRemoteRefColor);
646646

647647
assert.strictEqual(viewModels[1].outputSwimlanes.length, 1);
648-
assert.strictEqual(viewModels[1].outputSwimlanes[0].id, SCMIncomingHistoryItemId);
648+
assert.strictEqual(viewModels[1].outputSwimlanes[0].id, 'e');
649649
assert.strictEqual(viewModels[1].outputSwimlanes[0].color, historyItemRemoteRefColor);
650650

651-
// incoming changes node
652-
assert.strictEqual(viewModels[2].kind, 'incoming-changes');
651+
// outgoing changes node
652+
assert.strictEqual(viewModels[2].kind, 'outgoing-changes');
653653
assert.strictEqual(viewModels[2].inputSwimlanes.length, 1);
654-
assert.strictEqual(viewModels[2].inputSwimlanes[0].id, SCMIncomingHistoryItemId);
654+
assert.strictEqual(viewModels[2].inputSwimlanes[0].id, 'e');
655655
assert.strictEqual(viewModels[2].inputSwimlanes[0].color, historyItemRemoteRefColor);
656656

657-
assert.strictEqual(viewModels[2].outputSwimlanes.length, 1);
657+
assert.strictEqual(viewModels[2].outputSwimlanes.length, 2);
658658
assert.strictEqual(viewModels[2].outputSwimlanes[0].id, 'e');
659659
assert.strictEqual(viewModels[2].outputSwimlanes[0].color, historyItemRemoteRefColor);
660+
assert.strictEqual(viewModels[2].outputSwimlanes[1].id, 'c');
661+
assert.strictEqual(viewModels[2].outputSwimlanes[1].color, historyItemRefColor);
660662

661-
// outgoing changes node
662-
assert.strictEqual(viewModels[3].kind, 'outgoing-changes');
663-
assert.strictEqual(viewModels[3].inputSwimlanes.length, 1);
663+
// node c
664+
assert.strictEqual(viewModels[3].kind, 'HEAD');
665+
assert.strictEqual(viewModels[3].inputSwimlanes.length, 2);
664666
assert.strictEqual(viewModels[3].inputSwimlanes[0].id, 'e');
665667
assert.strictEqual(viewModels[3].inputSwimlanes[0].color, historyItemRemoteRefColor);
668+
assert.strictEqual(viewModels[3].inputSwimlanes[1].id, 'c');
669+
assert.strictEqual(viewModels[3].inputSwimlanes[1].color, historyItemRefColor);
666670

667671
assert.strictEqual(viewModels[3].outputSwimlanes.length, 2);
668672
assert.strictEqual(viewModels[3].outputSwimlanes[0].id, 'e');
669673
assert.strictEqual(viewModels[3].outputSwimlanes[0].color, historyItemRemoteRefColor);
670-
assert.strictEqual(viewModels[3].outputSwimlanes[1].id, 'c');
674+
assert.strictEqual(viewModels[3].outputSwimlanes[1].id, 'd');
671675
assert.strictEqual(viewModels[3].outputSwimlanes[1].color, historyItemRefColor);
672676

673-
// node c
674-
assert.strictEqual(viewModels[4].kind, 'HEAD');
677+
// node d
678+
assert.strictEqual(viewModels[4].kind, 'node');
675679
assert.strictEqual(viewModels[4].inputSwimlanes.length, 2);
676-
assert.strictEqual(viewModels[4].inputSwimlanes[0].id, 'e');
680+
assert.strictEqual(viewModels[4].inputSwimlanes[0].id, SCMIncomingHistoryItemId);
677681
assert.strictEqual(viewModels[4].inputSwimlanes[0].color, historyItemRemoteRefColor);
678-
assert.strictEqual(viewModels[4].inputSwimlanes[1].id, 'c');
682+
assert.strictEqual(viewModels[4].inputSwimlanes[1].id, 'd');
679683
assert.strictEqual(viewModels[4].inputSwimlanes[1].color, historyItemRefColor);
680684

681685
assert.strictEqual(viewModels[4].outputSwimlanes.length, 2);
682-
assert.strictEqual(viewModels[4].outputSwimlanes[0].id, 'e');
686+
assert.strictEqual(viewModels[4].outputSwimlanes[0].id, SCMIncomingHistoryItemId);
683687
assert.strictEqual(viewModels[4].outputSwimlanes[0].color, historyItemRemoteRefColor);
684-
assert.strictEqual(viewModels[4].outputSwimlanes[1].id, 'd');
688+
assert.strictEqual(viewModels[4].outputSwimlanes[1].id, 'e');
685689
assert.strictEqual(viewModels[4].outputSwimlanes[1].color, historyItemRefColor);
686690

687-
// node d
688-
assert.strictEqual(viewModels[5].kind, 'node');
691+
// incoming changes node
692+
assert.strictEqual(viewModels[5].kind, 'incoming-changes');
689693
assert.strictEqual(viewModels[5].inputSwimlanes.length, 2);
690-
assert.strictEqual(viewModels[5].inputSwimlanes[0].id, 'e');
694+
assert.strictEqual(viewModels[5].inputSwimlanes[0].id, SCMIncomingHistoryItemId);
691695
assert.strictEqual(viewModels[5].inputSwimlanes[0].color, historyItemRemoteRefColor);
692-
assert.strictEqual(viewModels[5].inputSwimlanes[1].id, 'd');
696+
assert.strictEqual(viewModels[5].inputSwimlanes[1].id, 'e');
693697
assert.strictEqual(viewModels[5].inputSwimlanes[1].color, historyItemRefColor);
694698

695699
assert.strictEqual(viewModels[5].outputSwimlanes.length, 2);

0 commit comments

Comments
 (0)