@theia/scm 1.75.0-next.4 → 1.75.0-next.42

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 (83) hide show
  1. package/lib/browser/decorations/scm-navigator-decorator.d.ts.map +1 -1
  2. package/lib/browser/decorations/scm-navigator-decorator.js +1 -0
  3. package/lib/browser/decorations/scm-navigator-decorator.js.map +1 -1
  4. package/lib/browser/scm-context-key-service.d.ts +2 -0
  5. package/lib/browser/scm-context-key-service.d.ts.map +1 -1
  6. package/lib/browser/scm-context-key-service.js +4 -0
  7. package/lib/browser/scm-context-key-service.js.map +1 -1
  8. package/lib/browser/scm-context-key-service.spec.js +7 -0
  9. package/lib/browser/scm-context-key-service.spec.js.map +1 -1
  10. package/lib/browser/scm-frontend-module.d.ts.map +1 -1
  11. package/lib/browser/scm-frontend-module.js +6 -0
  12. package/lib/browser/scm-frontend-module.js.map +1 -1
  13. package/lib/browser/scm-history-graph-contribution.d.ts +49 -0
  14. package/lib/browser/scm-history-graph-contribution.d.ts.map +1 -0
  15. package/lib/browser/scm-history-graph-contribution.js +280 -0
  16. package/lib/browser/scm-history-graph-contribution.js.map +1 -0
  17. package/lib/browser/scm-history-graph-contribution.spec.d.ts +2 -0
  18. package/lib/browser/scm-history-graph-contribution.spec.d.ts.map +1 -0
  19. package/lib/browser/scm-history-graph-contribution.spec.js +119 -0
  20. package/lib/browser/scm-history-graph-contribution.spec.js.map +1 -0
  21. package/lib/browser/scm-history-graph-helpers.d.ts +59 -6
  22. package/lib/browser/scm-history-graph-helpers.d.ts.map +1 -1
  23. package/lib/browser/scm-history-graph-helpers.js +129 -5
  24. package/lib/browser/scm-history-graph-helpers.js.map +1 -1
  25. package/lib/browser/scm-history-graph-helpers.spec.d.ts +2 -0
  26. package/lib/browser/scm-history-graph-helpers.spec.d.ts.map +1 -0
  27. package/lib/browser/scm-history-graph-helpers.spec.js +154 -0
  28. package/lib/browser/scm-history-graph-helpers.spec.js.map +1 -0
  29. package/lib/browser/scm-history-graph-lanes.d.ts +19 -5
  30. package/lib/browser/scm-history-graph-lanes.d.ts.map +1 -1
  31. package/lib/browser/scm-history-graph-lanes.js +25 -9
  32. package/lib/browser/scm-history-graph-lanes.js.map +1 -1
  33. package/lib/browser/scm-history-graph-lanes.spec.js +62 -25
  34. package/lib/browser/scm-history-graph-lanes.spec.js.map +1 -1
  35. package/lib/browser/scm-history-graph-model.d.ts +75 -6
  36. package/lib/browser/scm-history-graph-model.d.ts.map +1 -1
  37. package/lib/browser/scm-history-graph-model.js +155 -10
  38. package/lib/browser/scm-history-graph-model.js.map +1 -1
  39. package/lib/browser/scm-history-graph-model.spec.js +299 -4
  40. package/lib/browser/scm-history-graph-model.spec.js.map +1 -1
  41. package/lib/browser/scm-history-graph-tooltip.d.ts +27 -2
  42. package/lib/browser/scm-history-graph-tooltip.d.ts.map +1 -1
  43. package/lib/browser/scm-history-graph-tooltip.js +113 -22
  44. package/lib/browser/scm-history-graph-tooltip.js.map +1 -1
  45. package/lib/browser/scm-history-graph-tooltip.spec.d.ts +2 -0
  46. package/lib/browser/scm-history-graph-tooltip.spec.d.ts.map +1 -0
  47. package/lib/browser/scm-history-graph-tooltip.spec.js +213 -0
  48. package/lib/browser/scm-history-graph-tooltip.spec.js.map +1 -0
  49. package/lib/browser/scm-history-graph-widget.d.ts +36 -2
  50. package/lib/browser/scm-history-graph-widget.d.ts.map +1 -1
  51. package/lib/browser/scm-history-graph-widget.js +154 -27
  52. package/lib/browser/scm-history-graph-widget.js.map +1 -1
  53. package/lib/browser/scm-history-graph-widget.spec.d.ts +2 -0
  54. package/lib/browser/scm-history-graph-widget.spec.d.ts.map +1 -0
  55. package/lib/browser/scm-history-graph-widget.spec.js +262 -0
  56. package/lib/browser/scm-history-graph-widget.spec.js.map +1 -0
  57. package/lib/browser/scm-provider.d.ts +9 -1
  58. package/lib/browser/scm-provider.d.ts.map +1 -1
  59. package/lib/browser/scm-provider.js.map +1 -1
  60. package/lib/common/scm-preferences.d.ts +3 -0
  61. package/lib/common/scm-preferences.d.ts.map +1 -1
  62. package/lib/common/scm-preferences.js +24 -0
  63. package/lib/common/scm-preferences.js.map +1 -1
  64. package/package.json +6 -6
  65. package/src/browser/decorations/scm-navigator-decorator.ts +3 -2
  66. package/src/browser/scm-context-key-service.spec.ts +9 -0
  67. package/src/browser/scm-context-key-service.ts +6 -0
  68. package/src/browser/scm-frontend-module.ts +7 -1
  69. package/src/browser/scm-history-graph-contribution.spec.ts +148 -0
  70. package/src/browser/scm-history-graph-contribution.ts +273 -0
  71. package/src/browser/scm-history-graph-helpers.spec.ts +193 -0
  72. package/src/browser/scm-history-graph-helpers.ts +180 -6
  73. package/src/browser/scm-history-graph-lanes.spec.ts +70 -25
  74. package/src/browser/scm-history-graph-lanes.ts +48 -11
  75. package/src/browser/scm-history-graph-model.spec.ts +378 -12
  76. package/src/browser/scm-history-graph-model.ts +181 -13
  77. package/src/browser/scm-history-graph-tooltip.spec.ts +254 -0
  78. package/src/browser/scm-history-graph-tooltip.ts +144 -24
  79. package/src/browser/scm-history-graph-widget.spec.ts +310 -0
  80. package/src/browser/scm-history-graph-widget.tsx +199 -39
  81. package/src/browser/scm-provider.ts +9 -1
  82. package/src/browser/style/scm-history-graph.css +53 -2
  83. package/src/common/scm-preferences.ts +27 -0
