@theia/scm 1.71.0-next.72 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/dirty-diff/dirty-diff-widget.js +1 -1
- package/lib/browser/dirty-diff/dirty-diff-widget.js.map +1 -1
- package/lib/browser/scm-context-key-service.d.ts +6 -0
- package/lib/browser/scm-context-key-service.d.ts.map +1 -1
- package/lib/browser/scm-context-key-service.js +12 -0
- package/lib/browser/scm-context-key-service.js.map +1 -1
- package/lib/browser/scm-contribution.d.ts.map +1 -1
- package/lib/browser/scm-contribution.js +129 -1
- package/lib/browser/scm-contribution.js.map +1 -1
- package/lib/browser/scm-frontend-module.d.ts.map +1 -1
- package/lib/browser/scm-frontend-module.js +14 -0
- package/lib/browser/scm-frontend-module.js.map +1 -1
- package/lib/browser/scm-history-graph-helpers.d.ts +39 -0
- package/lib/browser/scm-history-graph-helpers.d.ts.map +1 -0
- package/lib/browser/scm-history-graph-helpers.js +167 -0
- package/lib/browser/scm-history-graph-helpers.js.map +1 -0
- package/lib/browser/scm-history-graph-lanes.d.ts +59 -0
- package/lib/browser/scm-history-graph-lanes.d.ts.map +1 -0
- package/lib/browser/scm-history-graph-lanes.js +183 -0
- package/lib/browser/scm-history-graph-lanes.js.map +1 -0
- package/lib/browser/scm-history-graph-lanes.spec.d.ts +2 -0
- package/lib/browser/scm-history-graph-lanes.spec.d.ts.map +1 -0
- package/lib/browser/scm-history-graph-lanes.spec.js +554 -0
- package/lib/browser/scm-history-graph-lanes.spec.js.map +1 -0
- package/lib/browser/scm-history-graph-model.d.ts +46 -0
- package/lib/browser/scm-history-graph-model.d.ts.map +1 -0
- package/lib/browser/scm-history-graph-model.js +184 -0
- package/lib/browser/scm-history-graph-model.js.map +1 -0
- package/lib/browser/scm-history-graph-model.spec.d.ts +2 -0
- package/lib/browser/scm-history-graph-model.spec.d.ts.map +1 -0
- package/lib/browser/scm-history-graph-model.spec.js +131 -0
- package/lib/browser/scm-history-graph-model.spec.js.map +1 -0
- package/lib/browser/scm-history-graph-tooltip.d.ts +14 -0
- package/lib/browser/scm-history-graph-tooltip.d.ts.map +1 -0
- package/lib/browser/scm-history-graph-tooltip.js +190 -0
- package/lib/browser/scm-history-graph-tooltip.js.map +1 -0
- package/lib/browser/scm-history-graph-widget.d.ts +77 -0
- package/lib/browser/scm-history-graph-widget.d.ts.map +1 -0
- package/lib/browser/scm-history-graph-widget.js +490 -0
- package/lib/browser/scm-history-graph-widget.js.map +1 -0
- package/lib/browser/scm-provider.d.ts +61 -0
- package/lib/browser/scm-provider.d.ts.map +1 -1
- package/lib/browser/scm-provider.js.map +1 -1
- package/package.json +7 -7
- package/src/browser/dirty-diff/dirty-diff-widget.ts +1 -1
- package/src/browser/scm-context-key-service.ts +18 -0
- package/src/browser/scm-contribution.ts +141 -0
- package/src/browser/scm-frontend-module.ts +15 -0
- package/src/browser/scm-history-graph-helpers.ts +175 -0
- package/src/browser/scm-history-graph-lanes.spec.ts +635 -0
- package/src/browser/scm-history-graph-lanes.ts +258 -0
- package/src/browser/scm-history-graph-model.spec.ts +171 -0
- package/src/browser/scm-history-graph-model.ts +207 -0
- package/src/browser/scm-history-graph-tooltip.ts +213 -0
- package/src/browser/scm-history-graph-widget.tsx +712 -0
- package/src/browser/scm-provider.ts +68 -0
- package/src/browser/style/index.css +12 -13
- package/src/browser/style/scm-history-graph.css +313 -0
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 EclipseSource GmbH and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const chai_1 = require("chai");
|
|
19
|
+
const scm_history_graph_lanes_1 = require("./scm-history-graph-lanes");
|
|
20
|
+
describe('computeGraphRows', () => {
|
|
21
|
+
function lanes(commits) {
|
|
22
|
+
return (0, scm_history_graph_lanes_1.computeGraphRows)(commits).map(r => r.lane);
|
|
23
|
+
}
|
|
24
|
+
// -------------------------------------------------------------------------
|
|
25
|
+
// Linear history
|
|
26
|
+
// -------------------------------------------------------------------------
|
|
27
|
+
describe('linear history', () => {
|
|
28
|
+
const commits = [
|
|
29
|
+
{ id: 'C', parentIds: ['B'] },
|
|
30
|
+
{ id: 'B', parentIds: ['A'] },
|
|
31
|
+
{ id: 'A', parentIds: [] },
|
|
32
|
+
];
|
|
33
|
+
it('all commits stay in lane 0', () => {
|
|
34
|
+
(0, chai_1.expect)(lanes(commits)).to.deep.equal([0, 0, 0]);
|
|
35
|
+
});
|
|
36
|
+
it('colors are all 0', () => {
|
|
37
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
38
|
+
(0, chai_1.expect)(rows.map(r => r.color)).to.deep.equal([0, 0, 0]);
|
|
39
|
+
});
|
|
40
|
+
it('first parent same-lane continuation emits no separate edge (handled by commit line)', () => {
|
|
41
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
42
|
+
// Row 0 (C): first parent B is in the same lane — no edge emitted
|
|
43
|
+
// Only pass-through edges from other lanes (none here) are emitted
|
|
44
|
+
const edgesC = rows[0].edges.filter(e => e.fromLane === 0 && e.toLane === 0);
|
|
45
|
+
(0, chai_1.expect)(edgesC.length).to.equal(0);
|
|
46
|
+
});
|
|
47
|
+
it('root commit (A) emits no edges', () => {
|
|
48
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
49
|
+
(0, chai_1.expect)(rows[2].edges).to.be.empty;
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
// -------------------------------------------------------------------------
|
|
53
|
+
// Single branch + merge
|
|
54
|
+
// -------------------------------------------------------------------------
|
|
55
|
+
describe('branch and merge', () => {
|
|
56
|
+
// M ← merge commit (parents: D, E)
|
|
57
|
+
// |\
|
|
58
|
+
// D E ← two parallel commits
|
|
59
|
+
// | |
|
|
60
|
+
// B B (same B — E's parent is B too)
|
|
61
|
+
// \ |
|
|
62
|
+
// B
|
|
63
|
+
// |
|
|
64
|
+
// A
|
|
65
|
+
//
|
|
66
|
+
// Topological order (newest first): M, D, E, B, A
|
|
67
|
+
const commits = [
|
|
68
|
+
{ id: 'M', parentIds: ['D', 'E'] },
|
|
69
|
+
{ id: 'D', parentIds: ['B'] },
|
|
70
|
+
{ id: 'E', parentIds: ['B'] },
|
|
71
|
+
{ id: 'B', parentIds: ['A'] },
|
|
72
|
+
{ id: 'A', parentIds: [] },
|
|
73
|
+
];
|
|
74
|
+
it('merge commit M is in lane 0', () => {
|
|
75
|
+
(0, chai_1.expect)(lanes(commits)[0]).to.equal(0);
|
|
76
|
+
});
|
|
77
|
+
it('D (first parent) stays in lane 0', () => {
|
|
78
|
+
(0, chai_1.expect)(lanes(commits)[1]).to.equal(0);
|
|
79
|
+
});
|
|
80
|
+
it('E (second parent) is in a different lane', () => {
|
|
81
|
+
(0, chai_1.expect)(lanes(commits)[2]).to.not.equal(0);
|
|
82
|
+
});
|
|
83
|
+
it('B and A eventually converge back to lane 0', () => {
|
|
84
|
+
const ls = lanes(commits);
|
|
85
|
+
// B must be in lane 0 (first parent chain)
|
|
86
|
+
(0, chai_1.expect)(ls[3]).to.equal(0);
|
|
87
|
+
// A also stays in lane 0
|
|
88
|
+
(0, chai_1.expect)(ls[4]).to.equal(0);
|
|
89
|
+
});
|
|
90
|
+
it('M emits a branch-out edge for second parent E', () => {
|
|
91
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
92
|
+
const mEdges = rows[0].edges;
|
|
93
|
+
// Branch-out: from commit lane 0 to E's new lane
|
|
94
|
+
const branchOut = mEdges.filter(e => e.type === 'branch-out' && e.fromLane === 0);
|
|
95
|
+
(0, chai_1.expect)(branchOut.length).to.be.greaterThan(0);
|
|
96
|
+
});
|
|
97
|
+
it('M does not emit a merge-in edge (no existing lane converges into M)', () => {
|
|
98
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
99
|
+
const mEdges = rows[0].edges;
|
|
100
|
+
const mergeIn = mEdges.filter(e => e.type === 'merge-in');
|
|
101
|
+
(0, chai_1.expect)(mergeIn.length).to.equal(0);
|
|
102
|
+
});
|
|
103
|
+
it('E emits a merge-in edge (E parent B is already in lane 0)', () => {
|
|
104
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
105
|
+
// E is at index 2, in lane 1; its parent B is already in lane 0.
|
|
106
|
+
// merge-in edge: fromLane=0 (B's lane), toLane=1 (E's commit lane)
|
|
107
|
+
const eRow = rows[2];
|
|
108
|
+
const eEdges = eRow.edges;
|
|
109
|
+
const mergeIn = eEdges.filter(e => e.type === 'merge-in' && e.fromLane === 0 && e.toLane === eRow.lane);
|
|
110
|
+
(0, chai_1.expect)(mergeIn.length).to.be.greaterThan(0);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
// -------------------------------------------------------------------------
|
|
114
|
+
// Parallel independent branches
|
|
115
|
+
// -------------------------------------------------------------------------
|
|
116
|
+
describe('parallel independent branches', () => {
|
|
117
|
+
// Two completely independent branches interleaved in the list.
|
|
118
|
+
// Newest first: A2, B2, A1, B1
|
|
119
|
+
// A2 and A1 are on one branch, B2 and B1 on another.
|
|
120
|
+
const commits = [
|
|
121
|
+
{ id: 'A2', parentIds: ['A1'] },
|
|
122
|
+
{ id: 'B2', parentIds: ['B1'] },
|
|
123
|
+
{ id: 'A1', parentIds: [] },
|
|
124
|
+
{ id: 'B1', parentIds: [] },
|
|
125
|
+
];
|
|
126
|
+
it('A2 is in lane 0', () => {
|
|
127
|
+
(0, chai_1.expect)(lanes(commits)[0]).to.equal(0);
|
|
128
|
+
});
|
|
129
|
+
it('B2 is in a different lane from A2', () => {
|
|
130
|
+
const ls = lanes(commits);
|
|
131
|
+
(0, chai_1.expect)(ls[1]).to.not.equal(ls[0]);
|
|
132
|
+
});
|
|
133
|
+
it('A1 is in lane 0 (continues A2 branch)', () => {
|
|
134
|
+
(0, chai_1.expect)(lanes(commits)[2]).to.equal(0);
|
|
135
|
+
});
|
|
136
|
+
it('B1 continues in the same lane as B2', () => {
|
|
137
|
+
const ls = lanes(commits);
|
|
138
|
+
(0, chai_1.expect)(ls[3]).to.equal(ls[1]);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
// -------------------------------------------------------------------------
|
|
142
|
+
// Octopus merge (3 parents)
|
|
143
|
+
// -------------------------------------------------------------------------
|
|
144
|
+
describe('octopus merge', () => {
|
|
145
|
+
// O merges P1, P2, P3
|
|
146
|
+
// O, P1, P2, P3
|
|
147
|
+
const commits = [
|
|
148
|
+
{ id: 'O', parentIds: ['P1', 'P2', 'P3'] },
|
|
149
|
+
{ id: 'P1', parentIds: [] },
|
|
150
|
+
{ id: 'P2', parentIds: [] },
|
|
151
|
+
{ id: 'P3', parentIds: [] },
|
|
152
|
+
];
|
|
153
|
+
it('O is in lane 0', () => {
|
|
154
|
+
(0, chai_1.expect)(lanes(commits)[0]).to.equal(0);
|
|
155
|
+
});
|
|
156
|
+
it('P1 is in lane 0 (first parent)', () => {
|
|
157
|
+
(0, chai_1.expect)(lanes(commits)[1]).to.equal(0);
|
|
158
|
+
});
|
|
159
|
+
it('P2 is in a distinct lane', () => {
|
|
160
|
+
const ls = lanes(commits);
|
|
161
|
+
(0, chai_1.expect)(ls[2]).to.not.equal(0);
|
|
162
|
+
});
|
|
163
|
+
it('P3 is in a distinct lane different from P2', () => {
|
|
164
|
+
const ls = lanes(commits);
|
|
165
|
+
(0, chai_1.expect)(ls[3]).to.not.equal(ls[2]);
|
|
166
|
+
});
|
|
167
|
+
it('O emits 2 branch-out edges (for P2 and P3; P1 same-lane has no edge)', () => {
|
|
168
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
169
|
+
const oEdges = rows[0].edges.filter(e => e.type === 'branch-out');
|
|
170
|
+
(0, chai_1.expect)(oEdges.length).to.equal(2);
|
|
171
|
+
});
|
|
172
|
+
it('O emits no merge-in edges (no existing lanes converge into O)', () => {
|
|
173
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
174
|
+
const mergeIn = rows[0].edges.filter(e => e.type === 'merge-in');
|
|
175
|
+
(0, chai_1.expect)(mergeIn.length).to.equal(0);
|
|
176
|
+
});
|
|
177
|
+
it('lane colors are correct modulo 8', () => {
|
|
178
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
179
|
+
rows.forEach(r => (0, chai_1.expect)(r.color).to.equal(r.lane % 8));
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
// -------------------------------------------------------------------------
|
|
183
|
+
// Root commit with no parents
|
|
184
|
+
// -------------------------------------------------------------------------
|
|
185
|
+
describe('single root commit', () => {
|
|
186
|
+
const commits = [{ id: 'R', parentIds: [] }];
|
|
187
|
+
it('is placed in lane 0', () => {
|
|
188
|
+
(0, chai_1.expect)(lanes(commits)).to.deep.equal([0]);
|
|
189
|
+
});
|
|
190
|
+
it('emits no edges', () => {
|
|
191
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
192
|
+
(0, chai_1.expect)(rows[0].edges).to.be.empty;
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
// -------------------------------------------------------------------------
|
|
196
|
+
// Empty input
|
|
197
|
+
// -------------------------------------------------------------------------
|
|
198
|
+
describe('empty input', () => {
|
|
199
|
+
it('returns an empty array', () => {
|
|
200
|
+
(0, chai_1.expect)((0, scm_history_graph_lanes_1.computeGraphRows)([])).to.deep.equal([]);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
// -------------------------------------------------------------------------
|
|
204
|
+
// hasContinuation and hasTopLine
|
|
205
|
+
// -------------------------------------------------------------------------
|
|
206
|
+
describe('hasContinuation and hasTopLine', () => {
|
|
207
|
+
describe('linear history', () => {
|
|
208
|
+
const commits = [
|
|
209
|
+
{ id: 'C', parentIds: ['B'] },
|
|
210
|
+
{ id: 'B', parentIds: ['A'] },
|
|
211
|
+
{ id: 'A', parentIds: [] },
|
|
212
|
+
];
|
|
213
|
+
it('first (newest/HEAD) commit has hasContinuation:true, hasTopLine:false', () => {
|
|
214
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
215
|
+
(0, chai_1.expect)(rows[0].hasContinuation).to.equal(true);
|
|
216
|
+
(0, chai_1.expect)(rows[0].hasTopLine).to.equal(false);
|
|
217
|
+
});
|
|
218
|
+
it('middle commit has hasContinuation:true, hasTopLine:true', () => {
|
|
219
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
220
|
+
(0, chai_1.expect)(rows[1].hasContinuation).to.equal(true);
|
|
221
|
+
(0, chai_1.expect)(rows[1].hasTopLine).to.equal(true);
|
|
222
|
+
});
|
|
223
|
+
it('root (oldest) commit has hasContinuation:false, hasTopLine:true', () => {
|
|
224
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
225
|
+
(0, chai_1.expect)(rows[2].hasContinuation).to.equal(false);
|
|
226
|
+
(0, chai_1.expect)(rows[2].hasTopLine).to.equal(true);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe('branch-and-merge', () => {
|
|
230
|
+
// Topology: E (lane 1, parent B already in lane 0) — the merge
|
|
231
|
+
// convergence commit whose lane is freed after it is rendered.
|
|
232
|
+
//
|
|
233
|
+
// M (lane 0, parents: D, E)
|
|
234
|
+
// |\
|
|
235
|
+
// D E (D lane 0, E lane 1)
|
|
236
|
+
// | /
|
|
237
|
+
// B (lane 0)
|
|
238
|
+
// |
|
|
239
|
+
// A (lane 0)
|
|
240
|
+
const commits = [
|
|
241
|
+
{ id: 'M', parentIds: ['D', 'E'] },
|
|
242
|
+
{ id: 'D', parentIds: ['B'] },
|
|
243
|
+
{ id: 'E', parentIds: ['B'] },
|
|
244
|
+
{ id: 'B', parentIds: ['A'] },
|
|
245
|
+
{ id: 'A', parentIds: [] },
|
|
246
|
+
];
|
|
247
|
+
it('merge commit E (whose parent B is already in lane 0) has hasContinuation:false, hasTopLine:true', () => {
|
|
248
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
249
|
+
// E is at index 2; its first parent B is already in lane 0,
|
|
250
|
+
// so its own lane is freed — hasContinuation must be false.
|
|
251
|
+
// E was reserved as a parent by M, so hasTopLine must be true.
|
|
252
|
+
(0, chai_1.expect)(rows[2].hasContinuation).to.equal(false);
|
|
253
|
+
(0, chai_1.expect)(rows[2].hasTopLine).to.equal(true);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('single root commit (no parents)', () => {
|
|
257
|
+
it('has hasContinuation:false, hasTopLine:false', () => {
|
|
258
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)([{ id: 'R', parentIds: [] }]);
|
|
259
|
+
(0, chai_1.expect)(rows[0].hasContinuation).to.equal(false);
|
|
260
|
+
(0, chai_1.expect)(rows[0].hasTopLine).to.equal(false);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
// -------------------------------------------------------------------------
|
|
265
|
+
// Lane freeing on merge convergence
|
|
266
|
+
// -------------------------------------------------------------------------
|
|
267
|
+
describe('lane freeing on merge convergence', () => {
|
|
268
|
+
// Topology: M→D,E → B → A
|
|
269
|
+
//
|
|
270
|
+
// M (lane 0, parents: D, E)
|
|
271
|
+
// |\
|
|
272
|
+
// D E (D in lane 0, E in lane 1)
|
|
273
|
+
// | /
|
|
274
|
+
// B (lane 0 — E's parent B is already tracked in lane 0)
|
|
275
|
+
// |
|
|
276
|
+
// A (lane 0)
|
|
277
|
+
//
|
|
278
|
+
// After rendering E (lane 1, parent B already in lane 0), lane 1 must
|
|
279
|
+
// be freed so that subsequent commits can reuse it.
|
|
280
|
+
const commits = [
|
|
281
|
+
{ id: 'M', parentIds: ['D', 'E'] },
|
|
282
|
+
{ id: 'D', parentIds: ['B'] },
|
|
283
|
+
{ id: 'E', parentIds: ['B'] },
|
|
284
|
+
{ id: 'B', parentIds: ['A'] },
|
|
285
|
+
{ id: 'A', parentIds: [] },
|
|
286
|
+
];
|
|
287
|
+
it('E is placed in lane 1', () => {
|
|
288
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
289
|
+
(0, chai_1.expect)(rows[2].lane).to.equal(1); // E
|
|
290
|
+
});
|
|
291
|
+
it('B is in lane 0 (converges back after E)', () => {
|
|
292
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
293
|
+
(0, chai_1.expect)(rows[3].lane).to.equal(0); // B
|
|
294
|
+
});
|
|
295
|
+
it('A is in lane 0', () => {
|
|
296
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
297
|
+
(0, chai_1.expect)(rows[4].lane).to.equal(0); // A
|
|
298
|
+
});
|
|
299
|
+
it('lane 1 is freed after E — B row has no pass-through edge for lane 1', () => {
|
|
300
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
301
|
+
// Row for B (index 3): there should be no pass-through edge that
|
|
302
|
+
// goes from lane 1 to lane 1, because E has already been rendered
|
|
303
|
+
// and its lane should have been freed.
|
|
304
|
+
const bRow = rows[3];
|
|
305
|
+
const spuriousEdge = bRow.edges.find(e => e.fromLane === 1 && e.toLane === 1);
|
|
306
|
+
(0, chai_1.expect)(spuriousEdge).to.be.undefined;
|
|
307
|
+
});
|
|
308
|
+
it('lane 1 is reusable after E — new branch between B and A uses lane 1', () => {
|
|
309
|
+
// Insert an independent branch X→Y between B and A so that at the
|
|
310
|
+
// point X is processed, lane 0 is still occupied by 'A' (B's
|
|
311
|
+
// parent). Lane 1 must have been freed after E, so X should
|
|
312
|
+
// occupy lane 1 rather than opening a new lane 2.
|
|
313
|
+
const commitsWithExtra = [
|
|
314
|
+
{ id: 'M', parentIds: ['D', 'E'] },
|
|
315
|
+
{ id: 'D', parentIds: ['B'] },
|
|
316
|
+
{ id: 'E', parentIds: ['B'] },
|
|
317
|
+
{ id: 'B', parentIds: ['A'] },
|
|
318
|
+
// X is an independent commit whose parent Y hasn't appeared
|
|
319
|
+
// yet. At this point lane 0 holds 'A', lane 1 was freed after
|
|
320
|
+
// E — so X should claim lane 1.
|
|
321
|
+
{ id: 'X', parentIds: ['Y'] },
|
|
322
|
+
{ id: 'A', parentIds: [] },
|
|
323
|
+
{ id: 'Y', parentIds: [] },
|
|
324
|
+
];
|
|
325
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commitsWithExtra);
|
|
326
|
+
// X (index 4) should reuse the freed lane 1 rather than lane 2.
|
|
327
|
+
(0, chai_1.expect)(rows[4].lane).to.equal(1);
|
|
328
|
+
});
|
|
329
|
+
it('E emits a merge-in edge from lane 0 into E\'s commit lane (B already in lane 0)', () => {
|
|
330
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
331
|
+
// E is at index 2, in lane 1; B is in lane 0.
|
|
332
|
+
// merge-in edge: fromLane=0 (B's existing lane), toLane=1 (E's commit lane)
|
|
333
|
+
const eRow = rows[2];
|
|
334
|
+
const eEdges = eRow.edges;
|
|
335
|
+
const mergeIn = eEdges.filter(e => e.type === 'merge-in' && e.fromLane === 0 && e.toLane === eRow.lane);
|
|
336
|
+
(0, chai_1.expect)(mergeIn.length).to.equal(1);
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
// -------------------------------------------------------------------------
|
|
340
|
+
// Lane color wraps at 8
|
|
341
|
+
// -------------------------------------------------------------------------
|
|
342
|
+
describe('color wrapping', () => {
|
|
343
|
+
it('lane color is always lane % 8', () => {
|
|
344
|
+
// 4 parallel chains so we have lanes 0, 1, 2, 3 occupied at once.
|
|
345
|
+
// Chain structure: X0→X1→X2, Y0→Y1→Y2, etc., interleaved.
|
|
346
|
+
const commits = [
|
|
347
|
+
{ id: 'X0', parentIds: ['X1'] },
|
|
348
|
+
{ id: 'Y0', parentIds: ['Y1'] },
|
|
349
|
+
{ id: 'Z0', parentIds: ['Z1'] },
|
|
350
|
+
{ id: 'W0', parentIds: ['W1'] },
|
|
351
|
+
{ id: 'X1', parentIds: [] },
|
|
352
|
+
{ id: 'Y1', parentIds: [] },
|
|
353
|
+
{ id: 'Z1', parentIds: [] },
|
|
354
|
+
{ id: 'W1', parentIds: [] },
|
|
355
|
+
];
|
|
356
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
357
|
+
// Every row's color must equal lane % 8
|
|
358
|
+
rows.forEach(r => (0, chai_1.expect)(r.color).to.equal(r.lane % 8));
|
|
359
|
+
});
|
|
360
|
+
it('assigns distinct lanes to 8 simultaneous branches', () => {
|
|
361
|
+
// 8 independent commits whose parents haven't been seen yet
|
|
362
|
+
const commits = [
|
|
363
|
+
{ id: 'A', parentIds: ['a'] },
|
|
364
|
+
{ id: 'B', parentIds: ['b'] },
|
|
365
|
+
{ id: 'C', parentIds: ['c'] },
|
|
366
|
+
{ id: 'D', parentIds: ['d'] },
|
|
367
|
+
{ id: 'E', parentIds: ['e'] },
|
|
368
|
+
{ id: 'F', parentIds: ['f'] },
|
|
369
|
+
{ id: 'G', parentIds: ['g'] },
|
|
370
|
+
{ id: 'H', parentIds: ['h'] },
|
|
371
|
+
];
|
|
372
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
373
|
+
const laneSet = new Set(rows.map(r => r.lane));
|
|
374
|
+
(0, chai_1.expect)(laneSet.size).to.equal(8); // all distinct lanes
|
|
375
|
+
// Color of lane 7 is 7, lane 0 is 0
|
|
376
|
+
const lane7 = rows.find(r => r.lane === 7);
|
|
377
|
+
(0, chai_1.expect)(lane7).to.not.be.undefined;
|
|
378
|
+
(0, chai_1.expect)(lane7.color).to.equal(7);
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
// -------------------------------------------------------------------------
|
|
382
|
+
// Edge type correctness
|
|
383
|
+
// -------------------------------------------------------------------------
|
|
384
|
+
describe('edge types', () => {
|
|
385
|
+
it('pass-through edges have fromLane === toLane', () => {
|
|
386
|
+
const commits = [
|
|
387
|
+
{ id: 'A', parentIds: ['a'] },
|
|
388
|
+
{ id: 'B', parentIds: ['b'] },
|
|
389
|
+
{ id: 'C', parentIds: ['c'] },
|
|
390
|
+
];
|
|
391
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
392
|
+
// Row for B (index 1): A's lane (0) passes through as pass-through
|
|
393
|
+
const bPassThrough = rows[1].edges.filter(e => e.type === 'pass-through');
|
|
394
|
+
bPassThrough.forEach(e => (0, chai_1.expect)(e.fromLane).to.equal(e.toLane));
|
|
395
|
+
});
|
|
396
|
+
it('branch-out edges have fromLane equal to commit lane', () => {
|
|
397
|
+
const commits = [
|
|
398
|
+
{ id: 'M', parentIds: ['D', 'E'] },
|
|
399
|
+
{ id: 'D', parentIds: [] },
|
|
400
|
+
{ id: 'E', parentIds: [] },
|
|
401
|
+
];
|
|
402
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
403
|
+
const mRow = rows[0];
|
|
404
|
+
const branchOut = mRow.edges.filter(e => e.type === 'branch-out');
|
|
405
|
+
branchOut.forEach(e => (0, chai_1.expect)(e.fromLane).to.equal(mRow.lane));
|
|
406
|
+
});
|
|
407
|
+
it('merge-in edges have toLane equal to commit lane', () => {
|
|
408
|
+
// M (lane 0) parents: D (lane 0, new), E (lane 1, new)
|
|
409
|
+
// E (lane 1) parent: B (already in lane 0 from D)
|
|
410
|
+
const commits2 = [
|
|
411
|
+
{ id: 'M', parentIds: ['D', 'E'] },
|
|
412
|
+
{ id: 'D', parentIds: ['B'] },
|
|
413
|
+
{ id: 'E', parentIds: ['B'] }, // B already in lane 0
|
|
414
|
+
{ id: 'B', parentIds: [] },
|
|
415
|
+
];
|
|
416
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits2);
|
|
417
|
+
const eRow = rows[2]; // E
|
|
418
|
+
const mergeIn = eRow.edges.filter(e => e.type === 'merge-in');
|
|
419
|
+
// toLane of merge-in must equal the commit's own lane
|
|
420
|
+
mergeIn.forEach(e => (0, chai_1.expect)(e.toLane).to.equal(eRow.lane));
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
// -------------------------------------------------------------------------
|
|
424
|
+
// Sibling branches (branch tips sharing the same parent)
|
|
425
|
+
// -------------------------------------------------------------------------
|
|
426
|
+
describe('sibling branches sharing the same parent', () => {
|
|
427
|
+
// Two branch tips that were NOT pre-reserved, both pointing at the same
|
|
428
|
+
// parent P. This mirrors the real-world case where two refs (e.g. HEAD
|
|
429
|
+
// and origin/HEAD) diverge from a common ancestor:
|
|
430
|
+
//
|
|
431
|
+
// A (lane 0, parent P) ← branch tip, not pre-reserved
|
|
432
|
+
// B (lane 1, parent P) ← sibling branch tip, not pre-reserved
|
|
433
|
+
// P (lane 0, parent Q) ← common parent
|
|
434
|
+
// Q (lane 0) ← root
|
|
435
|
+
const commits = [
|
|
436
|
+
{ id: 'A', parentIds: ['P'] },
|
|
437
|
+
{ id: 'B', parentIds: ['P'] },
|
|
438
|
+
{ id: 'P', parentIds: ['Q'] },
|
|
439
|
+
{ id: 'Q', parentIds: [] },
|
|
440
|
+
];
|
|
441
|
+
it('A is placed in lane 0', () => {
|
|
442
|
+
(0, chai_1.expect)((0, scm_history_graph_lanes_1.computeGraphRows)(commits)[0].lane).to.equal(0);
|
|
443
|
+
});
|
|
444
|
+
it('B is placed in lane 1 (sibling gets new lane)', () => {
|
|
445
|
+
(0, chai_1.expect)((0, scm_history_graph_lanes_1.computeGraphRows)(commits)[1].lane).to.equal(1);
|
|
446
|
+
});
|
|
447
|
+
it('P converges back to lane 0', () => {
|
|
448
|
+
(0, chai_1.expect)((0, scm_history_graph_lanes_1.computeGraphRows)(commits)[2].lane).to.equal(0);
|
|
449
|
+
});
|
|
450
|
+
it('A row (row 0) emits NO branch-out edges (siblings are not connected to each other)', () => {
|
|
451
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
452
|
+
const aEdges = rows[0].edges;
|
|
453
|
+
const branchOut = aEdges.filter(e => e.type === 'branch-out');
|
|
454
|
+
(0, chai_1.expect)(branchOut.length).to.equal(0);
|
|
455
|
+
});
|
|
456
|
+
it('B row (row 1) has hasTopLine:false (lane starts fresh, no connection from above)', () => {
|
|
457
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
458
|
+
(0, chai_1.expect)(rows[1].hasTopLine).to.equal(false);
|
|
459
|
+
});
|
|
460
|
+
it('B row (row 1) has hasContinuation:true (lane continues as pass-through to parent P at row 2)', () => {
|
|
461
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
462
|
+
(0, chai_1.expect)(rows[1].hasContinuation).to.equal(true);
|
|
463
|
+
});
|
|
464
|
+
it('B row (row 1) does NOT emit a merge-in edge', () => {
|
|
465
|
+
// A merge-in on B\'s row would mean "a top-of-row line curves into B\'s
|
|
466
|
+
// circle", which is wrong since B was not pre-reserved.
|
|
467
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
468
|
+
const mergeIn = rows[1].edges.filter(e => e.type === 'merge-in');
|
|
469
|
+
(0, chai_1.expect)(mergeIn.length).to.equal(0);
|
|
470
|
+
});
|
|
471
|
+
it('A row (row 0) has hasTopLine:false (A was not pre-reserved)', () => {
|
|
472
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
473
|
+
(0, chai_1.expect)(rows[0].hasTopLine).to.equal(false);
|
|
474
|
+
});
|
|
475
|
+
it('P row (row 2) has hasTopLine:true (continuing from A\'s lane)', () => {
|
|
476
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
477
|
+
(0, chai_1.expect)(rows[2].hasTopLine).to.equal(true);
|
|
478
|
+
});
|
|
479
|
+
it('B row (row 1) has a pass-through edge for lane 0', () => {
|
|
480
|
+
// Lane 0 (pointing at P) continues as a pass-through through B\'s row.
|
|
481
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
482
|
+
const passThrough = rows[1].edges.find(e => e.type === 'pass-through' && e.fromLane === 0 && e.toLane === 0);
|
|
483
|
+
(0, chai_1.expect)(passThrough).to.not.be.undefined;
|
|
484
|
+
});
|
|
485
|
+
it('P row (row 2) has a merge-in edge from lane 1', () => {
|
|
486
|
+
// Lane 1 (kept alive through B) converges into P\'s lane 0 with a merge-in.
|
|
487
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
488
|
+
const mergeIn = rows[2].edges.find(e => e.type === 'merge-in' && e.fromLane === 1 && e.toLane === 0);
|
|
489
|
+
(0, chai_1.expect)(mergeIn).to.not.be.undefined;
|
|
490
|
+
});
|
|
491
|
+
it('P row (row 2) has no pass-through for lane 1 (lane 1 is freed at P)', () => {
|
|
492
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
493
|
+
const spurious = rows[2].edges.find(e => e.fromLane === 1 && e.toLane === 1 && e.type === 'pass-through');
|
|
494
|
+
(0, chai_1.expect)(spurious).to.be.undefined;
|
|
495
|
+
});
|
|
496
|
+
});
|
|
497
|
+
// -------------------------------------------------------------------------
|
|
498
|
+
// Three sibling branches sharing the same parent
|
|
499
|
+
// -------------------------------------------------------------------------
|
|
500
|
+
describe('three sibling branches sharing the same parent', () => {
|
|
501
|
+
// A, B, C all have parent P and none were pre-reserved.
|
|
502
|
+
// Rows: A(lane0), B(lane1), C(lane2), P(lane0), ...
|
|
503
|
+
const commits = [
|
|
504
|
+
{ id: 'A', parentIds: ['P'] },
|
|
505
|
+
{ id: 'B', parentIds: ['P'] },
|
|
506
|
+
{ id: 'C', parentIds: ['P'] },
|
|
507
|
+
{ id: 'P', parentIds: [] },
|
|
508
|
+
];
|
|
509
|
+
it('A is lane 0', () => {
|
|
510
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
511
|
+
(0, chai_1.expect)(rows[0].lane).to.equal(0);
|
|
512
|
+
});
|
|
513
|
+
it('B is lane 1', () => {
|
|
514
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
515
|
+
(0, chai_1.expect)(rows[1].lane).to.equal(1);
|
|
516
|
+
});
|
|
517
|
+
it('C is in a lane other than lane 0', () => {
|
|
518
|
+
// C is a sibling tip; its lane is re-assigned from freed lanes
|
|
519
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
520
|
+
(0, chai_1.expect)(rows[2].lane).to.not.equal(0);
|
|
521
|
+
});
|
|
522
|
+
it('A row emits NO branch-out edges (siblings are not connected to each other)', () => {
|
|
523
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
524
|
+
const branchOuts = rows[0].edges.filter(e => e.type === 'branch-out');
|
|
525
|
+
(0, chai_1.expect)(branchOuts.length).to.equal(0);
|
|
526
|
+
});
|
|
527
|
+
it('B row emits NO branch-out edges', () => {
|
|
528
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
529
|
+
const branchOuts = rows[1].edges.filter(e => e.type === 'branch-out');
|
|
530
|
+
(0, chai_1.expect)(branchOuts.length).to.equal(0);
|
|
531
|
+
});
|
|
532
|
+
it('B and C rows both have hasTopLine:false (lanes start fresh, no connection from above)', () => {
|
|
533
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
534
|
+
(0, chai_1.expect)(rows[1].hasTopLine).to.equal(false);
|
|
535
|
+
(0, chai_1.expect)(rows[2].hasTopLine).to.equal(false);
|
|
536
|
+
});
|
|
537
|
+
it('B and C rows have no merge-in edges', () => {
|
|
538
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
539
|
+
(0, chai_1.expect)(rows[1].edges.filter(e => e.type === 'merge-in').length).to.equal(0);
|
|
540
|
+
(0, chai_1.expect)(rows[2].edges.filter(e => e.type === 'merge-in').length).to.equal(0);
|
|
541
|
+
});
|
|
542
|
+
it('P row has merge-in edges from both B\'s lane and C\'s lane', () => {
|
|
543
|
+
const rows = (0, scm_history_graph_lanes_1.computeGraphRows)(commits);
|
|
544
|
+
// P is at index 3, in lane 0. Both lane 1 (B) and lane 2 (C) must
|
|
545
|
+
// converge into P with merge-in edges.
|
|
546
|
+
const pRow = rows[3];
|
|
547
|
+
const mergeInFromLane1 = pRow.edges.find(e => e.type === 'merge-in' && e.fromLane === rows[1].lane && e.toLane === pRow.lane);
|
|
548
|
+
const mergeInFromLane2 = pRow.edges.find(e => e.type === 'merge-in' && e.fromLane === rows[2].lane && e.toLane === pRow.lane);
|
|
549
|
+
(0, chai_1.expect)(mergeInFromLane1).to.not.be.undefined;
|
|
550
|
+
(0, chai_1.expect)(mergeInFromLane2).to.not.be.undefined;
|
|
551
|
+
});
|
|
552
|
+
});
|
|
553
|
+
});
|
|
554
|
+
//# sourceMappingURL=scm-history-graph-lanes.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scm-history-graph-lanes.spec.js","sourceRoot":"","sources":["../../src/browser/scm-history-graph-lanes.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
2
|
+
import { Emitter } from '@theia/core/lib/common/event';
|
|
3
|
+
import { CancellationTokenSource } from '@theia/core/lib/common/cancellation';
|
|
4
|
+
import { ScmService } from './scm-service';
|
|
5
|
+
import { ScmHistoryItem, ScmHistoryProvider } from './scm-provider';
|
|
6
|
+
import { GraphRow } from './scm-history-graph-lanes';
|
|
7
|
+
export declare const PAGE_SIZE = 50;
|
|
8
|
+
export interface HistoryGraphEntry {
|
|
9
|
+
readonly item: ScmHistoryItem;
|
|
10
|
+
readonly graphRow: GraphRow;
|
|
11
|
+
}
|
|
12
|
+
export declare class ScmHistoryGraphModel {
|
|
13
|
+
protected readonly scmService: ScmService;
|
|
14
|
+
protected readonly toDispose: DisposableCollection;
|
|
15
|
+
protected readonly toDisposeOnProviderChange: DisposableCollection;
|
|
16
|
+
protected _entries: HistoryGraphEntry[];
|
|
17
|
+
protected _hasMore: boolean;
|
|
18
|
+
protected _loading: boolean;
|
|
19
|
+
protected _hasAttemptedLoad: boolean;
|
|
20
|
+
protected _provider: ScmHistoryProvider | undefined;
|
|
21
|
+
protected readonly onDidChangeEmitter: Emitter<void>;
|
|
22
|
+
readonly onDidChange: import("@theia/core/lib/common/event").Event<void>;
|
|
23
|
+
protected cancelSource: CancellationTokenSource;
|
|
24
|
+
protected init(): void;
|
|
25
|
+
dispose(): void;
|
|
26
|
+
get provider(): ScmHistoryProvider | undefined;
|
|
27
|
+
get entries(): readonly HistoryGraphEntry[];
|
|
28
|
+
get hasMore(): boolean;
|
|
29
|
+
get loading(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Returns true once the model has completed at least one load attempt
|
|
32
|
+
* (regardless of whether history items were found). This is used by
|
|
33
|
+
* the widget to distinguish "still initializing" from "no history".
|
|
34
|
+
*/
|
|
35
|
+
get hasAttemptedLoad(): boolean;
|
|
36
|
+
refresh(): void;
|
|
37
|
+
loadMore(): Promise<void>;
|
|
38
|
+
protected loadPage(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Returns the revisions of the current branch ref, its remote tracking ref,
|
|
41
|
+
* and the merge-base ref to pass to `provideHistoryItems`. Providers walk
|
|
42
|
+
* history starting from these revisions.
|
|
43
|
+
*/
|
|
44
|
+
protected getCurrentHistoryItemRefs(): string[];
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=scm-history-graph-model.d.ts.map
|