@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.
Files changed (58) hide show
  1. package/lib/browser/dirty-diff/dirty-diff-widget.js +1 -1
  2. package/lib/browser/dirty-diff/dirty-diff-widget.js.map +1 -1
  3. package/lib/browser/scm-context-key-service.d.ts +6 -0
  4. package/lib/browser/scm-context-key-service.d.ts.map +1 -1
  5. package/lib/browser/scm-context-key-service.js +12 -0
  6. package/lib/browser/scm-context-key-service.js.map +1 -1
  7. package/lib/browser/scm-contribution.d.ts.map +1 -1
  8. package/lib/browser/scm-contribution.js +129 -1
  9. package/lib/browser/scm-contribution.js.map +1 -1
  10. package/lib/browser/scm-frontend-module.d.ts.map +1 -1
  11. package/lib/browser/scm-frontend-module.js +14 -0
  12. package/lib/browser/scm-frontend-module.js.map +1 -1
  13. package/lib/browser/scm-history-graph-helpers.d.ts +39 -0
  14. package/lib/browser/scm-history-graph-helpers.d.ts.map +1 -0
  15. package/lib/browser/scm-history-graph-helpers.js +167 -0
  16. package/lib/browser/scm-history-graph-helpers.js.map +1 -0
  17. package/lib/browser/scm-history-graph-lanes.d.ts +59 -0
  18. package/lib/browser/scm-history-graph-lanes.d.ts.map +1 -0
  19. package/lib/browser/scm-history-graph-lanes.js +183 -0
  20. package/lib/browser/scm-history-graph-lanes.js.map +1 -0
  21. package/lib/browser/scm-history-graph-lanes.spec.d.ts +2 -0
  22. package/lib/browser/scm-history-graph-lanes.spec.d.ts.map +1 -0
  23. package/lib/browser/scm-history-graph-lanes.spec.js +554 -0
  24. package/lib/browser/scm-history-graph-lanes.spec.js.map +1 -0
  25. package/lib/browser/scm-history-graph-model.d.ts +46 -0
  26. package/lib/browser/scm-history-graph-model.d.ts.map +1 -0
  27. package/lib/browser/scm-history-graph-model.js +184 -0
  28. package/lib/browser/scm-history-graph-model.js.map +1 -0
  29. package/lib/browser/scm-history-graph-model.spec.d.ts +2 -0
  30. package/lib/browser/scm-history-graph-model.spec.d.ts.map +1 -0
  31. package/lib/browser/scm-history-graph-model.spec.js +131 -0
  32. package/lib/browser/scm-history-graph-model.spec.js.map +1 -0
  33. package/lib/browser/scm-history-graph-tooltip.d.ts +14 -0
  34. package/lib/browser/scm-history-graph-tooltip.d.ts.map +1 -0
  35. package/lib/browser/scm-history-graph-tooltip.js +190 -0
  36. package/lib/browser/scm-history-graph-tooltip.js.map +1 -0
  37. package/lib/browser/scm-history-graph-widget.d.ts +77 -0
  38. package/lib/browser/scm-history-graph-widget.d.ts.map +1 -0
  39. package/lib/browser/scm-history-graph-widget.js +490 -0
  40. package/lib/browser/scm-history-graph-widget.js.map +1 -0
  41. package/lib/browser/scm-provider.d.ts +61 -0
  42. package/lib/browser/scm-provider.d.ts.map +1 -1
  43. package/lib/browser/scm-provider.js.map +1 -1
  44. package/package.json +7 -7
  45. package/src/browser/dirty-diff/dirty-diff-widget.ts +1 -1
  46. package/src/browser/scm-context-key-service.ts +18 -0
  47. package/src/browser/scm-contribution.ts +141 -0
  48. package/src/browser/scm-frontend-module.ts +15 -0
  49. package/src/browser/scm-history-graph-helpers.ts +175 -0
  50. package/src/browser/scm-history-graph-lanes.spec.ts +635 -0
  51. package/src/browser/scm-history-graph-lanes.ts +258 -0
  52. package/src/browser/scm-history-graph-model.spec.ts +171 -0
  53. package/src/browser/scm-history-graph-model.ts +207 -0
  54. package/src/browser/scm-history-graph-tooltip.ts +213 -0
  55. package/src/browser/scm-history-graph-widget.tsx +712 -0
  56. package/src/browser/scm-provider.ts +68 -0
  57. package/src/browser/style/index.css +12 -13
  58. package/src/browser/style/scm-history-graph.css +313 -0
