gitx.do 0.0.1

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 (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/durable-object/object-store.d.ts +113 -0
  4. package/dist/durable-object/object-store.d.ts.map +1 -0
  5. package/dist/durable-object/object-store.js +387 -0
  6. package/dist/durable-object/object-store.js.map +1 -0
  7. package/dist/durable-object/schema.d.ts +17 -0
  8. package/dist/durable-object/schema.d.ts.map +1 -0
  9. package/dist/durable-object/schema.js +43 -0
  10. package/dist/durable-object/schema.js.map +1 -0
  11. package/dist/durable-object/wal.d.ts +111 -0
  12. package/dist/durable-object/wal.d.ts.map +1 -0
  13. package/dist/durable-object/wal.js +200 -0
  14. package/dist/durable-object/wal.js.map +1 -0
  15. package/dist/index.d.ts +24 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +101 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mcp/adapter.d.ts +231 -0
  20. package/dist/mcp/adapter.d.ts.map +1 -0
  21. package/dist/mcp/adapter.js +502 -0
  22. package/dist/mcp/adapter.js.map +1 -0
  23. package/dist/mcp/sandbox.d.ts +261 -0
  24. package/dist/mcp/sandbox.d.ts.map +1 -0
  25. package/dist/mcp/sandbox.js +983 -0
  26. package/dist/mcp/sandbox.js.map +1 -0
  27. package/dist/mcp/sdk-adapter.d.ts +413 -0
  28. package/dist/mcp/sdk-adapter.d.ts.map +1 -0
  29. package/dist/mcp/sdk-adapter.js +672 -0
  30. package/dist/mcp/sdk-adapter.js.map +1 -0
  31. package/dist/mcp/tools.d.ts +133 -0
  32. package/dist/mcp/tools.d.ts.map +1 -0
  33. package/dist/mcp/tools.js +1604 -0
  34. package/dist/mcp/tools.js.map +1 -0
  35. package/dist/ops/blame.d.ts +148 -0
  36. package/dist/ops/blame.d.ts.map +1 -0
  37. package/dist/ops/blame.js +754 -0
  38. package/dist/ops/blame.js.map +1 -0
  39. package/dist/ops/branch.d.ts +215 -0
  40. package/dist/ops/branch.d.ts.map +1 -0
  41. package/dist/ops/branch.js +608 -0
  42. package/dist/ops/branch.js.map +1 -0
  43. package/dist/ops/commit-traversal.d.ts +209 -0
  44. package/dist/ops/commit-traversal.d.ts.map +1 -0
  45. package/dist/ops/commit-traversal.js +755 -0
  46. package/dist/ops/commit-traversal.js.map +1 -0
  47. package/dist/ops/commit.d.ts +221 -0
  48. package/dist/ops/commit.d.ts.map +1 -0
  49. package/dist/ops/commit.js +606 -0
  50. package/dist/ops/commit.js.map +1 -0
  51. package/dist/ops/merge-base.d.ts +223 -0
  52. package/dist/ops/merge-base.d.ts.map +1 -0
  53. package/dist/ops/merge-base.js +581 -0
  54. package/dist/ops/merge-base.js.map +1 -0
  55. package/dist/ops/merge.d.ts +385 -0
  56. package/dist/ops/merge.d.ts.map +1 -0
  57. package/dist/ops/merge.js +1203 -0
  58. package/dist/ops/merge.js.map +1 -0
  59. package/dist/ops/tag.d.ts +182 -0
  60. package/dist/ops/tag.d.ts.map +1 -0
  61. package/dist/ops/tag.js +608 -0
  62. package/dist/ops/tag.js.map +1 -0
  63. package/dist/ops/tree-builder.d.ts +82 -0
  64. package/dist/ops/tree-builder.d.ts.map +1 -0
  65. package/dist/ops/tree-builder.js +246 -0
  66. package/dist/ops/tree-builder.js.map +1 -0
  67. package/dist/ops/tree-diff.d.ts +243 -0
  68. package/dist/ops/tree-diff.d.ts.map +1 -0
  69. package/dist/ops/tree-diff.js +657 -0
  70. package/dist/ops/tree-diff.js.map +1 -0
  71. package/dist/pack/delta.d.ts +68 -0
  72. package/dist/pack/delta.d.ts.map +1 -0
  73. package/dist/pack/delta.js +343 -0
  74. package/dist/pack/delta.js.map +1 -0
  75. package/dist/pack/format.d.ts +84 -0
  76. package/dist/pack/format.d.ts.map +1 -0
  77. package/dist/pack/format.js +261 -0
  78. package/dist/pack/format.js.map +1 -0
  79. package/dist/pack/full-generation.d.ts +327 -0
  80. package/dist/pack/full-generation.d.ts.map +1 -0
  81. package/dist/pack/full-generation.js +1159 -0
  82. package/dist/pack/full-generation.js.map +1 -0
  83. package/dist/pack/generation.d.ts +118 -0
  84. package/dist/pack/generation.d.ts.map +1 -0
  85. package/dist/pack/generation.js +459 -0
  86. package/dist/pack/generation.js.map +1 -0
  87. package/dist/pack/index.d.ts +181 -0
  88. package/dist/pack/index.d.ts.map +1 -0
  89. package/dist/pack/index.js +552 -0
  90. package/dist/pack/index.js.map +1 -0
  91. package/dist/refs/branch.d.ts +224 -0
  92. package/dist/refs/branch.d.ts.map +1 -0
  93. package/dist/refs/branch.js +170 -0
  94. package/dist/refs/branch.js.map +1 -0
  95. package/dist/refs/storage.d.ts +208 -0
  96. package/dist/refs/storage.d.ts.map +1 -0
  97. package/dist/refs/storage.js +421 -0
  98. package/dist/refs/storage.js.map +1 -0
  99. package/dist/refs/tag.d.ts +230 -0
  100. package/dist/refs/tag.d.ts.map +1 -0
  101. package/dist/refs/tag.js +188 -0
  102. package/dist/refs/tag.js.map +1 -0
  103. package/dist/storage/lru-cache.d.ts +188 -0
  104. package/dist/storage/lru-cache.d.ts.map +1 -0
  105. package/dist/storage/lru-cache.js +410 -0
  106. package/dist/storage/lru-cache.js.map +1 -0
  107. package/dist/storage/object-index.d.ts +140 -0
  108. package/dist/storage/object-index.d.ts.map +1 -0
  109. package/dist/storage/object-index.js +166 -0
  110. package/dist/storage/object-index.js.map +1 -0
  111. package/dist/storage/r2-pack.d.ts +394 -0
  112. package/dist/storage/r2-pack.d.ts.map +1 -0
  113. package/dist/storage/r2-pack.js +1062 -0
  114. package/dist/storage/r2-pack.js.map +1 -0
  115. package/dist/tiered/cdc-pipeline.d.ts +316 -0
  116. package/dist/tiered/cdc-pipeline.d.ts.map +1 -0
  117. package/dist/tiered/cdc-pipeline.js +771 -0
  118. package/dist/tiered/cdc-pipeline.js.map +1 -0
  119. package/dist/tiered/migration.d.ts +242 -0
  120. package/dist/tiered/migration.d.ts.map +1 -0
  121. package/dist/tiered/migration.js +592 -0
  122. package/dist/tiered/migration.js.map +1 -0
  123. package/dist/tiered/parquet-writer.d.ts +248 -0
  124. package/dist/tiered/parquet-writer.d.ts.map +1 -0
  125. package/dist/tiered/parquet-writer.js +555 -0
  126. package/dist/tiered/parquet-writer.js.map +1 -0
  127. package/dist/tiered/read-path.d.ts +141 -0
  128. package/dist/tiered/read-path.d.ts.map +1 -0
  129. package/dist/tiered/read-path.js +204 -0
  130. package/dist/tiered/read-path.js.map +1 -0
  131. package/dist/types/objects.d.ts +53 -0
  132. package/dist/types/objects.d.ts.map +1 -0
  133. package/dist/types/objects.js +291 -0
  134. package/dist/types/objects.js.map +1 -0
  135. package/dist/types/storage.d.ts +117 -0
  136. package/dist/types/storage.d.ts.map +1 -0
  137. package/dist/types/storage.js +8 -0
  138. package/dist/types/storage.js.map +1 -0
  139. package/dist/utils/hash.d.ts +31 -0
  140. package/dist/utils/hash.d.ts.map +1 -0
  141. package/dist/utils/hash.js +60 -0
  142. package/dist/utils/hash.js.map +1 -0
  143. package/dist/utils/sha1.d.ts +26 -0
  144. package/dist/utils/sha1.d.ts.map +1 -0
  145. package/dist/utils/sha1.js +127 -0
  146. package/dist/utils/sha1.js.map +1 -0
  147. package/dist/wire/capabilities.d.ts +236 -0
  148. package/dist/wire/capabilities.d.ts.map +1 -0
  149. package/dist/wire/capabilities.js +437 -0
  150. package/dist/wire/capabilities.js.map +1 -0
  151. package/dist/wire/pkt-line.d.ts +67 -0
  152. package/dist/wire/pkt-line.d.ts.map +1 -0
  153. package/dist/wire/pkt-line.js +145 -0
  154. package/dist/wire/pkt-line.js.map +1 -0
  155. package/dist/wire/receive-pack.d.ts +302 -0
  156. package/dist/wire/receive-pack.d.ts.map +1 -0
  157. package/dist/wire/receive-pack.js +885 -0
  158. package/dist/wire/receive-pack.js.map +1 -0
  159. package/dist/wire/smart-http.d.ts +321 -0
  160. package/dist/wire/smart-http.d.ts.map +1 -0
  161. package/dist/wire/smart-http.js +654 -0
  162. package/dist/wire/smart-http.js.map +1 -0
  163. package/dist/wire/upload-pack.d.ts +333 -0
  164. package/dist/wire/upload-pack.d.ts.map +1 -0
  165. package/dist/wire/upload-pack.js +850 -0
  166. package/dist/wire/upload-pack.js.map +1 -0
  167. package/package.json +61 -0
@@ -0,0 +1,581 @@
1
+ /**
2
+ * Merge Base Finding Operations
3
+ *
4
+ * Provides functionality for finding merge bases between commits,
5
+ * which is essential for merge operations, rebasing, and understanding
6
+ * branch relationships in the commit graph.
7
+ *
8
+ * A merge base is the best common ancestor(s) of two or more commits.
9
+ * The "best" common ancestor is one that is not an ancestor of any
10
+ * other common ancestor (i.e., a maximal common ancestor).
11
+ */
12
+ // ============================================================================
13
+ // Helper Functions
14
+ // ============================================================================
15
+ /**
16
+ * Get all ancestors of a commit (including itself)
17
+ * Uses iterative BFS to avoid stack overflow with deep histories
18
+ */
19
+ async function getAncestors(provider, sha) {
20
+ const visited = new Set();
21
+ const queue = [sha];
22
+ while (queue.length > 0) {
23
+ const current = queue.shift();
24
+ if (visited.has(current)) {
25
+ continue;
26
+ }
27
+ const commit = await provider.getCommit(current);
28
+ if (!commit) {
29
+ continue;
30
+ }
31
+ visited.add(current);
32
+ for (const parent of commit.parents) {
33
+ if (!visited.has(parent)) {
34
+ queue.push(parent);
35
+ }
36
+ }
37
+ }
38
+ return visited;
39
+ }
40
+ /**
41
+ * Find all common ancestors of two commits
42
+ */
43
+ async function findCommonAncestors(provider, sha1, sha2) {
44
+ const ancestors1 = await getAncestors(provider, sha1);
45
+ const ancestors2 = await getAncestors(provider, sha2);
46
+ const common = new Set();
47
+ for (const sha of ancestors1) {
48
+ if (ancestors2.has(sha)) {
49
+ common.add(sha);
50
+ }
51
+ }
52
+ return common;
53
+ }
54
+ /**
55
+ * Filter common ancestors to only keep maximal ones
56
+ * (those that are not ancestors of any other common ancestor)
57
+ */
58
+ async function filterToMaximalAncestors(provider, commonAncestors) {
59
+ const ancestorsList = Array.from(commonAncestors);
60
+ if (ancestorsList.length === 0) {
61
+ return [];
62
+ }
63
+ if (ancestorsList.length === 1) {
64
+ return ancestorsList;
65
+ }
66
+ // For each ancestor, check if it's an ancestor of any other ancestor
67
+ const isAncestorOfAnother = new Map();
68
+ for (const sha of ancestorsList) {
69
+ isAncestorOfAnother.set(sha, false);
70
+ }
71
+ // Build ancestor sets for each common ancestor
72
+ const ancestorSets = new Map();
73
+ for (const sha of ancestorsList) {
74
+ const ancestors = await getAncestors(provider, sha);
75
+ // Remove the sha itself from its ancestors for comparison
76
+ ancestors.delete(sha);
77
+ ancestorSets.set(sha, ancestors);
78
+ }
79
+ // Check which ones are ancestors of others
80
+ for (const sha of ancestorsList) {
81
+ for (const otherSha of ancestorsList) {
82
+ if (sha !== otherSha) {
83
+ const otherAncestors = ancestorSets.get(otherSha);
84
+ if (otherAncestors.has(sha)) {
85
+ isAncestorOfAnother.set(sha, true);
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ }
91
+ // Return only maximal ancestors
92
+ return ancestorsList.filter(sha => !isAncestorOfAnother.get(sha));
93
+ }
94
+ // ============================================================================
95
+ // Core Functions
96
+ // ============================================================================
97
+ /**
98
+ * Find the merge base of two or more commits
99
+ *
100
+ * Given two commits, finds the best common ancestor (merge base).
101
+ * Given multiple commits, finds the merge base of all of them.
102
+ *
103
+ * This is equivalent to `git merge-base`.
104
+ *
105
+ * @param provider - The commit provider for fetching commits
106
+ * @param commits - Two or more commit SHAs
107
+ * @param options - Options for the merge base search
108
+ * @returns The merge base result
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * const result = await findMergeBase(provider, ['abc123', 'def456'])
113
+ * if (result.hasCommonHistory) {
114
+ * console.log('Merge base:', result.bases[0])
115
+ * }
116
+ * ```
117
+ */
118
+ export async function findMergeBase(provider, commits, options = {}) {
119
+ // Handle edge cases
120
+ if (commits.length === 0) {
121
+ return {
122
+ bases: [],
123
+ isUnique: false,
124
+ hasCommonHistory: false,
125
+ count: 0
126
+ };
127
+ }
128
+ if (commits.length === 1) {
129
+ const commit = await provider.getCommit(commits[0]);
130
+ if (!commit) {
131
+ return {
132
+ bases: [],
133
+ isUnique: false,
134
+ hasCommonHistory: false,
135
+ count: 0
136
+ };
137
+ }
138
+ return {
139
+ bases: [commits[0]],
140
+ isUnique: true,
141
+ hasCommonHistory: true,
142
+ count: 1
143
+ };
144
+ }
145
+ // Handle independent option
146
+ if (options.independent) {
147
+ const independent = await findIndependentCommits(provider, commits);
148
+ return {
149
+ bases: independent,
150
+ isUnique: independent.length === 1,
151
+ hasCommonHistory: independent.length > 0,
152
+ count: independent.length
153
+ };
154
+ }
155
+ // Handle octopus option
156
+ if (options.octopus || commits.length > 2) {
157
+ const bases = await findOctopusMergeBase(provider, commits);
158
+ return {
159
+ bases,
160
+ isUnique: bases.length === 1,
161
+ hasCommonHistory: bases.length > 0,
162
+ count: bases.length
163
+ };
164
+ }
165
+ // Handle fork point option
166
+ if (options.forkPoint && commits.length === 2) {
167
+ const result = await findForkPoint(provider, commits[0], commits[1]);
168
+ if (result.found && result.forkPoint) {
169
+ return {
170
+ bases: [result.forkPoint],
171
+ isUnique: true,
172
+ hasCommonHistory: true,
173
+ count: 1
174
+ };
175
+ }
176
+ }
177
+ // Standard two-commit merge base
178
+ const [sha1, sha2] = commits;
179
+ // Check if either commit doesn't exist
180
+ const commit1 = await provider.getCommit(sha1);
181
+ const commit2 = await provider.getCommit(sha2);
182
+ if (!commit1 || !commit2) {
183
+ return {
184
+ bases: [],
185
+ isUnique: false,
186
+ hasCommonHistory: false,
187
+ count: 0
188
+ };
189
+ }
190
+ // Find all common ancestors
191
+ const commonAncestors = await findCommonAncestors(provider, sha1, sha2);
192
+ if (commonAncestors.size === 0) {
193
+ return {
194
+ bases: [],
195
+ isUnique: false,
196
+ hasCommonHistory: false,
197
+ count: 0
198
+ };
199
+ }
200
+ // Filter to maximal ancestors
201
+ const maximalBases = await filterToMaximalAncestors(provider, commonAncestors);
202
+ if (options.all) {
203
+ return {
204
+ bases: maximalBases,
205
+ isUnique: maximalBases.length === 1,
206
+ hasCommonHistory: true,
207
+ count: maximalBases.length
208
+ };
209
+ }
210
+ // Default: return just one merge base
211
+ return {
212
+ bases: maximalBases.length > 0 ? [maximalBases[0]] : [],
213
+ isUnique: maximalBases.length === 1,
214
+ hasCommonHistory: maximalBases.length > 0,
215
+ count: 1
216
+ };
217
+ }
218
+ /**
219
+ * Find all merge bases between two commits
220
+ *
221
+ * Unlike findMergeBase with all=true, this specifically finds
222
+ * all maximal common ancestors, which is useful for criss-cross
223
+ * merge situations.
224
+ *
225
+ * This is equivalent to `git merge-base --all`.
226
+ *
227
+ * @param provider - The commit provider for fetching commits
228
+ * @param commit1 - First commit SHA
229
+ * @param commit2 - Second commit SHA
230
+ * @returns Array of all merge base SHAs
231
+ *
232
+ * @example
233
+ * ```ts
234
+ * const bases = await findAllMergeBases(provider, 'abc123', 'def456')
235
+ * if (bases.length > 1) {
236
+ * console.log('Multiple merge bases (criss-cross merge):', bases)
237
+ * }
238
+ * ```
239
+ */
240
+ export async function findAllMergeBases(provider, commit1, commit2) {
241
+ const result = await findMergeBase(provider, [commit1, commit2], { all: true });
242
+ return result.bases;
243
+ }
244
+ /**
245
+ * Find the fork point of a branch relative to another ref
246
+ *
247
+ * Calculates where a branch forked off from another branch,
248
+ * taking into account any rebases that may have occurred.
249
+ * This uses reflog information when available.
250
+ *
251
+ * This is equivalent to `git merge-base --fork-point`.
252
+ *
253
+ * @param provider - The commit provider for fetching commits
254
+ * @param ref - The branch ref to analyze
255
+ * @param baseRef - The base ref to compare against
256
+ * @param reflog - Optional reflog entries for more accurate detection
257
+ * @returns The fork point result
258
+ *
259
+ * @example
260
+ * ```ts
261
+ * const result = await findForkPoint(provider, 'feature-branch', 'main')
262
+ * if (result.found) {
263
+ * console.log('Forked from:', result.forkPoint)
264
+ * }
265
+ * ```
266
+ */
267
+ export async function findForkPoint(provider, ref, baseRef, reflog) {
268
+ // If reflog is provided, use it for better detection
269
+ if (reflog && reflog.length > 0) {
270
+ // Get ancestors of ref
271
+ const refAncestors = await getAncestors(provider, ref);
272
+ // Check each reflog entry to find the fork point
273
+ for (const entry of reflog) {
274
+ if (refAncestors.has(entry)) {
275
+ // Found a common point in the reflog
276
+ // Calculate commits since fork
277
+ let commitsSinceFork = 0;
278
+ let current = ref;
279
+ while (current !== entry) {
280
+ const commit = await provider.getCommit(current);
281
+ if (!commit || commit.parents.length === 0)
282
+ break;
283
+ commitsSinceFork++;
284
+ current = commit.parents[0];
285
+ }
286
+ return {
287
+ forkPoint: entry,
288
+ ref,
289
+ found: true,
290
+ commitsSinceFork
291
+ };
292
+ }
293
+ }
294
+ }
295
+ // Standard fork point detection: find merge base
296
+ const result = await findMergeBase(provider, [ref, baseRef]);
297
+ if (!result.hasCommonHistory || result.bases.length === 0) {
298
+ return {
299
+ forkPoint: null,
300
+ ref,
301
+ found: false,
302
+ commitsSinceFork: 0
303
+ };
304
+ }
305
+ const forkPoint = result.bases[0];
306
+ // Calculate commits since fork
307
+ let commitsSinceFork = 0;
308
+ let current = ref;
309
+ const visited = new Set();
310
+ while (current !== forkPoint && !visited.has(current)) {
311
+ visited.add(current);
312
+ const commit = await provider.getCommit(current);
313
+ if (!commit)
314
+ break;
315
+ if (current === forkPoint)
316
+ break;
317
+ commitsSinceFork++;
318
+ if (commit.parents.length === 0)
319
+ break;
320
+ current = commit.parents[0];
321
+ }
322
+ return {
323
+ forkPoint,
324
+ ref,
325
+ found: true,
326
+ commitsSinceFork
327
+ };
328
+ }
329
+ /**
330
+ * Check if one commit is an ancestor of another
331
+ *
332
+ * Returns true if the first commit is reachable from the second
333
+ * commit by following parent links.
334
+ *
335
+ * This is equivalent to `git merge-base --is-ancestor`.
336
+ *
337
+ * @param provider - The commit provider for fetching commits
338
+ * @param potentialAncestor - The commit to check as potential ancestor
339
+ * @param commit - The commit to start walking from
340
+ * @returns True if potentialAncestor is an ancestor of commit
341
+ *
342
+ * @example
343
+ * ```ts
344
+ * if (await isAncestor(provider, 'oldcommit', 'newcommit')) {
345
+ * console.log('oldcommit is an ancestor of newcommit')
346
+ * }
347
+ * ```
348
+ */
349
+ export async function isAncestor(provider, potentialAncestor, commit) {
350
+ // Same commit is considered its own ancestor
351
+ if (potentialAncestor === commit) {
352
+ return true;
353
+ }
354
+ const ancestors = await getAncestors(provider, commit);
355
+ return ancestors.has(potentialAncestor);
356
+ }
357
+ /**
358
+ * Check ancestor relationship and return additional information
359
+ *
360
+ * @param provider - The commit provider for fetching commits
361
+ * @param potentialAncestor - The commit to check as potential ancestor
362
+ * @param commit - The commit to start walking from
363
+ * @returns Detailed ancestor check result
364
+ */
365
+ export async function checkAncestor(provider, potentialAncestor, commit) {
366
+ // Same commit
367
+ if (potentialAncestor === commit) {
368
+ return {
369
+ isAncestor: true,
370
+ distance: 0
371
+ };
372
+ }
373
+ // BFS to find the shortest path
374
+ const queue = [{ sha: commit, distance: 0 }];
375
+ const visited = new Set();
376
+ while (queue.length > 0) {
377
+ const { sha, distance } = queue.shift();
378
+ if (visited.has(sha))
379
+ continue;
380
+ visited.add(sha);
381
+ if (sha === potentialAncestor) {
382
+ return {
383
+ isAncestor: true,
384
+ distance
385
+ };
386
+ }
387
+ const commitObj = await provider.getCommit(sha);
388
+ if (!commitObj)
389
+ continue;
390
+ for (const parent of commitObj.parents) {
391
+ if (!visited.has(parent)) {
392
+ queue.push({ sha: parent, distance: distance + 1 });
393
+ }
394
+ }
395
+ }
396
+ return {
397
+ isAncestor: false,
398
+ distance: -1
399
+ };
400
+ }
401
+ // ============================================================================
402
+ // Advanced Functions
403
+ // ============================================================================
404
+ /**
405
+ * Find independent commits from a list
406
+ *
407
+ * Returns the subset of commits that are not reachable from
408
+ * any other commit in the list.
409
+ *
410
+ * This is equivalent to `git merge-base --independent`.
411
+ *
412
+ * @param provider - The commit provider for fetching commits
413
+ * @param commits - List of commit SHAs to analyze
414
+ * @returns Array of independent commit SHAs
415
+ *
416
+ * @example
417
+ * ```ts
418
+ * const independent = await findIndependentCommits(provider, [a, b, c])
419
+ * // Returns commits that are not ancestors of others
420
+ * ```
421
+ */
422
+ export async function findIndependentCommits(provider, commits) {
423
+ if (commits.length <= 1) {
424
+ return [...commits];
425
+ }
426
+ // Build ancestor sets for each commit
427
+ const ancestorSets = new Map();
428
+ for (const sha of commits) {
429
+ const ancestors = await getAncestors(provider, sha);
430
+ // Remove the commit itself from its ancestor set
431
+ ancestors.delete(sha);
432
+ ancestorSets.set(sha, ancestors);
433
+ }
434
+ // A commit is independent if it's not an ancestor of any other commit in the list
435
+ const independent = [];
436
+ for (const sha of commits) {
437
+ let isAncestorOfAnother = false;
438
+ for (const otherSha of commits) {
439
+ if (sha !== otherSha) {
440
+ const otherAncestors = ancestorSets.get(otherSha);
441
+ if (otherAncestors.has(sha)) {
442
+ isAncestorOfAnother = true;
443
+ break;
444
+ }
445
+ }
446
+ }
447
+ if (!isAncestorOfAnother) {
448
+ independent.push(sha);
449
+ }
450
+ }
451
+ return independent;
452
+ }
453
+ /**
454
+ * Find the octopus merge base
455
+ *
456
+ * For merging more than two branches, finds a suitable merge base
457
+ * that works for all branches.
458
+ *
459
+ * @param provider - The commit provider for fetching commits
460
+ * @param commits - List of commit SHAs (3 or more)
461
+ * @returns The octopus merge base SHA(s)
462
+ */
463
+ export async function findOctopusMergeBase(provider, commits) {
464
+ if (commits.length === 0) {
465
+ return [];
466
+ }
467
+ if (commits.length === 1) {
468
+ const commit = await provider.getCommit(commits[0]);
469
+ return commit ? [commits[0]] : [];
470
+ }
471
+ if (commits.length === 2) {
472
+ return findAllMergeBases(provider, commits[0], commits[1]);
473
+ }
474
+ // For 3+ commits, iteratively find the merge base
475
+ // Start with the first two commits
476
+ let currentBases = await findAllMergeBases(provider, commits[0], commits[1]);
477
+ if (currentBases.length === 0) {
478
+ return [];
479
+ }
480
+ // For each additional commit, find the merge base with current bases
481
+ for (let i = 2; i < commits.length; i++) {
482
+ const nextCommit = commits[i];
483
+ const newBases = [];
484
+ for (const base of currentBases) {
485
+ const bases = await findAllMergeBases(provider, base, nextCommit);
486
+ for (const b of bases) {
487
+ if (!newBases.includes(b)) {
488
+ newBases.push(b);
489
+ }
490
+ }
491
+ }
492
+ if (newBases.length === 0) {
493
+ return [];
494
+ }
495
+ currentBases = newBases;
496
+ }
497
+ return currentBases;
498
+ }
499
+ /**
500
+ * Compute the three-way merge base for a merge operation
501
+ *
502
+ * Given the current HEAD, merge target, and optionally a common ancestor,
503
+ * returns the appropriate base for a three-way merge.
504
+ *
505
+ * @param provider - The commit provider for fetching commits
506
+ * @param ours - Our commit (HEAD)
507
+ * @param theirs - Their commit (merge target)
508
+ * @returns The merge base for three-way merge
509
+ */
510
+ export async function computeThreeWayMergeBase(provider, ours, theirs) {
511
+ return findMergeBase(provider, [ours, theirs]);
512
+ }
513
+ /**
514
+ * Check if commits have any common history
515
+ *
516
+ * @param provider - The commit provider for fetching commits
517
+ * @param commits - List of commit SHAs to check
518
+ * @returns True if all commits share common history
519
+ */
520
+ export async function hasCommonHistory(provider, commits) {
521
+ if (commits.length <= 1) {
522
+ return true;
523
+ }
524
+ // Check pairwise - for common history, all pairs must have a common ancestor
525
+ for (let i = 0; i < commits.length; i++) {
526
+ for (let j = i + 1; j < commits.length; j++) {
527
+ const common = await findCommonAncestors(provider, commits[i], commits[j]);
528
+ if (common.size === 0) {
529
+ return false;
530
+ }
531
+ }
532
+ }
533
+ return true;
534
+ }
535
+ /**
536
+ * Calculate merge base for a recursive merge
537
+ *
538
+ * When there are multiple merge bases (criss-cross merge situation),
539
+ * this creates a virtual merge base by merging the merge bases.
540
+ *
541
+ * @param provider - The commit provider for fetching commits
542
+ * @param commit1 - First commit SHA
543
+ * @param commit2 - Second commit SHA
544
+ * @returns The recursive merge base
545
+ */
546
+ export async function computeRecursiveMergeBase(provider, commit1, commit2) {
547
+ const allBases = await findAllMergeBases(provider, commit1, commit2);
548
+ if (allBases.length === 0) {
549
+ return {
550
+ bases: [],
551
+ isUnique: false,
552
+ hasCommonHistory: false,
553
+ count: 0
554
+ };
555
+ }
556
+ if (allBases.length === 1) {
557
+ return {
558
+ bases: allBases,
559
+ isUnique: true,
560
+ hasCommonHistory: true,
561
+ count: 1
562
+ };
563
+ }
564
+ // Multiple merge bases - recursively merge them
565
+ // In a real implementation, this would create virtual merge commits
566
+ // For now, we return the result of recursively finding merge bases of the bases
567
+ let currentBase = allBases[0];
568
+ for (let i = 1; i < allBases.length; i++) {
569
+ const result = await findMergeBase(provider, [currentBase, allBases[i]]);
570
+ if (result.bases.length > 0) {
571
+ currentBase = result.bases[0];
572
+ }
573
+ }
574
+ return {
575
+ bases: [currentBase],
576
+ isUnique: true,
577
+ hasCommonHistory: true,
578
+ count: 1
579
+ };
580
+ }
581
+ //# sourceMappingURL=merge-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-base.js","sourceRoot":"","sources":["../../src/ops/merge-base.ts"],"names":[],"mappings":"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"}