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.
- package/LICENSE +21 -0
- package/README.md +156 -0
- package/dist/durable-object/object-store.d.ts +113 -0
- package/dist/durable-object/object-store.d.ts.map +1 -0
- package/dist/durable-object/object-store.js +387 -0
- package/dist/durable-object/object-store.js.map +1 -0
- package/dist/durable-object/schema.d.ts +17 -0
- package/dist/durable-object/schema.d.ts.map +1 -0
- package/dist/durable-object/schema.js +43 -0
- package/dist/durable-object/schema.js.map +1 -0
- package/dist/durable-object/wal.d.ts +111 -0
- package/dist/durable-object/wal.d.ts.map +1 -0
- package/dist/durable-object/wal.js +200 -0
- package/dist/durable-object/wal.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/adapter.d.ts +231 -0
- package/dist/mcp/adapter.d.ts.map +1 -0
- package/dist/mcp/adapter.js +502 -0
- package/dist/mcp/adapter.js.map +1 -0
- package/dist/mcp/sandbox.d.ts +261 -0
- package/dist/mcp/sandbox.d.ts.map +1 -0
- package/dist/mcp/sandbox.js +983 -0
- package/dist/mcp/sandbox.js.map +1 -0
- package/dist/mcp/sdk-adapter.d.ts +413 -0
- package/dist/mcp/sdk-adapter.d.ts.map +1 -0
- package/dist/mcp/sdk-adapter.js +672 -0
- package/dist/mcp/sdk-adapter.js.map +1 -0
- package/dist/mcp/tools.d.ts +133 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +1604 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/ops/blame.d.ts +148 -0
- package/dist/ops/blame.d.ts.map +1 -0
- package/dist/ops/blame.js +754 -0
- package/dist/ops/blame.js.map +1 -0
- package/dist/ops/branch.d.ts +215 -0
- package/dist/ops/branch.d.ts.map +1 -0
- package/dist/ops/branch.js +608 -0
- package/dist/ops/branch.js.map +1 -0
- package/dist/ops/commit-traversal.d.ts +209 -0
- package/dist/ops/commit-traversal.d.ts.map +1 -0
- package/dist/ops/commit-traversal.js +755 -0
- package/dist/ops/commit-traversal.js.map +1 -0
- package/dist/ops/commit.d.ts +221 -0
- package/dist/ops/commit.d.ts.map +1 -0
- package/dist/ops/commit.js +606 -0
- package/dist/ops/commit.js.map +1 -0
- package/dist/ops/merge-base.d.ts +223 -0
- package/dist/ops/merge-base.d.ts.map +1 -0
- package/dist/ops/merge-base.js +581 -0
- package/dist/ops/merge-base.js.map +1 -0
- package/dist/ops/merge.d.ts +385 -0
- package/dist/ops/merge.d.ts.map +1 -0
- package/dist/ops/merge.js +1203 -0
- package/dist/ops/merge.js.map +1 -0
- package/dist/ops/tag.d.ts +182 -0
- package/dist/ops/tag.d.ts.map +1 -0
- package/dist/ops/tag.js +608 -0
- package/dist/ops/tag.js.map +1 -0
- package/dist/ops/tree-builder.d.ts +82 -0
- package/dist/ops/tree-builder.d.ts.map +1 -0
- package/dist/ops/tree-builder.js +246 -0
- package/dist/ops/tree-builder.js.map +1 -0
- package/dist/ops/tree-diff.d.ts +243 -0
- package/dist/ops/tree-diff.d.ts.map +1 -0
- package/dist/ops/tree-diff.js +657 -0
- package/dist/ops/tree-diff.js.map +1 -0
- package/dist/pack/delta.d.ts +68 -0
- package/dist/pack/delta.d.ts.map +1 -0
- package/dist/pack/delta.js +343 -0
- package/dist/pack/delta.js.map +1 -0
- package/dist/pack/format.d.ts +84 -0
- package/dist/pack/format.d.ts.map +1 -0
- package/dist/pack/format.js +261 -0
- package/dist/pack/format.js.map +1 -0
- package/dist/pack/full-generation.d.ts +327 -0
- package/dist/pack/full-generation.d.ts.map +1 -0
- package/dist/pack/full-generation.js +1159 -0
- package/dist/pack/full-generation.js.map +1 -0
- package/dist/pack/generation.d.ts +118 -0
- package/dist/pack/generation.d.ts.map +1 -0
- package/dist/pack/generation.js +459 -0
- package/dist/pack/generation.js.map +1 -0
- package/dist/pack/index.d.ts +181 -0
- package/dist/pack/index.d.ts.map +1 -0
- package/dist/pack/index.js +552 -0
- package/dist/pack/index.js.map +1 -0
- package/dist/refs/branch.d.ts +224 -0
- package/dist/refs/branch.d.ts.map +1 -0
- package/dist/refs/branch.js +170 -0
- package/dist/refs/branch.js.map +1 -0
- package/dist/refs/storage.d.ts +208 -0
- package/dist/refs/storage.d.ts.map +1 -0
- package/dist/refs/storage.js +421 -0
- package/dist/refs/storage.js.map +1 -0
- package/dist/refs/tag.d.ts +230 -0
- package/dist/refs/tag.d.ts.map +1 -0
- package/dist/refs/tag.js +188 -0
- package/dist/refs/tag.js.map +1 -0
- package/dist/storage/lru-cache.d.ts +188 -0
- package/dist/storage/lru-cache.d.ts.map +1 -0
- package/dist/storage/lru-cache.js +410 -0
- package/dist/storage/lru-cache.js.map +1 -0
- package/dist/storage/object-index.d.ts +140 -0
- package/dist/storage/object-index.d.ts.map +1 -0
- package/dist/storage/object-index.js +166 -0
- package/dist/storage/object-index.js.map +1 -0
- package/dist/storage/r2-pack.d.ts +394 -0
- package/dist/storage/r2-pack.d.ts.map +1 -0
- package/dist/storage/r2-pack.js +1062 -0
- package/dist/storage/r2-pack.js.map +1 -0
- package/dist/tiered/cdc-pipeline.d.ts +316 -0
- package/dist/tiered/cdc-pipeline.d.ts.map +1 -0
- package/dist/tiered/cdc-pipeline.js +771 -0
- package/dist/tiered/cdc-pipeline.js.map +1 -0
- package/dist/tiered/migration.d.ts +242 -0
- package/dist/tiered/migration.d.ts.map +1 -0
- package/dist/tiered/migration.js +592 -0
- package/dist/tiered/migration.js.map +1 -0
- package/dist/tiered/parquet-writer.d.ts +248 -0
- package/dist/tiered/parquet-writer.d.ts.map +1 -0
- package/dist/tiered/parquet-writer.js +555 -0
- package/dist/tiered/parquet-writer.js.map +1 -0
- package/dist/tiered/read-path.d.ts +141 -0
- package/dist/tiered/read-path.d.ts.map +1 -0
- package/dist/tiered/read-path.js +204 -0
- package/dist/tiered/read-path.js.map +1 -0
- package/dist/types/objects.d.ts +53 -0
- package/dist/types/objects.d.ts.map +1 -0
- package/dist/types/objects.js +291 -0
- package/dist/types/objects.js.map +1 -0
- package/dist/types/storage.d.ts +117 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +8 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/utils/hash.d.ts +31 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +60 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/sha1.d.ts +26 -0
- package/dist/utils/sha1.d.ts.map +1 -0
- package/dist/utils/sha1.js +127 -0
- package/dist/utils/sha1.js.map +1 -0
- package/dist/wire/capabilities.d.ts +236 -0
- package/dist/wire/capabilities.d.ts.map +1 -0
- package/dist/wire/capabilities.js +437 -0
- package/dist/wire/capabilities.js.map +1 -0
- package/dist/wire/pkt-line.d.ts +67 -0
- package/dist/wire/pkt-line.d.ts.map +1 -0
- package/dist/wire/pkt-line.js +145 -0
- package/dist/wire/pkt-line.js.map +1 -0
- package/dist/wire/receive-pack.d.ts +302 -0
- package/dist/wire/receive-pack.d.ts.map +1 -0
- package/dist/wire/receive-pack.js +885 -0
- package/dist/wire/receive-pack.js.map +1 -0
- package/dist/wire/smart-http.d.ts +321 -0
- package/dist/wire/smart-http.d.ts.map +1 -0
- package/dist/wire/smart-http.js +654 -0
- package/dist/wire/smart-http.js.map +1 -0
- package/dist/wire/upload-pack.d.ts +333 -0
- package/dist/wire/upload-pack.d.ts.map +1 -0
- package/dist/wire/upload-pack.js +850 -0
- package/dist/wire/upload-pack.js.map +1 -0
- 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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"}
|