@@ -15,7 +15,7 @@
15
15
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
16
  // *****************************************************************************
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.ScmHistoryGraphModel = exports.PAGE_SIZE = void 0;
18
+ exports.ScmHistoryGraphModel = exports.ScmHistoryGraphModelProvider = exports.PAGE_SIZE = void 0;
19
19
  const tslib_1 = require("tslib");
20
20
  const inversify_1 = require("@theia/core/shared/inversify");
21
21
  const disposable_1 = require("@theia/core/lib/common/disposable");
@@ -23,7 +23,11 @@ const event_1 = require("@theia/core/lib/common/event");
23
23
  const cancellation_1 = require("@theia/core/lib/common/cancellation");
24
24
  const scm_service_1 = require("./scm-service");
25
25
  const scm_history_graph_lanes_1 = require("./scm-history-graph-lanes");
26
+ const core_1 = require("@theia/core");
27
+ const scm_history_graph_helpers_1 = require("./scm-history-graph-helpers");
28
+ const scm_preferences_1 = require("../common/scm-preferences");
26
29
  exports.PAGE_SIZE = 50;
30
+ exports.ScmHistoryGraphModelProvider = Symbol('ScmHistoryGraphModelProvider');
27
31
  let ScmHistoryGraphModel = class ScmHistoryGraphModel {
28
32
  constructor() {
29
33
  this.toDispose = new disposable_1.DisposableCollection();
@@ -32,15 +36,25 @@ let ScmHistoryGraphModel = class ScmHistoryGraphModel {
32
36
  this._hasMore = false;
33
37
  this._loading = false;
34
38
  this._hasAttemptedLoad = false;
39
+ this._viewMode = 'list';
35
40
  this.onDidChangeEmitter = new event_1.Emitter();
36
41
  this.onDidChange = this.onDidChangeEmitter.event;
42
+ this.onDidRequestRevealEmitter = new event_1.Emitter();
43
+ /** Fired with the index of an entry the view should scroll to and select. */
44
+ this.onDidRequestReveal = this.onDidRequestRevealEmitter.event;
37
45
  this.cancelSource = new cancellation_1.CancellationTokenSource();
38
46
  }
39
47
  init() {
40
48
  this.toDispose.pushAll([
41
49
  disposable_1.Disposable.create(() => this.toDisposeOnProviderChange.dispose()),
42
50
  this.onDidChangeEmitter,
51
+ this.onDidRequestRevealEmitter,
43
52
  this.scmService.onDidChangeSelectedRepository(() => this.refresh()),
53
+ this.scmPreferences.onPreferenceChanged(e => {
54
+ if (e.preferenceName === 'scm.graph.pageSize') {
55
+ this.reload();
56
+ }
57
+ }),
44
58
  ]);
45
59
  this.refresh();
46
60
  }
@@ -51,6 +65,44 @@ let ScmHistoryGraphModel = class ScmHistoryGraphModel {
51
65
  get provider() {
52
66
  return this._provider;
53
67
  }
68
+ /** The explicitly picked ref ids filtering the graph, or `undefined` in auto mode. */
69
+ get historyItemRefFilter() {
70
+ return this._historyItemRefFilter;
71
+ }
72
+ /** How the changes of an expanded history item are laid out. */
73
+ get viewMode() {
74
+ return this._viewMode;
75
+ }
76
+ /**
77
+ * Switches how the changes of an expanded history item are laid out. This
78
+ * only affects rendering, so the loaded history is kept as is.
79
+ */
80
+ setViewMode(viewMode) {
81
+ if (this._viewMode === viewMode) {
82
+ return;
83
+ }
84
+ this._viewMode = viewMode;
85
+ this.onDidChangeEmitter.fire();
86
+ }
87
+ /**
88
+ * Sets the ref ids to filter the graph by (`undefined` returns to auto
89
+ * mode) and reloads the graph.
90
+ */
91
+ setHistoryItemRefFilter(refIds) {
92
+ this._historyItemRefFilter = refIds && refIds.length > 0 ? [...refIds] : undefined;
93
+ this.reload();
94
+ }
95
+ /**
96
+ * Whether the current history item ref is part of the graph's filter.
97
+ * Always true in auto mode, which includes the current ref.
98
+ */
99
+ isCurrentRefInFilter() {
100
+ if (!this._historyItemRefFilter) {
101
+ return true;
102
+ }
103
+ const currentId = this._provider?.currentHistoryItemRef?.id;
104
+ return currentId !== undefined && this._historyItemRefFilter.includes(currentId);
105
+ }
54
106
  get entries() {
55
107
  return this._entries;
56
108
  }
@@ -69,25 +121,79 @@ let ScmHistoryGraphModel = class ScmHistoryGraphModel {
69
121
  return this._hasAttemptedLoad;
70
122
  }
71
123
  refresh() {
72
- this.cancelSource.cancel();
73
- this.cancelSource = new cancellation_1.CancellationTokenSource();
74
124
  this.toDisposeOnProviderChange.dispose();
75
125
  const repo = this.scmService.selectedRepository;
76
126
  const hp = repo?.provider.historyProvider;
127
+ if (hp !== this._provider) {
128
+ // The repository changed — a filter picked for the old provider does not apply.
129
+ this._historyItemRefFilter = undefined;
130
+ }
77
131
  this._provider = hp;
78
132
  if (this._provider) {
79
133
  this.toDisposeOnProviderChange.push(this._provider.onDidChangeCurrentHistoryItemRefs(() => this.refresh()));
80
- this.toDisposeOnProviderChange.push(this._provider.onDidChangeHistoryItemRefs(() => this.refresh()));
134
+ this.toDisposeOnProviderChange.push(this._provider.onDidChangeHistoryItemRefs(e => {
135
+ this.pruneHistoryItemRefFilter(e.removed);
136
+ this.refresh();
137
+ }));
81
138
  }
82
139
  else if (repo) {
83
140
  // historyProvider is not yet available; listen for provider changes
84
141
  // so that refresh() is retried when historyProvider becomes available.
85
142
  this.toDisposeOnProviderChange.push(repo.provider.onDidChange(() => this.refresh()));
86
143
  }
144
+ this.reload();
145
+ }
146
+ /**
147
+ * Drops refs that no longer exist from the explicit filter, so that
148
+ * deleting or renaming a filtered ref does not leave the graph stuck
149
+ * requesting history for it. When the last filtered ref is removed,
150
+ * the filter falls back to auto mode.
151
+ */
152
+ pruneHistoryItemRefFilter(removed) {
153
+ if (!this._historyItemRefFilter || removed.length === 0) {
154
+ return;
155
+ }
156
+ const removedIds = new Set(removed.map(ref => ref.id));
157
+ const remaining = this._historyItemRefFilter.filter(id => !removedIds.has(id));
158
+ if (remaining.length !== this._historyItemRefFilter.length) {
159
+ this._historyItemRefFilter = remaining.length > 0 ? remaining : undefined;
160
+ }
161
+ }
162
+ /** Clears the loaded entries and loads the first page again from the current provider. */
163
+ reload() {
164
+ this.cancelSource.cancel();
165
+ this.cancelSource = new cancellation_1.CancellationTokenSource();
87
166
  this._entries = [];
88
167
  this._hasMore = false;
89
168
  this.loadPage();
90
169
  }
170
+ /**
171
+ * Locates the commit the current history item ref points at, loading
172
+ * further pages while it is outside the loaded range, and asks the view to
173
+ * reveal it. Returns its index, or `undefined` when there is no current
174
+ * history item ref or the commit is not part of the graph (e.g. the ref is
175
+ * excluded by the filter).
176
+ */
177
+ async revealCurrentHistoryItem() {
178
+ let index = this.indexOfCurrentHistoryItem();
179
+ while (index === undefined && this._hasMore) {
180
+ const loadedBefore = this._entries.length;
181
+ await this.loadMore();
182
+ if (this._entries.length === loadedBefore) {
183
+ // The page added nothing new; paging further cannot find the item.
184
+ break;
185
+ }
186
+ index = this.indexOfCurrentHistoryItem();
187
+ }
188
+ if (index !== undefined) {
189
+ this.onDidRequestRevealEmitter.fire(index);
190
+ }
191
+ return index;
192
+ }
193
+ indexOfCurrentHistoryItem() {
194
+ const index = this._entries.findIndex(entry => entry.isCurrent);
195
+ return index === -1 ? undefined : index;
196
+ }
91
197
  async loadMore() {
92
198
  if (this._loading || !this._hasMore) {
93
199
  return;
@@ -107,10 +213,11 @@ let ScmHistoryGraphModel = class ScmHistoryGraphModel {
107
213
  this.onDidChangeEmitter.fire();
108
214
  const token = this.cancelSource.token;
109
215
  try {
216
+ const pageSize = this.pageSize;
110
217
  const historyItemRefs = this.getCurrentHistoryItemRefs();
111
218
  const options = {
112
219
  skip: this._entries.length,
113
- limit: exports.PAGE_SIZE,
220
+ limit: pageSize,
114
221
  historyItemRefs: historyItemRefs.length > 0 ? historyItemRefs : undefined,
115
222
  };
116
223
  const items = await this._provider.provideHistoryItems(options, token);
@@ -118,7 +225,7 @@ let ScmHistoryGraphModel = class ScmHistoryGraphModel {
118
225
  return;
119
226
  }
120
227
  const fetchedItems = items ?? [];
121
- this._hasMore = fetchedItems.length >= exports.PAGE_SIZE;
228
+ this._hasMore = fetchedItems.length >= pageSize;
122
229
  // Filter out any items already loaded so the graph does not show duplicates.
123
230
  const existingIds = new Set(this._entries.map(e => e.item.id));
124
231
  const newItems = fetchedItems.filter(i => !existingIds.has(i.id));
@@ -126,15 +233,18 @@ let ScmHistoryGraphModel = class ScmHistoryGraphModel {
126
233
  const graphRows = (0, scm_history_graph_lanes_1.computeGraphRows)(allItems.map(i => ({
127
234
  id: i.id,
128
235
  parentIds: i.parentIds,
236
+ colorIndex: this.resolveColorIndex(i),
129
237
  })));
238
+ const currentRevision = this._provider.currentHistoryItemRef?.revision;
130
239
  this._entries = allItems.map((item, idx) => ({
131
240
  item,
132
241
  graphRow: graphRows[idx],
242
+ isCurrent: currentRevision !== undefined && item.id === currentRevision,
133
243
  }));
134
244
  }
135
245
  catch (err) {
136
246
  if (!token.isCancellationRequested) {
137
- console.error('ScmHistoryGraphModel: failed to load history', err);
247
+ this.logger.error('Failed to load history', err);
138
248
  }
139
249
  }
140
250
  finally {
@@ -145,12 +255,38 @@ let ScmHistoryGraphModel = class ScmHistoryGraphModel {
145
255
  }
146
256
  }
147
257
  }
258
+ /** The configured page size (`scm.graph.pageSize`). */
259
+ get pageSize() {
260
+ return this.scmPreferences['scm.graph.pageSize'] ?? exports.PAGE_SIZE;
261
+ }
148
262
  /**
149
- * Returns the revisions of the current branch ref, its remote tracking ref,
150
- * and the merge-base ref to pass to `provideHistoryItems`. Providers walk
151
- * history starting from these revisions.
263
+ * Resolves the ref-based color index of an item from its references,
264
+ * preferring current (0) over remote (1) over base (2). Refs excluded by
265
+ * an explicit filter get no role color, mirroring VS Code's color map.
266
+ */
267
+ resolveColorIndex(item) {
268
+ let result;
269
+ for (const ref of item.references ?? []) {
270
+ if (this._historyItemRefFilter && !this._historyItemRefFilter.includes(ref.id)) {
271
+ continue;
272
+ }
273
+ const index = (0, scm_history_graph_helpers_1.getRefColorIndex)(ref, this._provider);
274
+ if (index !== undefined && (result === undefined || index < result)) {
275
+ result = index;
276
+ }
277
+ }
278
+ return result;
279
+ }
280
+ /**
281
+ * Returns the refs to pass to `provideHistoryItems`: the explicitly picked
282
+ * ref ids when a filter is active, otherwise (auto mode) the revisions of
283
+ * the current branch ref, its remote tracking ref, and the merge-base ref.
284
+ * Providers walk history starting from these refs.
152
285
  */
153
286
  getCurrentHistoryItemRefs() {
287
+ if (this._historyItemRefFilter) {
288
+ return [...this._historyItemRefFilter];
289
+ }
154
290
  if (!this._provider) {
155
291
  return [];
156
292
  }
@@ -172,6 +308,15 @@ tslib_1.__decorate([
172
308
  (0, inversify_1.inject)(scm_service_1.ScmService),
173
309
  tslib_1.__metadata("design:type", scm_service_1.ScmService)
174
310
  ], ScmHistoryGraphModel.prototype, "scmService", void 0);
311
+ tslib_1.__decorate([
312
+ (0, inversify_1.inject)(scm_preferences_1.ScmPreferences),
313
+ tslib_1.__metadata("design:type", Object)
314
+ ], ScmHistoryGraphModel.prototype, "scmPreferences", void 0);
315
+ tslib_1.__decorate([
316
+ (0, inversify_1.inject)(core_1.ILogger),
317
+ (0, inversify_1.named)('scm:ScmHistoryGraphModel'),
318
+ tslib_1.__metadata("design:type", Object)
319
+ ], ScmHistoryGraphModel.prototype, "logger", void 0);
175
320
  tslib_1.__decorate([
176
321
  (0, inversify_1.postConstruct)(),
177
322
  tslib_1.__metadata("design:type", Function),
@@ -1 +1 @@
1
- {"version":3,"file":"scm-history-graph-model.js","sourceRoot":"","sources":["../../src/browser/scm-history-graph-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scm-history-graph-model.js","sourceRoot":"","sources":["../../src/browser/scm-history-graph-model.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAAwF;AACxF,kEAAqF;AACrF,wDAA8D;AAC9D,sEAA8E;AAC9E,+CAA2C;AAE3C,uEAAuE;AACvE,sCAAsC;AACtC,2EAA+D;AAC/D,+DAA2D;AAE9C,QAAA,SAAS,GAAG,EAAE,CAAC;AAKf,QAAA,4BAA4B,GAAG,MAAM,CAAC,8BAA8B,CAAC,CAAC;AAkB5E,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAA1B;QAQgB,cAAS,GAAG,IAAI,iCAAoB,EAAE,CAAC;QACvC,8BAAyB,GAAG,IAAI,iCAAoB,EAAE,CAAC;QAEhE,aAAQ,GAAwB,EAAE,CAAC;QACnC,aAAQ,GAAG,KAAK,CAAC;QACjB,aAAQ,GAAG,KAAK,CAAC;QACjB,sBAAiB,GAAG,KAAK,CAAC;QAI1B,cAAS,GAAuB,MAAM,CAAC;QAE9B,uBAAkB,GAAG,IAAI,eAAO,EAAQ,CAAC;QACnD,gBAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAElC,8BAAyB,GAAG,IAAI,eAAO,EAAU,CAAC;QACrE,6EAA6E;QACpE,uBAAkB,GAAkB,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;QAExE,iBAAY,GAAG,IAAI,sCAAuB,EAAE,CAAC;IAyS3D,CAAC;IAtSa,IAAI;QACV,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACnB,uBAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,CAAC;YACjE,IAAI,CAAC,kBAAkB;YACvB,IAAI,CAAC,yBAAyB;YAC9B,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnE,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE;gBACxC,IAAI,CAAC,CAAC,cAAc,KAAK,oBAAoB,EAAE,CAAC;oBAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClB,CAAC;YACL,CAAC,CAAC;SACL,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,sFAAsF;IACtF,IAAI,oBAAoB;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACtC,CAAC;IAED,gEAAgE;IAChE,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,QAA4B;QACpC,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,uBAAuB,CAAC,MAAqC;QACzD,IAAI,CAAC,qBAAqB,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,oBAAoB;QAChB,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,qBAAqB,EAAE,EAAE,CAAC;QAC5D,OAAO,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED,OAAO;QACH,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,CAAC;QAEzC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC;QAC1C,IAAI,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACxB,gFAAgF;YAChF,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAC/B,IAAI,CAAC,SAAS,CAAC,iCAAiC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CACzE,CAAC;YACF,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAC/B,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE;gBAC1C,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,CACL,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YACd,oEAAoE;YACpE,uEAAuE;YACvE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAC/B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAClD,CAAC;QACN,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACO,yBAAyB,CAAC,OAAqC;QACrE,IAAI,CAAC,IAAI,CAAC,qBAAqB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO;QACX,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC;YACzD,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,CAAC;IACL,CAAC;IAED,0FAA0F;IAChF,MAAM;QACZ,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,sCAAuB,EAAE,CAAC;QAElD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,wBAAwB;QAC1B,IAAI,KAAK,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC7C,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACxC,mEAAmE;gBACnE,MAAM;YACV,CAAC;YACD,KAAK,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAES,yBAAyB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,OAAO;QACX,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAES,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QACtC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACzD,MAAM,OAAO,GAAsB;gBAC/B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAC1B,KAAK,EAAE,QAAQ;gBACf,eAAe,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;aAC5E,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAEvE,IAAI,KAAK,CAAC,uBAAuB,EAAE,CAAC;gBAChC,OAAO;YACX,CAAC;YAED,MAAM,YAAY,GAAqB,KAAK,IAAI,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,IAAI,QAAQ,CAAC;YAEhD,6EAA6E;YAC7E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAElE,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,IAAA,0CAAgB,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClD,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;aACxC,CAAC,CAAC,CAAC,CAAC;YAEL,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,QAAQ,CAAC;YACvE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzC,IAAI;gBACJ,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC;gBACxB,SAAS,EAAE,eAAe,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,eAAe;aAC1E,CAAC,CAAC,CAAC;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;QACL,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC;gBACjC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;YACnC,CAAC;QACL,CAAC;IACL,CAAC;IAED,uDAAuD;IACvD,IAAc,QAAQ;QAClB,OAAO,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,iBAAS,CAAC;IAClE,CAAC;IAED;;;;OAIG;IACO,iBAAiB,CAAC,IAAoB;QAC5C,IAAI,MAA0B,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7E,SAAS;YACb,CAAC;YACD,MAAM,KAAK,GAAG,IAAA,4CAAgB,EAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;gBAClE,MAAM,GAAG,KAAK,CAAC;YACnB,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACO,yBAAyB;QAC/B,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACxG,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,2BAA2B,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;QACpH,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,yBAAyB,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ,CAAA;AApUY,oDAAoB;AAEU;IAAtC,IAAA,kBAAM,EAAC,wBAAU,CAAC;sCAAgC,wBAAU;wDAAC;AACnB;IAA1C,IAAA,kBAAM,EAAC,gCAAc,CAAC;;4DAAmD;AAGvD;IADlB,IAAA,kBAAM,EAAC,cAAO,CAAC;IAAE,IAAA,iBAAK,EAAC,0BAA0B,CAAC;;oDAChB;AAwBzB;IADT,IAAA,yBAAa,GAAE;;;;gDAcf;+BA3CQ,oBAAoB;IADhC,IAAA,sBAAU,GAAE;GACA,oBAAoB,CAoUhC"}
@@ -21,12 +21,16 @@ const scm_history_graph_model_1 = require("./scm-history-graph-model");
21
21
  class StubHistoryProvider {
22
22
  constructor() {
23
23
  this.onDidChangeCurrentHistoryItemRefs = new event_1.Emitter().event;
24
- this.onDidChangeHistoryItemRefs = new event_1.Emitter().event;
24
+ this.onDidChangeHistoryItemRefsEmitter = new event_1.Emitter();
25
+ this.onDidChangeHistoryItemRefs = this.onDidChangeHistoryItemRefsEmitter.event;
25
26
  /** Pages this provider will return on consecutive calls (FIFO). */
26
27
  this.pages = [];
27
28
  /** Captured options for each call (so tests can assert what was sent). */
28
29
  this.receivedOptions = [];
29
30
  }
31
+ fireHistoryItemRefsChanged(event) {
32
+ this.onDidChangeHistoryItemRefsEmitter.fire(event);
33
+ }
30
34
  async provideHistoryItemRefs() {
31
35
  return [];
32
36
  }
@@ -59,21 +63,31 @@ function makeItems(start, count) {
59
63
  /**
60
64
  * Instantiates the model with a stub provider, bypassing inversify and the
61
65
  * SCM service so tests can drive pagination directly via loadPage().
66
+ * When `wireRepository` is set, the provider is instead wired through a stub
67
+ * selected repository and refresh(), so provider event subscriptions are live.
62
68
  */
63
- function createModel(provider) {
69
+ function createModel(provider, preferences = {}, wireRepository = false) {
64
70
  const model = new scm_history_graph_model_1.ScmHistoryGraphModel();
65
71
  const internals = model;
72
+ const preferenceEmitter = new event_1.Emitter();
66
73
  internals.scmService = {
67
74
  onDidChangeSelectedRepository: new event_1.Emitter().event,
68
- selectedRepository: undefined,
75
+ selectedRepository: wireRepository ? { provider: { historyProvider: provider } } : undefined,
69
76
  };
77
+ internals.scmPreferences = Object.assign(preferences, { onPreferenceChanged: preferenceEmitter.event });
70
78
  internals.init();
71
- internals._provider = provider;
79
+ if (!wireRepository) {
80
+ internals._provider = provider;
81
+ }
72
82
  return {
73
83
  model,
74
84
  loadPage: () => internals.loadPage(),
85
+ firePreferenceChanged: preferenceName => preferenceEmitter.fire({ preferenceName }),
75
86
  };
76
87
  }
88
+ async function nextTick() {
89
+ return new Promise(resolve => setTimeout(resolve, 0));
90
+ }
77
91
  describe('ScmHistoryGraphModel - pagination', () => {
78
92
  it('hasMore is true when a full page returns', async () => {
79
93
  const provider = new StubHistoryProvider();
@@ -128,4 +142,285 @@ describe('ScmHistoryGraphModel - pagination', () => {
128
142
  (0, chai_1.expect)(model.entries).to.have.length(scm_history_graph_model_1.PAGE_SIZE, 'should not grow when all items are duplicates');
129
143
  });
130
144
  });
145
+ describe('ScmHistoryGraphModel - page size preference', () => {
146
+ it('requests the configured page size and paginates by it', async () => {
147
+ const provider = new StubHistoryProvider();
148
+ provider.pages = [makeItems(1, 10)];
149
+ const { model, loadPage } = createModel(provider, { 'scm.graph.pageSize': 10 });
150
+ await loadPage();
151
+ (0, chai_1.expect)(provider.receivedOptions[0].limit).to.equal(10);
152
+ (0, chai_1.expect)(model.entries).to.have.length(10);
153
+ (0, chai_1.expect)(model.hasMore).to.be.true;
154
+ });
155
+ it('falls back to the default page size without a preference value', async () => {
156
+ const provider = new StubHistoryProvider();
157
+ provider.pages = [makeItems(1, 10)];
158
+ const { loadPage } = createModel(provider);
159
+ await loadPage();
160
+ (0, chai_1.expect)(provider.receivedOptions[0].limit).to.equal(scm_history_graph_model_1.PAGE_SIZE);
161
+ });
162
+ it('reloads from the start when scm.graph.pageSize changes', async () => {
163
+ const provider = new StubHistoryProvider();
164
+ provider.pages = [makeItems(1, 10), makeItems(1, 5)];
165
+ const preferences = { 'scm.graph.pageSize': 10 };
166
+ const { loadPage, firePreferenceChanged } = createModel(provider, preferences);
167
+ await loadPage();
168
+ (0, chai_1.expect)(provider.receivedOptions[0].limit).to.equal(10);
169
+ preferences['scm.graph.pageSize'] = 5;
170
+ firePreferenceChanged('scm.graph.pageSize');
171
+ await nextTick();
172
+ (0, chai_1.expect)(provider.receivedOptions[1].limit).to.equal(5);
173
+ (0, chai_1.expect)(provider.receivedOptions[1].skip).to.equal(0);
174
+ });
175
+ });
176
+ describe('ScmHistoryGraphModel - history item ref filter', () => {
177
+ const mainRef = { id: 'refs/heads/main', name: 'main', revision: 'c1' };
178
+ function createFilterProvider() {
179
+ const provider = new StubHistoryProvider();
180
+ provider.currentHistoryItemRef = mainRef;
181
+ provider.pages = [makeItems(1, 3), makeItems(1, 3), makeItems(1, 3)];
182
+ return provider;
183
+ }
184
+ it('is in auto mode by default: current ref revisions are requested and the current ref is in the filter', async () => {
185
+ const provider = createFilterProvider();
186
+ const { model, loadPage } = createModel(provider);
187
+ await loadPage();
188
+ (0, chai_1.expect)(provider.receivedOptions[0].historyItemRefs).to.deep.equal(['c1']);
189
+ (0, chai_1.expect)(model.historyItemRefFilter).to.be.undefined;
190
+ (0, chai_1.expect)(model.isCurrentRefInFilter()).to.be.true;
191
+ });
192
+ it('passes the picked ref ids to the provider and reloads', async () => {
193
+ const provider = createFilterProvider();
194
+ const { model } = createModel(provider);
195
+ model.setHistoryItemRefFilter(['refs/heads/feature']);
196
+ await nextTick();
197
+ (0, chai_1.expect)(provider.receivedOptions[0].historyItemRefs).to.deep.equal(['refs/heads/feature']);
198
+ (0, chai_1.expect)(model.historyItemRefFilter).to.deep.equal(['refs/heads/feature']);
199
+ });
200
+ it('reports whether the current ref is part of the filter', async () => {
201
+ const provider = createFilterProvider();
202
+ const { model } = createModel(provider);
203
+ model.setHistoryItemRefFilter(['refs/heads/feature']);
204
+ await nextTick();
205
+ (0, chai_1.expect)(model.isCurrentRefInFilter()).to.be.false;
206
+ model.setHistoryItemRefFilter(['refs/heads/feature', 'refs/heads/main']);
207
+ await nextTick();
208
+ (0, chai_1.expect)(model.isCurrentRefInFilter()).to.be.true;
209
+ });
210
+ it('returns to auto mode when the filter is cleared', async () => {
211
+ const provider = createFilterProvider();
212
+ const { model } = createModel(provider);
213
+ model.setHistoryItemRefFilter(['refs/heads/feature']);
214
+ await nextTick();
215
+ model.setHistoryItemRefFilter(undefined);
216
+ await nextTick();
217
+ (0, chai_1.expect)(model.historyItemRefFilter).to.be.undefined;
218
+ (0, chai_1.expect)(provider.receivedOptions[1].historyItemRefs).to.deep.equal(['c1']);
219
+ });
220
+ it('does not apply ref role colors to refs excluded by the filter', async () => {
221
+ const provider = createFilterProvider();
222
+ provider.pages = [[
223
+ { id: 'c1', subject: 'head', parentIds: ['c2'], references: [mainRef] },
224
+ { id: 'c2', subject: 'base', parentIds: [] },
225
+ ]];
226
+ const { model } = createModel(provider);
227
+ model.setHistoryItemRefFilter(['refs/heads/feature']);
228
+ await nextTick();
229
+ (0, chai_1.expect)(model.entries[0].graphRow.color).to.not.equal(0);
230
+ });
231
+ });
232
+ describe('ScmHistoryGraphModel - ref filter pruning', () => {
233
+ const mainRef = { id: 'refs/heads/main', name: 'main', revision: 'c1' };
234
+ const featureRef = { id: 'refs/heads/feature', name: 'feature', revision: 'c5' };
235
+ function createWiredProvider() {
236
+ const provider = new StubHistoryProvider();
237
+ provider.currentHistoryItemRef = mainRef;
238
+ return provider;
239
+ }
240
+ it('drops a removed ref from the filter and keeps the remaining ones', async () => {
241
+ const provider = createWiredProvider();
242
+ const { model } = createModel(provider, {}, true);
243
+ model.setHistoryItemRefFilter([featureRef.id, mainRef.id]);
244
+ await nextTick();
245
+ provider.fireHistoryItemRefsChanged({ added: [], removed: [featureRef], modified: [] });
246
+ await nextTick();
247
+ (0, chai_1.expect)(model.historyItemRefFilter).to.deep.equal([mainRef.id]);
248
+ const last = provider.receivedOptions[provider.receivedOptions.length - 1];
249
+ (0, chai_1.expect)(last.historyItemRefs).to.deep.equal([mainRef.id]);
250
+ });
251
+ it('falls back to auto mode when all filtered refs are removed', async () => {
252
+ const provider = createWiredProvider();
253
+ const { model } = createModel(provider, {}, true);
254
+ model.setHistoryItemRefFilter([featureRef.id]);
255
+ await nextTick();
256
+ provider.fireHistoryItemRefsChanged({ added: [], removed: [featureRef], modified: [] });
257
+ await nextTick();
258
+ (0, chai_1.expect)(model.historyItemRefFilter).to.be.undefined;
259
+ const last = provider.receivedOptions[provider.receivedOptions.length - 1];
260
+ (0, chai_1.expect)(last.historyItemRefs).to.deep.equal(['c1']);
261
+ });
262
+ it('keeps the filter when unrelated refs are removed', async () => {
263
+ const provider = createWiredProvider();
264
+ const { model } = createModel(provider, {}, true);
265
+ model.setHistoryItemRefFilter([mainRef.id]);
266
+ await nextTick();
267
+ provider.fireHistoryItemRefsChanged({ added: [], removed: [featureRef], modified: [] });
268
+ await nextTick();
269
+ (0, chai_1.expect)(model.historyItemRefFilter).to.deep.equal([mainRef.id]);
270
+ });
271
+ });
272
+ describe('ScmHistoryGraphModel - ref colors and current item', () => {
273
+ const mainRef = { id: 'refs/heads/main', name: 'main', revision: 'c2' };
274
+ const originMainRef = { id: 'refs/remotes/origin/main', name: 'origin/main', revision: 'c1' };
275
+ /** Remote is one commit ahead: c1 (origin/main) → c2 (main = HEAD) → c3. */
276
+ function createBehindProvider() {
277
+ const provider = new StubHistoryProvider();
278
+ provider.currentHistoryItemRef = mainRef;
279
+ provider.currentHistoryItemRemoteRef = originMainRef;
280
+ provider.pages = [[
281
+ { id: 'c1', subject: 'remote only', parentIds: ['c2'], references: [originMainRef] },
282
+ { id: 'c2', subject: 'local head', parentIds: ['c3'], references: [mainRef] },
283
+ { id: 'c3', subject: 'base', parentIds: [] },
284
+ ]];
285
+ return provider;
286
+ }
287
+ it('colors the remote ref tip with the remote ref color', async () => {
288
+ const { model, loadPage } = createModel(createBehindProvider());
289
+ await loadPage();
290
+ (0, chai_1.expect)(model.entries[0].graphRow.color).to.equal(1);
291
+ });
292
+ it('colors the current ref chain with the current ref color', async () => {
293
+ const { model, loadPage } = createModel(createBehindProvider());
294
+ await loadPage();
295
+ (0, chai_1.expect)(model.entries[1].graphRow.color).to.equal(0);
296
+ (0, chai_1.expect)(model.entries[2].graphRow.color).to.equal(0);
297
+ });
298
+ it('prefers the current ref color when a commit carries both local and remote refs', async () => {
299
+ const provider = new StubHistoryProvider();
300
+ const syncedMain = { ...mainRef, revision: 'c1' };
301
+ const syncedRemote = { ...originMainRef, revision: 'c1' };
302
+ provider.currentHistoryItemRef = syncedMain;
303
+ provider.currentHistoryItemRemoteRef = syncedRemote;
304
+ provider.pages = [[
305
+ { id: 'c1', subject: 'in sync', parentIds: [], references: [syncedRemote, syncedMain] },
306
+ ]];
307
+ const { model, loadPage } = createModel(provider);
308
+ await loadPage();
309
+ (0, chai_1.expect)(model.entries[0].graphRow.color).to.equal(0);
310
+ });
311
+ it('marks only the entry at the current ref revision as current', async () => {
312
+ const { model, loadPage } = createModel(createBehindProvider());
313
+ await loadPage();
314
+ (0, chai_1.expect)(model.entries.map(e => e.isCurrent)).to.deep.equal([false, true, false]);
315
+ });
316
+ it('marks no entry as current when the provider has no current ref', async () => {
317
+ const provider = new StubHistoryProvider();
318
+ provider.pages = [makeItems(1, 3)];
319
+ const { model, loadPage } = createModel(provider);
320
+ await loadPage();
321
+ (0, chai_1.expect)(model.entries.every(e => !e.isCurrent)).to.be.true;
322
+ });
323
+ });
324
+ describe('ScmHistoryGraphModel - view mode', () => {
325
+ it('shows the changes of a history item as a list by default', () => {
326
+ const { model } = createModel(new StubHistoryProvider());
327
+ (0, chai_1.expect)(model.viewMode).to.equal('list');
328
+ });
329
+ it('switches the view mode', () => {
330
+ const { model } = createModel(new StubHistoryProvider());
331
+ model.setViewMode('tree');
332
+ (0, chai_1.expect)(model.viewMode).to.equal('tree');
333
+ });
334
+ it('notifies listeners when the view mode changes', () => {
335
+ const { model } = createModel(new StubHistoryProvider());
336
+ let changes = 0;
337
+ model.onDidChange(() => changes++);
338
+ model.setViewMode('tree');
339
+ (0, chai_1.expect)(changes).to.equal(1);
340
+ });
341
+ it('does not notify listeners when the view mode is unchanged', () => {
342
+ const { model } = createModel(new StubHistoryProvider());
343
+ model.setViewMode('tree');
344
+ let changes = 0;
345
+ model.onDidChange(() => changes++);
346
+ model.setViewMode('tree');
347
+ (0, chai_1.expect)(changes).to.equal(0);
348
+ });
349
+ it('does not reload history when the view mode changes', async () => {
350
+ const provider = new StubHistoryProvider();
351
+ provider.pages = [makeItems(1, 10)];
352
+ const { model, loadPage } = createModel(provider);
353
+ await loadPage();
354
+ const requestsBefore = provider.receivedOptions.length;
355
+ model.setViewMode('tree');
356
+ await nextTick();
357
+ (0, chai_1.expect)(provider.receivedOptions).to.have.length(requestsBefore);
358
+ });
359
+ });
360
+ describe('ScmHistoryGraphModel - revealing the current history item', () => {
361
+ function createProviderAt(revision) {
362
+ const provider = new StubHistoryProvider();
363
+ provider.currentHistoryItemRef = { id: 'refs/heads/main', name: 'main', revision };
364
+ return provider;
365
+ }
366
+ it('requests a reveal of the index of the current history item', async () => {
367
+ const provider = createProviderAt('c3');
368
+ provider.pages = [makeItems(1, 10)];
369
+ const { model, loadPage } = createModel(provider);
370
+ await loadPage();
371
+ const revealed = [];
372
+ model.onDidRequestReveal(revealedIndex => revealed.push(revealedIndex));
373
+ const index = await model.revealCurrentHistoryItem();
374
+ (0, chai_1.expect)(index).to.equal(2);
375
+ (0, chai_1.expect)(revealed).to.deep.equal([2]);
376
+ });
377
+ it('loads further pages until the current history item is found', async () => {
378
+ const provider = createProviderAt('c55');
379
+ provider.pages = [makeItems(1, scm_history_graph_model_1.PAGE_SIZE), makeItems(scm_history_graph_model_1.PAGE_SIZE + 1, scm_history_graph_model_1.PAGE_SIZE)];
380
+ const { model, loadPage } = createModel(provider);
381
+ await loadPage();
382
+ (0, chai_1.expect)(model.entries).to.have.length(scm_history_graph_model_1.PAGE_SIZE);
383
+ const index = await model.revealCurrentHistoryItem();
384
+ (0, chai_1.expect)(index).to.equal(54);
385
+ (0, chai_1.expect)(model.entries).to.have.length(2 * scm_history_graph_model_1.PAGE_SIZE);
386
+ });
387
+ it('does not request a reveal when the current history item is not in the history', async () => {
388
+ const provider = createProviderAt('not-loaded');
389
+ provider.pages = [makeItems(1, 10)];
390
+ const { model, loadPage } = createModel(provider);
391
+ await loadPage();
392
+ const revealed = [];
393
+ model.onDidRequestReveal(revealedIndex => revealed.push(revealedIndex));
394
+ const index = await model.revealCurrentHistoryItem();
395
+ (0, chai_1.expect)(index).to.be.undefined;
396
+ (0, chai_1.expect)(revealed).to.be.empty;
397
+ });
398
+ it('does not request a reveal when the provider has no current history item ref', async () => {
399
+ const provider = new StubHistoryProvider();
400
+ provider.pages = [makeItems(1, 10)];
401
+ const { model, loadPage } = createModel(provider);
402
+ await loadPage();
403
+ const revealed = [];
404
+ model.onDidRequestReveal(revealedIndex => revealed.push(revealedIndex));
405
+ const index = await model.revealCurrentHistoryItem();
406
+ (0, chai_1.expect)(index).to.be.undefined;
407
+ (0, chai_1.expect)(revealed).to.be.empty;
408
+ });
409
+ it('stops paging when further pages add no new items', async () => {
410
+ const provider = createProviderAt('never-returned');
411
+ const page = makeItems(1, scm_history_graph_model_1.PAGE_SIZE);
412
+ // A provider that keeps returning the same full page: `hasMore` stays true
413
+ // forever, so only a no-progress guard can end the search.
414
+ provider.provideHistoryItems = async (options) => {
415
+ provider.receivedOptions.push(options);
416
+ return page;
417
+ };
418
+ const { model, loadPage } = createModel(provider);
419
+ await loadPage();
420
+ (0, chai_1.expect)(model.hasMore).to.be.true;
421
+ const index = await model.revealCurrentHistoryItem();
422
+ (0, chai_1.expect)(index).to.be.undefined;
423
+ (0, chai_1.expect)(model.entries).to.have.length(scm_history_graph_model_1.PAGE_SIZE);
424
+ });
425
+ });
131
426
  //# sourceMappingURL=scm-history-graph-model.spec.js.map