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,657 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree Diff Operations
|
|
3
|
+
*
|
|
4
|
+
* This module provides functionality for comparing Git trees and detecting
|
|
5
|
+
* changes between them, including added, deleted, modified, renamed, and
|
|
6
|
+
* copied files.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Status of a file in a diff
|
|
10
|
+
*/
|
|
11
|
+
export var DiffStatus;
|
|
12
|
+
(function (DiffStatus) {
|
|
13
|
+
/** File was added */
|
|
14
|
+
DiffStatus["ADDED"] = "A";
|
|
15
|
+
/** File was deleted */
|
|
16
|
+
DiffStatus["DELETED"] = "D";
|
|
17
|
+
/** File was modified */
|
|
18
|
+
DiffStatus["MODIFIED"] = "M";
|
|
19
|
+
/** File was renamed */
|
|
20
|
+
DiffStatus["RENAMED"] = "R";
|
|
21
|
+
/** File was copied */
|
|
22
|
+
DiffStatus["COPIED"] = "C";
|
|
23
|
+
/** File type changed (e.g., file to symlink) */
|
|
24
|
+
DiffStatus["TYPE_CHANGED"] = "T";
|
|
25
|
+
/** Unmerged (conflict) */
|
|
26
|
+
DiffStatus["UNMERGED"] = "U";
|
|
27
|
+
})(DiffStatus || (DiffStatus = {}));
|
|
28
|
+
/**
|
|
29
|
+
* File mode constants for Git objects
|
|
30
|
+
*/
|
|
31
|
+
export var FileMode;
|
|
32
|
+
(function (FileMode) {
|
|
33
|
+
/** Regular file (not executable) */
|
|
34
|
+
FileMode["REGULAR"] = "100644";
|
|
35
|
+
/** Executable file */
|
|
36
|
+
FileMode["EXECUTABLE"] = "100755";
|
|
37
|
+
/** Symbolic link */
|
|
38
|
+
FileMode["SYMLINK"] = "120000";
|
|
39
|
+
/** Git submodule (gitlink) */
|
|
40
|
+
FileMode["GITLINK"] = "160000";
|
|
41
|
+
/** Directory (tree) */
|
|
42
|
+
FileMode["TREE"] = "040000";
|
|
43
|
+
})(FileMode || (FileMode = {}));
|
|
44
|
+
/**
|
|
45
|
+
* Check if a file appears to be binary based on its content
|
|
46
|
+
*
|
|
47
|
+
* A file is considered binary if it contains null bytes in the first
|
|
48
|
+
* 8000 bytes (similar to Git's heuristic).
|
|
49
|
+
*
|
|
50
|
+
* @param content - File content to check
|
|
51
|
+
* @returns true if the file appears to be binary
|
|
52
|
+
*/
|
|
53
|
+
export function isBinaryContent(content) {
|
|
54
|
+
// Check first 8000 bytes for null bytes
|
|
55
|
+
const checkLength = Math.min(content.length, 8000);
|
|
56
|
+
for (let i = 0; i < checkLength; i++) {
|
|
57
|
+
if (content[i] === 0x00) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Calculate similarity between two blobs for rename/copy detection
|
|
65
|
+
*
|
|
66
|
+
* Uses a simple heuristic based on shared content.
|
|
67
|
+
*
|
|
68
|
+
* @param store - Object store for retrieving blob contents
|
|
69
|
+
* @param oldSha - SHA of the old blob
|
|
70
|
+
* @param newSha - SHA of the new blob
|
|
71
|
+
* @returns Promise resolving to similarity percentage (0-100)
|
|
72
|
+
*/
|
|
73
|
+
export async function calculateSimilarity(store, oldSha, newSha) {
|
|
74
|
+
// If same SHA, 100% similar
|
|
75
|
+
if (oldSha === newSha) {
|
|
76
|
+
return 100;
|
|
77
|
+
}
|
|
78
|
+
const [oldBlob, newBlob] = await Promise.all([
|
|
79
|
+
store.getBlob(oldSha),
|
|
80
|
+
store.getBlob(newSha)
|
|
81
|
+
]);
|
|
82
|
+
if (!oldBlob || !newBlob) {
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
// Use a simple character-by-character comparison for similarity
|
|
86
|
+
// This is a basic approach; a more sophisticated algorithm would use
|
|
87
|
+
// something like xdiff or Myers diff
|
|
88
|
+
const oldStr = new TextDecoder().decode(oldBlob);
|
|
89
|
+
const newStr = new TextDecoder().decode(newBlob);
|
|
90
|
+
if (oldStr === newStr) {
|
|
91
|
+
return 100;
|
|
92
|
+
}
|
|
93
|
+
// Count matching characters at each position
|
|
94
|
+
const maxLen = Math.max(oldStr.length, newStr.length);
|
|
95
|
+
if (maxLen === 0) {
|
|
96
|
+
return 100;
|
|
97
|
+
}
|
|
98
|
+
let matches = 0;
|
|
99
|
+
const minLen = Math.min(oldStr.length, newStr.length);
|
|
100
|
+
for (let i = 0; i < minLen; i++) {
|
|
101
|
+
if (oldStr[i] === newStr[i]) {
|
|
102
|
+
matches++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return Math.round((matches / maxLen) * 100);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Parse a file mode string and determine its type
|
|
109
|
+
*
|
|
110
|
+
* @param mode - File mode string (e.g., '100644', '040000')
|
|
111
|
+
* @returns Object with mode information
|
|
112
|
+
*/
|
|
113
|
+
export function parseMode(mode) {
|
|
114
|
+
return {
|
|
115
|
+
isFile: mode === FileMode.REGULAR || mode === FileMode.EXECUTABLE,
|
|
116
|
+
isDirectory: mode === FileMode.TREE,
|
|
117
|
+
isSymlink: mode === FileMode.SYMLINK,
|
|
118
|
+
isSubmodule: mode === FileMode.GITLINK,
|
|
119
|
+
isExecutable: mode === FileMode.EXECUTABLE
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if a mode change represents a significant type change
|
|
124
|
+
*
|
|
125
|
+
* @param oldMode - Old file mode
|
|
126
|
+
* @param newMode - New file mode
|
|
127
|
+
* @returns true if the mode change is significant (e.g., file to symlink)
|
|
128
|
+
*/
|
|
129
|
+
export function isModeChangeSignificant(oldMode, newMode) {
|
|
130
|
+
if (oldMode === newMode) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
const oldParsed = parseMode(oldMode);
|
|
134
|
+
const newParsed = parseMode(newMode);
|
|
135
|
+
// Type changes are significant (file to symlink, file to submodule, etc.)
|
|
136
|
+
if (oldParsed.isFile && newParsed.isSymlink)
|
|
137
|
+
return true;
|
|
138
|
+
if (oldParsed.isFile && newParsed.isSubmodule)
|
|
139
|
+
return true;
|
|
140
|
+
if (oldParsed.isSymlink && newParsed.isFile)
|
|
141
|
+
return true;
|
|
142
|
+
if (oldParsed.isSymlink && newParsed.isSubmodule)
|
|
143
|
+
return true;
|
|
144
|
+
if (oldParsed.isSubmodule && newParsed.isFile)
|
|
145
|
+
return true;
|
|
146
|
+
if (oldParsed.isSubmodule && newParsed.isSymlink)
|
|
147
|
+
return true;
|
|
148
|
+
// Regular to executable is not significant
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Simple glob pattern matching
|
|
153
|
+
*/
|
|
154
|
+
function matchGlob(pattern, path) {
|
|
155
|
+
// Convert glob pattern to regex
|
|
156
|
+
const regexPattern = pattern
|
|
157
|
+
.replace(/\./g, '\\.')
|
|
158
|
+
.replace(/\*\*/g, '<<<DOUBLESTAR>>>')
|
|
159
|
+
.replace(/\*/g, '[^/]*')
|
|
160
|
+
.replace(/<<<DOUBLESTAR>>>/g, '.*')
|
|
161
|
+
.replace(/\?/g, '.');
|
|
162
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
163
|
+
return regex.test(path);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Filter diff entries by pathspecs
|
|
167
|
+
*
|
|
168
|
+
* @param entries - Diff entries to filter
|
|
169
|
+
* @param pathspecs - Glob patterns to include
|
|
170
|
+
* @param excludePaths - Paths to exclude
|
|
171
|
+
* @returns Filtered entries
|
|
172
|
+
*/
|
|
173
|
+
export function filterByPathspecs(entries, pathspecs, excludePaths) {
|
|
174
|
+
if (!pathspecs && !excludePaths) {
|
|
175
|
+
return entries;
|
|
176
|
+
}
|
|
177
|
+
return entries.filter(entry => {
|
|
178
|
+
// Check exclude paths first
|
|
179
|
+
if (excludePaths) {
|
|
180
|
+
for (const pattern of excludePaths) {
|
|
181
|
+
if (matchGlob(pattern, entry.path)) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// If no include pathspecs, include everything not excluded
|
|
187
|
+
if (!pathspecs || pathspecs.length === 0) {
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
// Check if path matches any include pattern
|
|
191
|
+
for (const pattern of pathspecs) {
|
|
192
|
+
if (matchGlob(pattern, entry.path)) {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Recursively walk a tree and collect all entries with full paths
|
|
201
|
+
*
|
|
202
|
+
* @param store - Object store for retrieving tree contents
|
|
203
|
+
* @param treeSha - SHA of the tree to walk
|
|
204
|
+
* @param prefix - Path prefix for entries
|
|
205
|
+
* @returns Promise resolving to flat list of entries with full paths
|
|
206
|
+
*/
|
|
207
|
+
export async function walkTree(store, treeSha, prefix) {
|
|
208
|
+
const tree = await store.getTree(treeSha);
|
|
209
|
+
if (!tree) {
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
const results = [];
|
|
213
|
+
for (const entry of tree.entries) {
|
|
214
|
+
const fullPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
215
|
+
if (entry.mode === FileMode.TREE) {
|
|
216
|
+
// Recurse into subdirectory
|
|
217
|
+
const subEntries = await walkTree(store, entry.sha, fullPath);
|
|
218
|
+
results.push(...subEntries);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
results.push({ ...entry, fullPath });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return results;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Helper to get type category for mode comparison
|
|
228
|
+
*/
|
|
229
|
+
function getModeType(mode) {
|
|
230
|
+
if (mode === FileMode.REGULAR || mode === FileMode.EXECUTABLE) {
|
|
231
|
+
return 'file';
|
|
232
|
+
}
|
|
233
|
+
if (mode === FileMode.SYMLINK) {
|
|
234
|
+
return 'symlink';
|
|
235
|
+
}
|
|
236
|
+
if (mode === FileMode.GITLINK) {
|
|
237
|
+
return 'submodule';
|
|
238
|
+
}
|
|
239
|
+
if (mode === FileMode.TREE) {
|
|
240
|
+
return 'tree';
|
|
241
|
+
}
|
|
242
|
+
return 'unknown';
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Compare two trees and return the differences
|
|
246
|
+
*
|
|
247
|
+
* @param store - Object store for retrieving tree contents
|
|
248
|
+
* @param oldTreeSha - SHA of the old tree (null for initial commit comparison)
|
|
249
|
+
* @param newTreeSha - SHA of the new tree (null to compare against empty)
|
|
250
|
+
* @param options - Diff options
|
|
251
|
+
* @returns Promise resolving to diff result
|
|
252
|
+
*/
|
|
253
|
+
export async function diffTrees(store, oldTreeSha, newTreeSha, options = {}) {
|
|
254
|
+
const { detectRenames: enableRenames = false, detectCopies: enableCopies = false, similarityThreshold = 50, pathspecs, excludePaths, detectBinary = false, recursive = true } = options;
|
|
255
|
+
// Handle null on both sides
|
|
256
|
+
if (oldTreeSha === null && newTreeSha === null) {
|
|
257
|
+
return {
|
|
258
|
+
entries: [],
|
|
259
|
+
stats: { added: 0, deleted: 0, modified: 0, renamed: 0, copied: 0 }
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// Get old tree entries
|
|
263
|
+
let oldEntries = new Map();
|
|
264
|
+
if (oldTreeSha !== null) {
|
|
265
|
+
const oldTree = await store.getTree(oldTreeSha);
|
|
266
|
+
if (!oldTree) {
|
|
267
|
+
throw new Error(`Tree not found: ${oldTreeSha}`);
|
|
268
|
+
}
|
|
269
|
+
if (recursive) {
|
|
270
|
+
const entries = await walkTree(store, oldTreeSha);
|
|
271
|
+
for (const entry of entries) {
|
|
272
|
+
oldEntries.set(entry.fullPath, entry);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
for (const entry of oldTree.entries) {
|
|
277
|
+
oldEntries.set(entry.name, { ...entry, fullPath: entry.name });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Get new tree entries
|
|
282
|
+
let newEntries = new Map();
|
|
283
|
+
if (newTreeSha !== null) {
|
|
284
|
+
const newTree = await store.getTree(newTreeSha);
|
|
285
|
+
if (!newTree) {
|
|
286
|
+
throw new Error(`Tree not found: ${newTreeSha}`);
|
|
287
|
+
}
|
|
288
|
+
if (recursive) {
|
|
289
|
+
const entries = await walkTree(store, newTreeSha);
|
|
290
|
+
for (const entry of entries) {
|
|
291
|
+
newEntries.set(entry.fullPath, entry);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
for (const entry of newTree.entries) {
|
|
296
|
+
newEntries.set(entry.name, { ...entry, fullPath: entry.name });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const diffEntries = [];
|
|
301
|
+
// Find deleted and modified files
|
|
302
|
+
for (const [path, oldEntry] of oldEntries) {
|
|
303
|
+
const newEntry = newEntries.get(path);
|
|
304
|
+
if (!newEntry) {
|
|
305
|
+
// File was deleted
|
|
306
|
+
diffEntries.push({
|
|
307
|
+
path,
|
|
308
|
+
status: DiffStatus.DELETED,
|
|
309
|
+
oldMode: oldEntry.mode,
|
|
310
|
+
newMode: null,
|
|
311
|
+
oldSha: oldEntry.sha,
|
|
312
|
+
newSha: null
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
else if (oldEntry.sha !== newEntry.sha || oldEntry.mode !== newEntry.mode) {
|
|
316
|
+
// File was modified or type changed
|
|
317
|
+
const oldType = getModeType(oldEntry.mode);
|
|
318
|
+
const newType = getModeType(newEntry.mode);
|
|
319
|
+
if (oldType !== newType) {
|
|
320
|
+
// Type changed (e.g., file to symlink)
|
|
321
|
+
diffEntries.push({
|
|
322
|
+
path,
|
|
323
|
+
status: DiffStatus.TYPE_CHANGED,
|
|
324
|
+
oldMode: oldEntry.mode,
|
|
325
|
+
newMode: newEntry.mode,
|
|
326
|
+
oldSha: oldEntry.sha,
|
|
327
|
+
newSha: newEntry.sha
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
// Content or mode modified
|
|
332
|
+
diffEntries.push({
|
|
333
|
+
path,
|
|
334
|
+
status: DiffStatus.MODIFIED,
|
|
335
|
+
oldMode: oldEntry.mode,
|
|
336
|
+
newMode: newEntry.mode,
|
|
337
|
+
oldSha: oldEntry.sha,
|
|
338
|
+
newSha: newEntry.sha
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// Find added files
|
|
344
|
+
for (const [path, newEntry] of newEntries) {
|
|
345
|
+
if (!oldEntries.has(path)) {
|
|
346
|
+
diffEntries.push({
|
|
347
|
+
path,
|
|
348
|
+
status: DiffStatus.ADDED,
|
|
349
|
+
oldMode: null,
|
|
350
|
+
newMode: newEntry.mode,
|
|
351
|
+
oldSha: null,
|
|
352
|
+
newSha: newEntry.sha
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Detect binary files if enabled
|
|
357
|
+
if (detectBinary) {
|
|
358
|
+
for (const entry of diffEntries) {
|
|
359
|
+
const sha = entry.newSha || entry.oldSha;
|
|
360
|
+
if (sha) {
|
|
361
|
+
const blob = await store.getBlob(sha);
|
|
362
|
+
if (blob) {
|
|
363
|
+
entry.isBinary = isBinaryContent(blob);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Detect renames if enabled
|
|
369
|
+
let finalEntries = diffEntries;
|
|
370
|
+
if (enableRenames) {
|
|
371
|
+
finalEntries = await detectRenames(store, finalEntries, { similarityThreshold });
|
|
372
|
+
}
|
|
373
|
+
// Detect copies if enabled
|
|
374
|
+
if (enableCopies) {
|
|
375
|
+
// Build map of existing paths from old tree
|
|
376
|
+
const existingPaths = new Map();
|
|
377
|
+
for (const [path, entry] of oldEntries) {
|
|
378
|
+
existingPaths.set(path, entry.sha);
|
|
379
|
+
}
|
|
380
|
+
finalEntries = await detectCopies(store, finalEntries, existingPaths, { similarityThreshold });
|
|
381
|
+
}
|
|
382
|
+
// Apply path filters
|
|
383
|
+
if (pathspecs || excludePaths) {
|
|
384
|
+
finalEntries = filterByPathspecs(finalEntries, pathspecs, excludePaths);
|
|
385
|
+
}
|
|
386
|
+
// Calculate stats
|
|
387
|
+
const stats = {
|
|
388
|
+
added: 0,
|
|
389
|
+
deleted: 0,
|
|
390
|
+
modified: 0,
|
|
391
|
+
renamed: 0,
|
|
392
|
+
copied: 0
|
|
393
|
+
};
|
|
394
|
+
for (const entry of finalEntries) {
|
|
395
|
+
switch (entry.status) {
|
|
396
|
+
case DiffStatus.ADDED:
|
|
397
|
+
stats.added++;
|
|
398
|
+
break;
|
|
399
|
+
case DiffStatus.DELETED:
|
|
400
|
+
stats.deleted++;
|
|
401
|
+
break;
|
|
402
|
+
case DiffStatus.MODIFIED:
|
|
403
|
+
case DiffStatus.TYPE_CHANGED:
|
|
404
|
+
stats.modified++;
|
|
405
|
+
break;
|
|
406
|
+
case DiffStatus.RENAMED:
|
|
407
|
+
stats.renamed++;
|
|
408
|
+
break;
|
|
409
|
+
case DiffStatus.COPIED:
|
|
410
|
+
stats.copied++;
|
|
411
|
+
break;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return { entries: finalEntries, stats };
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Detect renames in a set of diff entries
|
|
418
|
+
*
|
|
419
|
+
* This function takes a list of added and deleted files and attempts to
|
|
420
|
+
* match them based on content similarity to detect renames.
|
|
421
|
+
*
|
|
422
|
+
* @param store - Object store for retrieving blob contents
|
|
423
|
+
* @param entries - Initial diff entries (before rename detection)
|
|
424
|
+
* @param options - Diff options (particularly similarityThreshold)
|
|
425
|
+
* @returns Promise resolving to entries with renames detected
|
|
426
|
+
*/
|
|
427
|
+
export async function detectRenames(store, entries, options = {}) {
|
|
428
|
+
const { similarityThreshold = 50 } = options;
|
|
429
|
+
const deleted = entries.filter(e => e.status === DiffStatus.DELETED);
|
|
430
|
+
const added = entries.filter(e => e.status === DiffStatus.ADDED);
|
|
431
|
+
const other = entries.filter(e => e.status !== DiffStatus.DELETED && e.status !== DiffStatus.ADDED);
|
|
432
|
+
const matchedDeleted = new Set();
|
|
433
|
+
const matchedAdded = new Set();
|
|
434
|
+
const renames = [];
|
|
435
|
+
// Try to match deleted files with added files
|
|
436
|
+
for (const del of deleted) {
|
|
437
|
+
if (matchedDeleted.has(del.path))
|
|
438
|
+
continue;
|
|
439
|
+
let bestMatch = null;
|
|
440
|
+
let bestSimilarity = 0;
|
|
441
|
+
for (const add of added) {
|
|
442
|
+
if (matchedAdded.has(add.path))
|
|
443
|
+
continue;
|
|
444
|
+
// Check if same SHA (exact rename)
|
|
445
|
+
if (del.oldSha === add.newSha) {
|
|
446
|
+
bestMatch = add;
|
|
447
|
+
bestSimilarity = 100;
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
// Calculate similarity if both SHAs exist
|
|
451
|
+
if (del.oldSha && add.newSha) {
|
|
452
|
+
const similarity = await calculateSimilarity(store, del.oldSha, add.newSha);
|
|
453
|
+
if (similarity >= similarityThreshold && similarity > bestSimilarity) {
|
|
454
|
+
bestMatch = add;
|
|
455
|
+
bestSimilarity = similarity;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
if (bestMatch && bestSimilarity >= similarityThreshold) {
|
|
460
|
+
matchedDeleted.add(del.path);
|
|
461
|
+
matchedAdded.add(bestMatch.path);
|
|
462
|
+
renames.push({
|
|
463
|
+
path: bestMatch.path,
|
|
464
|
+
oldPath: del.path,
|
|
465
|
+
status: DiffStatus.RENAMED,
|
|
466
|
+
oldMode: del.oldMode,
|
|
467
|
+
newMode: bestMatch.newMode,
|
|
468
|
+
oldSha: del.oldSha,
|
|
469
|
+
newSha: bestMatch.newSha,
|
|
470
|
+
similarity: bestSimilarity
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// Collect unmatched deleted and added entries
|
|
475
|
+
const result = [...other, ...renames];
|
|
476
|
+
for (const del of deleted) {
|
|
477
|
+
if (!matchedDeleted.has(del.path)) {
|
|
478
|
+
result.push(del);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
for (const add of added) {
|
|
482
|
+
if (!matchedAdded.has(add.path)) {
|
|
483
|
+
result.push(add);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
return result;
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Detect copies in a set of diff entries
|
|
490
|
+
*
|
|
491
|
+
* This function takes a list of diff entries and attempts to detect
|
|
492
|
+
* if any added files are copies of existing files.
|
|
493
|
+
*
|
|
494
|
+
* @param store - Object store for retrieving blob contents
|
|
495
|
+
* @param entries - Initial diff entries
|
|
496
|
+
* @param existingPaths - Map of existing paths to their SHAs
|
|
497
|
+
* @param options - Diff options
|
|
498
|
+
* @returns Promise resolving to entries with copies detected
|
|
499
|
+
*/
|
|
500
|
+
export async function detectCopies(store, entries, existingPaths, options = {}) {
|
|
501
|
+
const { similarityThreshold = 50 } = options;
|
|
502
|
+
const result = [];
|
|
503
|
+
for (const entry of entries) {
|
|
504
|
+
if (entry.status !== DiffStatus.ADDED) {
|
|
505
|
+
result.push(entry);
|
|
506
|
+
continue;
|
|
507
|
+
}
|
|
508
|
+
let bestMatch = null;
|
|
509
|
+
let bestSimilarity = 0;
|
|
510
|
+
for (const [path, sha] of existingPaths) {
|
|
511
|
+
// Check for exact match
|
|
512
|
+
if (sha === entry.newSha) {
|
|
513
|
+
bestMatch = { path, sha };
|
|
514
|
+
bestSimilarity = 100;
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
// Calculate similarity
|
|
518
|
+
if (entry.newSha) {
|
|
519
|
+
const similarity = await calculateSimilarity(store, sha, entry.newSha);
|
|
520
|
+
if (similarity >= similarityThreshold && similarity > bestSimilarity) {
|
|
521
|
+
bestMatch = { path, sha };
|
|
522
|
+
bestSimilarity = similarity;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
if (bestMatch && bestSimilarity >= similarityThreshold) {
|
|
527
|
+
result.push({
|
|
528
|
+
path: entry.path,
|
|
529
|
+
oldPath: bestMatch.path,
|
|
530
|
+
status: DiffStatus.COPIED,
|
|
531
|
+
oldMode: entry.newMode, // Use same mode for copied source
|
|
532
|
+
newMode: entry.newMode,
|
|
533
|
+
oldSha: bestMatch.sha,
|
|
534
|
+
newSha: entry.newSha,
|
|
535
|
+
similarity: bestSimilarity
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
result.push(entry);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
return result;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Compare a tree to the index (staging area)
|
|
546
|
+
*
|
|
547
|
+
* @param store - Object store for retrieving tree contents
|
|
548
|
+
* @param treeSha - SHA of the tree to compare (typically HEAD)
|
|
549
|
+
* @param index - Index entries to compare against
|
|
550
|
+
* @param options - Diff options
|
|
551
|
+
* @returns Promise resolving to diff result
|
|
552
|
+
*/
|
|
553
|
+
export async function diffTreeToIndex(store, treeSha, index, options = {}) {
|
|
554
|
+
// Get tree entries
|
|
555
|
+
const treeEntries = new Map();
|
|
556
|
+
if (treeSha !== null) {
|
|
557
|
+
const entries = await walkTree(store, treeSha);
|
|
558
|
+
for (const entry of entries) {
|
|
559
|
+
treeEntries.set(entry.fullPath, { mode: entry.mode, sha: entry.sha });
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
// Build index map
|
|
563
|
+
const indexEntries = new Map();
|
|
564
|
+
for (const entry of index) {
|
|
565
|
+
if (entry.stage === 0) {
|
|
566
|
+
indexEntries.set(entry.path, entry);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
const diffEntries = [];
|
|
570
|
+
// Find deleted and modified files
|
|
571
|
+
for (const [path, treeEntry] of treeEntries) {
|
|
572
|
+
const indexEntry = indexEntries.get(path);
|
|
573
|
+
if (!indexEntry) {
|
|
574
|
+
// File was deleted (in index)
|
|
575
|
+
diffEntries.push({
|
|
576
|
+
path,
|
|
577
|
+
status: DiffStatus.DELETED,
|
|
578
|
+
oldMode: treeEntry.mode,
|
|
579
|
+
newMode: null,
|
|
580
|
+
oldSha: treeEntry.sha,
|
|
581
|
+
newSha: null
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
else if (treeEntry.sha !== indexEntry.sha || treeEntry.mode !== indexEntry.mode) {
|
|
585
|
+
// File was modified
|
|
586
|
+
diffEntries.push({
|
|
587
|
+
path,
|
|
588
|
+
status: DiffStatus.MODIFIED,
|
|
589
|
+
oldMode: treeEntry.mode,
|
|
590
|
+
newMode: indexEntry.mode,
|
|
591
|
+
oldSha: treeEntry.sha,
|
|
592
|
+
newSha: indexEntry.sha
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
// Find added files
|
|
597
|
+
for (const [path, indexEntry] of indexEntries) {
|
|
598
|
+
if (!treeEntries.has(path)) {
|
|
599
|
+
diffEntries.push({
|
|
600
|
+
path,
|
|
601
|
+
status: DiffStatus.ADDED,
|
|
602
|
+
oldMode: null,
|
|
603
|
+
newMode: indexEntry.mode,
|
|
604
|
+
oldSha: null,
|
|
605
|
+
newSha: indexEntry.sha
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
// Apply filters if needed
|
|
610
|
+
let finalEntries = diffEntries;
|
|
611
|
+
if (options.pathspecs || options.excludePaths) {
|
|
612
|
+
finalEntries = filterByPathspecs(finalEntries, options.pathspecs, options.excludePaths);
|
|
613
|
+
}
|
|
614
|
+
// Calculate stats
|
|
615
|
+
const stats = {
|
|
616
|
+
added: 0,
|
|
617
|
+
deleted: 0,
|
|
618
|
+
modified: 0,
|
|
619
|
+
renamed: 0,
|
|
620
|
+
copied: 0
|
|
621
|
+
};
|
|
622
|
+
for (const entry of finalEntries) {
|
|
623
|
+
switch (entry.status) {
|
|
624
|
+
case DiffStatus.ADDED:
|
|
625
|
+
stats.added++;
|
|
626
|
+
break;
|
|
627
|
+
case DiffStatus.DELETED:
|
|
628
|
+
stats.deleted++;
|
|
629
|
+
break;
|
|
630
|
+
case DiffStatus.MODIFIED:
|
|
631
|
+
stats.modified++;
|
|
632
|
+
break;
|
|
633
|
+
case DiffStatus.RENAMED:
|
|
634
|
+
stats.renamed++;
|
|
635
|
+
break;
|
|
636
|
+
case DiffStatus.COPIED:
|
|
637
|
+
stats.copied++;
|
|
638
|
+
break;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
return { entries: finalEntries, stats };
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
* Compare a tree to working directory entries
|
|
645
|
+
*
|
|
646
|
+
* @param store - Object store for retrieving tree contents
|
|
647
|
+
* @param treeSha - SHA of the tree to compare
|
|
648
|
+
* @param workingEntries - Working directory file entries
|
|
649
|
+
* @param options - Diff options
|
|
650
|
+
* @returns Promise resolving to diff result
|
|
651
|
+
*/
|
|
652
|
+
export async function diffTreeToWorktree(store, treeSha, workingEntries, options = {}) {
|
|
653
|
+
// This is essentially the same as diffTreeToIndex
|
|
654
|
+
// Working directory entries are represented the same way
|
|
655
|
+
return diffTreeToIndex(store, treeSha, workingEntries, options);
|
|
656
|
+
}
|
|
657
|
+
//# sourceMappingURL=tree-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-diff.js","sourceRoot":"","sources":["../../src/ops/tree-diff.ts"],"names":[],"mappings":"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"}
|