@@ -0,0 +1,167 @@
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
+ exports.laneColor = laneColor;
19
+ exports.getChangeStatus = getChangeStatus;
20
+ exports.getFileName = getFileName;
21
+ exports.getFilePath = getFilePath;
22
+ exports.getRepoRelativePath = getRepoRelativePath;
23
+ exports.getRefBadgeClass = getRefBadgeClass;
24
+ exports.isTagRef = isTagRef;
25
+ exports.isRemoteRef = isRemoteRef;
26
+ exports.getLocalNameFromRemote = getLocalNameFromRemote;
27
+ exports.deduplicateRefs = deduplicateRefs;
28
+ /**
29
+ * Returns the CSS color variable for the given lane index.
30
+ * Uses Theia's `--theia-scmGraph-*` variables, mirroring the VS Code
31
+ * scm graph color scheme:
32
+ * lane 0 (current ref) → historyItemRefColor
33
+ * lane 1 (remote ref) → historyItemRemoteRefColor
34
+ * lane 2 (base ref) → historyItemBaseRefColor
35
+ * lane 3–7 → foreground1–5
36
+ */
37
+ function laneColor(index) {
38
+ switch (index % 8) {
39
+ case 0: return 'var(--theia-scmGraph-historyItemRefColor)';
40
+ case 1: return 'var(--theia-scmGraph-historyItemRemoteRefColor)';
41
+ case 2: return 'var(--theia-scmGraph-historyItemBaseRefColor)';
42
+ case 3: return 'var(--theia-scmGraph-foreground1)';
43
+ case 4: return 'var(--theia-scmGraph-foreground2)';
44
+ case 5: return 'var(--theia-scmGraph-foreground3)';
45
+ case 6: return 'var(--theia-scmGraph-foreground4)';
46
+ default: return 'var(--theia-scmGraph-foreground5)';
47
+ }
48
+ }
49
+ function getChangeStatus(change) {
50
+ if (!change.originalUri) {
51
+ return 'A';
52
+ }
53
+ if (!change.modifiedUri) {
54
+ return 'D';
55
+ }
56
+ if (change.renameUri) {
57
+ return 'R';
58
+ }
59
+ return 'M';
60
+ }
61
+ function getFileName(uri) {
62
+ const parts = uri.split('/');
63
+ return parts[parts.length - 1] || uri;
64
+ }
65
+ function getFilePath(uri) {
66
+ try {
67
+ const u = new URL(uri);
68
+ return u.pathname;
69
+ }
70
+ catch {
71
+ return uri;
72
+ }
73
+ }
74
+ /**
75
+ * Returns the repo-relative path of the given URI, stripping the rootUri prefix.
76
+ * Falls back to the full path if rootUri is unavailable or doesn't match.
77
+ */
78
+ function getRepoRelativePath(uri, rootUri) {
79
+ const fullPath = getFilePath(uri);
80
+ if (!rootUri) {
81
+ return fullPath;
82
+ }
83
+ const rootPath = getFilePath(rootUri);
84
+ // Normalize: ensure rootPath ends with '/'
85
+ const rootPrefix = rootPath.endsWith('/') ? rootPath : rootPath + '/';
86
+ if (fullPath.startsWith(rootPrefix)) {
87
+ return fullPath.slice(rootPrefix.length);
88
+ }
89
+ return fullPath;
90
+ }
91
+ function getRefBadgeClass(ref) {
92
+ const cat = (ref.category ?? '').toLowerCase();
93
+ if (cat === 'heads' || cat === 'head' || ref.id.startsWith('refs/heads/')) {
94
+ return 'head';
95
+ }
96
+ if (cat === 'remotes' || cat === 'remote' || ref.id.startsWith('refs/remotes/')) {
97
+ return 'remote';
98
+ }
99
+ if (cat === 'tags' || cat === 'tag' || ref.id.startsWith('refs/tags/')) {
100
+ return 'tag';
101
+ }
102
+ if (cat === 'base') {
103
+ return 'base';
104
+ }
105
+ return 'head';
106
+ }
107
+ function isTagRef(ref) {
108
+ const cat = (ref.category ?? '').toLowerCase();
109
+ if (cat === 'tags' || cat === 'tag') {
110
+ return true;
111
+ }
112
+ // Fall back to checking the ref id prefix (e.g. 'refs/tags/v1.0')
113
+ return ref.id.startsWith('refs/tags/');
114
+ }
115
+ function isRemoteRef(ref) {
116
+ const cat = (ref.category ?? '').toLowerCase();
117
+ if (cat === 'remotes' || cat === 'remote') {
118
+ return true;
119
+ }
120
+ // Fall back to checking the ref id prefix (e.g. 'refs/remotes/origin/main')
121
+ return ref.id.startsWith('refs/remotes/');
122
+ }
123
+ /**
124
+ * Extracts the local branch name from a remote ref name like "origin/master" → "master".
125
+ * Falls back to the full name if no slash is found.
126
+ */
127
+ function getLocalNameFromRemote(remoteName) {
128
+ const slashIdx = remoteName.indexOf('/');
129
+ return slashIdx >= 0 ? remoteName.slice(slashIdx + 1) : remoteName;
130
+ }
131
+ /**
132
+ * Deduplicates refs: when a local branch (e.g. "master") and a remote branch
133
+ * (e.g. "origin/master") both appear, collapse them into one entry with `hasBoth=true`.
134
+ * Tags and other ref types are passed through unchanged.
135
+ */
136
+ function deduplicateRefs(refs) {
137
+ const localNames = new Set();
138
+ for (const ref of refs) {
139
+ if (!isRemoteRef(ref) && !isTagRef(ref)) {
140
+ localNames.add(ref.name.toLowerCase());
141
+ }
142
+ }
143
+ const result = [];
144
+ const suppressedRemotes = new Set();
145
+ // First pass: identify remote refs that have a matching local branch
146
+ for (const ref of refs) {
147
+ if (isRemoteRef(ref)) {
148
+ const localName = getLocalNameFromRemote(ref.name).toLowerCase();
149
+ if (localNames.has(localName)) {
150
+ suppressedRemotes.add(ref.id);
151
+ }
152
+ }
153
+ }
154
+ // Second pass: emit all refs except suppressed remote ones;
155
+ // mark local branches that have a matching remote with hasBoth=true
156
+ for (const ref of refs) {
157
+ if (suppressedRemotes.has(ref.id)) {
158
+ continue;
159
+ }
160
+ const hasBoth = !isRemoteRef(ref) && !isTagRef(ref)
161
+ ? refs.some(r => isRemoteRef(r) && getLocalNameFromRemote(r.name).toLowerCase() === ref.name.toLowerCase())
162
+ : false;
163
+ result.push({ ref, hasBoth });
164
+ }
165
+ return result;
166
+ }
167
+ //# sourceMappingURL=scm-history-graph-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-helpers.js","sourceRoot":"","sources":["../../src/browser/scm-history-graph-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * DAG graph lane computation for SCM commit history visualization.
3
+ *
4
+ * Each row in the graph has:
5
+ * - `lane`: the column index where the commit circle is drawn
6
+ * - `color`: a lane index (0-7) used to pick a CSS color variable
7
+ * - `edges`: segments to draw on this row — each segment connects two lane
8
+ * positions and carries a color and type
9
+ *
10
+ * Edge types determine how each segment is rendered in the SVG:
11
+ * - `'pass-through'`: straight vertical line through the full row height
12
+ * - `'branch-out'`: bezier curve starting at the commit's Y (mid-row),
13
+ * sweeping down to the new lane at the bottom of the row
14
+ * - `'merge-in'`: bezier curve starting at the source lane at the top of
15
+ * the row, sweeping into the commit's Y (mid-row)
16
+ */
17
+ export type GraphEdgeType = 'pass-through' | 'branch-out' | 'merge-in';
18
+ export interface GraphEdge {
19
+ /** Source lane position (top of the row for pass-through/merge-in; commit lane for branch-out). */
20
+ readonly fromLane: number;
21
+ /** Target lane position (bottom of the row for pass-through/branch-out; commit lane for merge-in). */
22
+ readonly toLane: number;
23
+ /** Color index (0–7) for this edge. */
24
+ readonly color: number;
25
+ /** How this edge should be rendered in the SVG. */
26
+ readonly type: GraphEdgeType;
27
+ }
28
+ export interface GraphRow {
29
+ /** Lane index where the commit node is rendered. */
30
+ readonly lane: number;
31
+ /** Color index for the commit node dot. */
32
+ readonly color: number;
33
+ /** Edges crossing or originating on this row. */
34
+ readonly edges: readonly GraphEdge[];
35
+ /**
36
+ * Whether the commit's lane continues downward (i.e. first parent stays in
37
+ * the same lane). When false, no bottom line segment is drawn below the
38
+ * commit circle (root commit or merge convergence where the lane is freed).
39
+ */
40
+ readonly hasContinuation: boolean;
41
+ /**
42
+ * Whether there is an incoming line from above on the commit's lane (i.e.
43
+ * the commit was referenced as a parent by an earlier row). When false,
44
+ * no top line segment is drawn above the commit circle.
45
+ */
46
+ readonly hasTopLine: boolean;
47
+ }
48
+ /**
49
+ * Compute graph rows for an ordered list of commits (topological order,
50
+ * newest first). Each commit must supply its own `id` and `parentIds`.
51
+ *
52
+ * @param commits Topologically sorted commits (newest → oldest).
53
+ * @returns One `GraphRow` per commit in the same order.
54
+ */
55
+ export declare function computeGraphRows(commits: ReadonlyArray<{
56
+ id: string;
57
+ parentIds?: readonly string[];
58
+ }>): GraphRow[];
59
+ //# sourceMappingURL=scm-history-graph-lanes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-lanes.d.ts","sourceRoot":"","sources":["../../src/browser/scm-history-graph-lanes.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,YAAY,GAAG,UAAU,CAAC;AAEvE,MAAM,WAAW,SAAS;IACtB,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sGAAsG;IACtG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACrB,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAChC;AAaD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC5B,OAAO,EAAE,aAAa,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,GACtE,QAAQ,EAAE,CAoKZ"}
@@ -0,0 +1,183 @@
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
+ exports.computeGraphRows = computeGraphRows;
19
+ /**
20
+ * Compute graph rows for an ordered list of commits (topological order,
21
+ * newest first). Each commit must supply its own `id` and `parentIds`.
22
+ *
23
+ * @param commits Topologically sorted commits (newest → oldest).
24
+ * @returns One `GraphRow` per commit in the same order.
25
+ */
26
+ function computeGraphRows(commits) {
27
+ // lanes[i] = id of commit that "owns" lane i (i.e. we are waiting for this
28
+ // commit to appear in the list so we can close the lane).
29
+ const lanes = [];
30
+ // laneColors[i] = the color index permanently assigned to lane i
31
+ const laneColors = [];
32
+ const rows = [];
33
+ for (const commit of commits) {
34
+ const parentIds = commit.parentIds ?? [];
35
+ // --- 1. Find or assign a lane for this commit -----------------------
36
+ let myLane = lanes.indexOf(commit.id);
37
+ // hasTopLine: true when this commit was already reserved as a parent by
38
+ // an earlier row — meaning there IS a connection coming from above.
39
+ const hasTopLine = myLane !== -1;
40
+ if (myLane === -1) {
41
+ // Not yet tracked → open a new lane
42
+ myLane = firstFreeLane(lanes);
43
+ lanes[myLane] = commit.id;
44
+ laneColors[myLane] = myLane % 8;
45
+ }
46
+ const myColor = laneColors[myLane] ?? myLane % 8;
47
+ // Collect any duplicate lane occupants: other lanes that were kept
48
+ // alive pointing at this same commit (sibling branch tips whose lane
49
+ // was preserved until the parent row). These emit merge-in edges and
50
+ // are freed before the pass-through snapshot so they don't appear as
51
+ // spurious pass-through lines on this row.
52
+ const duplicateLanes = [];
53
+ if (hasTopLine) {
54
+ for (let li = 0; li < lanes.length; li++) {
55
+ if (lanes[li] === commit.id && li !== myLane) {
56
+ duplicateLanes.push({ lane: li, color: laneColors[li] ?? li % 8 });
57
+ lanes[li] = undefined;
58
+ laneColors[li] = undefined;
59
+ }
60
+ }
61
+ }
62
+ // --- 2. Snapshot current lane state before mutations ----------------
63
+ const lanesCopy = lanes.slice();
64
+ // --- 3. Determine parent lane assignments ---------------------------
65
+ const parentLanes = [];
66
+ // Track which parents were ALREADY in existing lanes (merge-in) vs new
67
+ const parentIsExisting = [];
68
+ for (let pi = 0; pi < parentIds.length; pi++) {
69
+ const pid = parentIds[pi];
70
+ const parentLane = lanesCopy.indexOf(pid);
71
+ if (parentLane !== -1 && parentLane !== myLane) {
72
+ if (hasTopLine) {
73
+ // Pre-reserved commit: parent already has a lane → merge-in edge on this row.
74
+ parentLanes.push(parentLane);
75
+ parentIsExisting.push(true);
76
+ }
77
+ else {
78
+ // Non-pre-reserved sibling branch tip: keep this lane alive so it
79
+ // passes through as a pass-through line until the parent row, where
80
+ // a merge-in is emitted via the duplicateLanes mechanism.
81
+ // No edge is emitted here; record myLane so hasContinuation is true.
82
+ lanes[myLane] = pid;
83
+ parentLanes.push(myLane);
84
+ parentIsExisting.push(false);
85
+ }
86
+ }
87
+ else if (parentLane === myLane) {
88
+ // First parent inherits this lane (fast-forward) — straight down
89
+ parentLanes.push(myLane);
90
+ parentIsExisting.push(false); // treated as inline continuation
91
+ }
92
+ else {
93
+ // New parent → assign a lane
94
+ if (pi === 0) {
95
+ // First parent continues in the same lane
96
+ lanes[myLane] = pid;
97
+ // Keep the same color as myLane for the first parent
98
+ parentLanes.push(myLane);
99
+ parentIsExisting.push(false);
100
+ }
101
+ else {
102
+ // Additional parents get new lanes — branch-out
103
+ const newLane = firstFreeLane(lanes);
104
+ lanes[newLane] = pid;
105
+ laneColors[newLane] = newLane % 8;
106
+ parentLanes.push(newLane);
107
+ parentIsExisting.push(false);
108
+ }
109
+ }
110
+ }
111
+ // If the commit has no parents (root commit), free the lane
112
+ if (parentIds.length === 0) {
113
+ lanes[myLane] = undefined;
114
+ laneColors[myLane] = undefined;
115
+ }
116
+ else if (!parentLanes.includes(myLane)) {
117
+ // No parent inherited myLane — decide whether to free or keep the lane.
118
+ if (hasTopLine) {
119
+ // Pre-reserved commit (merge convergence): free the lane immediately.
120
+ lanes[myLane] = undefined;
121
+ laneColors[myLane] = undefined;
122
+ }
123
+ else {
124
+ // Non-pre-reserved sibling branch tip: keep the lane alive pointing
125
+ // at the first parent so it persists as a pass-through until the
126
+ // parent row. At the parent row, the duplicate lane occupant is
127
+ // detected and a merge-in edge is emitted there instead.
128
+ lanes[myLane] = parentIds[0];
129
+ }
130
+ }
131
+ // --- 4. Emit edges --------------------------------------------------
132
+ const edges = [];
133
+ // Pass-through lines: lanes that were occupied before this row and
134
+ // are NOT the commit's own lane continue straight through.
135
+ for (let li = 0; li < lanesCopy.length; li++) {
136
+ const occupant = lanesCopy[li];
137
+ if (!occupant || occupant === commit.id) {
138
+ continue;
139
+ }
140
+ const color = laneColors[li] ?? li % 8;
141
+ edges.push({ fromLane: li, toLane: li, color, type: 'pass-through' });
142
+ }
143
+ for (let pi = 0; pi < parentIds.length; pi++) {
144
+ const toLane = parentLanes[pi];
145
+ const isExisting = parentIsExisting[pi];
146
+ if (toLane === myLane) {
147
+ // First parent continues in the same lane — no edge is emitted.
148
+ // The vertical connection is represented by hasContinuation:true on
149
+ // this row and hasTopLine:true on the parent's row; the SVG renderer
150
+ // draws the top/bottom line segments around the commit circle instead.
151
+ continue;
152
+ }
153
+ if (isExisting) {
154
+ // Merge-in: an existing lane at the top of the row curves into
155
+ // the commit position at mid-row.
156
+ const color = laneColors[toLane] ?? toLane % 8;
157
+ edges.push({ fromLane: toLane, toLane: myLane, color, type: 'merge-in' });
158
+ }
159
+ else {
160
+ // Branch-out: the commit spawns a new lane below mid-row.
161
+ const color = laneColors[toLane] ?? toLane % 8;
162
+ edges.push({ fromLane: myLane, toLane, color, type: 'branch-out' });
163
+ }
164
+ }
165
+ // Merge-in edges for duplicate lane occupants (sibling branch tips
166
+ // converging into this commit's lane).
167
+ for (const dl of duplicateLanes) {
168
+ edges.push({ fromLane: dl.lane, toLane: myLane, color: dl.color, type: 'merge-in' });
169
+ }
170
+ // hasContinuation: true if the first parent continues in the same lane,
171
+ // OR if this is a sibling branch tip whose lane was kept alive (pointing
172
+ // at the parent) so it persists as a pass-through to the parent row.
173
+ const hasContinuation = parentIds.length > 0 && (parentLanes[0] === myLane || lanes[myLane] === parentIds[0]);
174
+ rows.push({ lane: myLane, color: myColor, edges, hasContinuation, hasTopLine });
175
+ }
176
+ return rows;
177
+ }
178
+ /** Returns the index of the first undefined slot, or lanes.length if full. */
179
+ function firstFreeLane(lanes) {
180
+ const idx = lanes.indexOf(undefined);
181
+ return idx === -1 ? lanes.length : idx;
182
+ }
183
+ //# sourceMappingURL=scm-history-graph-lanes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-lanes.js","sourceRoot":"","sources":["../../src/browser/scm-history-graph-lanes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scm-history-graph-lanes.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scm-history-graph-lanes.spec.d.ts","sourceRoot":"","sources":["../../src/browser/scm-history-graph-lanes.spec.ts"],"names":[],"mappings":""}