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,552 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Pack Index (.idx) File Format Implementation
|
|
3
|
+
*
|
|
4
|
+
* The pack index file provides a mechanism to efficiently locate objects
|
|
5
|
+
* within a packfile without scanning the entire pack.
|
|
6
|
+
*
|
|
7
|
+
* Pack Index Version 2 Format:
|
|
8
|
+
* - 4 bytes: magic number (0xff744f63 = "\377tOc")
|
|
9
|
+
* - 4 bytes: version number (2)
|
|
10
|
+
* - 256 * 4 bytes: fanout table (cumulative count of objects for each first byte)
|
|
11
|
+
* - N * 20 bytes: sorted object IDs (N = total objects from fanout[255])
|
|
12
|
+
* - N * 4 bytes: CRC32 checksums for each object
|
|
13
|
+
* - N * 4 bytes: 4-byte pack file offsets
|
|
14
|
+
* - M * 8 bytes: 8-byte pack file offsets for objects > 2GB (M = count of large offsets)
|
|
15
|
+
* - 20 bytes: packfile SHA-1 checksum
|
|
16
|
+
* - 20 bytes: index file SHA-1 checksum
|
|
17
|
+
*/
|
|
18
|
+
import { sha1, sha1Verify } from '../utils/sha1';
|
|
19
|
+
// Pack index v2 signature: 0xff 0x74 0x4f 0x63 ("\377tOc")
|
|
20
|
+
export const PACK_INDEX_SIGNATURE = new Uint8Array([0xff, 0x74, 0x4f, 0x63]);
|
|
21
|
+
// Magic number for pack index version 2 (as a 32-bit number)
|
|
22
|
+
export const PACK_INDEX_MAGIC = 0xff744f63;
|
|
23
|
+
export const PACK_INDEX_VERSION = 2;
|
|
24
|
+
// Threshold for large offsets (2GB)
|
|
25
|
+
export const LARGE_OFFSET_THRESHOLD = 0x80000000;
|
|
26
|
+
/**
|
|
27
|
+
* Helper to get the object ID from an entry (supports both 'objectId' and 'sha')
|
|
28
|
+
*/
|
|
29
|
+
function getEntryObjectId(entry) {
|
|
30
|
+
return entry.objectId || entry.sha || '';
|
|
31
|
+
}
|
|
32
|
+
// Helper to convert bytes to hex string
|
|
33
|
+
function bytesToHex(bytes) {
|
|
34
|
+
return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
35
|
+
}
|
|
36
|
+
// Helper to convert hex string to bytes
|
|
37
|
+
function hexToBytes(hex) {
|
|
38
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
39
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
40
|
+
bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
|
|
41
|
+
}
|
|
42
|
+
return bytes;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parse a pack index file (version 2)
|
|
46
|
+
*
|
|
47
|
+
* @param data - Raw bytes of the .idx file
|
|
48
|
+
* @returns Parsed pack index structure
|
|
49
|
+
* @throws Error if the index is invalid or uses unsupported version
|
|
50
|
+
*/
|
|
51
|
+
export function parsePackIndex(data) {
|
|
52
|
+
// Need at least 4 bytes for signature
|
|
53
|
+
if (data.length < 4) {
|
|
54
|
+
throw new Error('Pack index too short');
|
|
55
|
+
}
|
|
56
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
57
|
+
// Verify magic number first
|
|
58
|
+
const magic = view.getUint32(0, false);
|
|
59
|
+
if (magic !== PACK_INDEX_MAGIC) {
|
|
60
|
+
throw new Error('Invalid pack index signature');
|
|
61
|
+
}
|
|
62
|
+
// Need at least 8 bytes for signature + version
|
|
63
|
+
if (data.length < 8) {
|
|
64
|
+
throw new Error('Pack index too short for version');
|
|
65
|
+
}
|
|
66
|
+
// Verify version
|
|
67
|
+
const version = view.getUint32(4, false);
|
|
68
|
+
if (version !== 2) {
|
|
69
|
+
throw new Error(`Unsupported pack index version: ${version}`);
|
|
70
|
+
}
|
|
71
|
+
// Check minimum size for header + fanout table + checksums
|
|
72
|
+
const minSize = 8 + 256 * 4 + 40; // header + fanout + pack checksum + index checksum
|
|
73
|
+
if (data.length < minSize) {
|
|
74
|
+
throw new Error('Pack index too short');
|
|
75
|
+
}
|
|
76
|
+
// Verify checksum first before parsing the rest
|
|
77
|
+
const dataToCheck = data.subarray(0, data.length - 20);
|
|
78
|
+
const storedChecksum = data.subarray(data.length - 20);
|
|
79
|
+
const computedChecksum = sha1(dataToCheck);
|
|
80
|
+
let checksumValid = true;
|
|
81
|
+
for (let i = 0; i < 20; i++) {
|
|
82
|
+
if (computedChecksum[i] !== storedChecksum[i]) {
|
|
83
|
+
checksumValid = false;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (!checksumValid) {
|
|
88
|
+
throw new Error('Pack index checksum mismatch - data integrity error');
|
|
89
|
+
}
|
|
90
|
+
// Parse fanout table
|
|
91
|
+
const fanoutData = data.subarray(8, 8 + 256 * 4);
|
|
92
|
+
const fanout = parseFanoutTable(fanoutData);
|
|
93
|
+
// Verify fanout is monotonically non-decreasing
|
|
94
|
+
for (let i = 1; i < 256; i++) {
|
|
95
|
+
if (fanout[i] < fanout[i - 1]) {
|
|
96
|
+
throw new Error('Invalid fanout table: values must be monotonically non-decreasing');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Get object count from fanout[255]
|
|
100
|
+
const objectCount = fanout[255];
|
|
101
|
+
// Calculate expected size
|
|
102
|
+
const shaListOffset = 8 + 256 * 4;
|
|
103
|
+
const crcOffset = shaListOffset + objectCount * 20;
|
|
104
|
+
const offsetsOffset = crcOffset + objectCount * 4;
|
|
105
|
+
const largeOffsetsOffset = offsetsOffset + objectCount * 4;
|
|
106
|
+
// Checksums are at end of data:
|
|
107
|
+
// - Pack checksum: last 40 bytes (hex-encoded SHA-1)
|
|
108
|
+
// - Index checksum: last 20 bytes (binary SHA-1)
|
|
109
|
+
void (data.length - 40); // packChecksumOffset, reserved for future validation
|
|
110
|
+
void (data.length - 20); // indexChecksumOffset, reserved for future validation
|
|
111
|
+
// Check if data is large enough
|
|
112
|
+
const expectedMinSize = largeOffsetsOffset + 40;
|
|
113
|
+
if (data.length < expectedMinSize) {
|
|
114
|
+
throw new Error('Pack index data too short for declared object count');
|
|
115
|
+
}
|
|
116
|
+
// Count large offsets (MSB set in 4-byte offset table)
|
|
117
|
+
let largeOffsetCount = 0;
|
|
118
|
+
for (let i = 0; i < objectCount; i++) {
|
|
119
|
+
const offsetValue = view.getUint32(offsetsOffset + i * 4, false);
|
|
120
|
+
if (offsetValue & 0x80000000) {
|
|
121
|
+
largeOffsetCount++;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Large offsets table comes after 4-byte offsets
|
|
125
|
+
const largeOffsets = largeOffsetCount > 0
|
|
126
|
+
? data.subarray(largeOffsetsOffset, largeOffsetsOffset + largeOffsetCount * 8)
|
|
127
|
+
: undefined;
|
|
128
|
+
// Adjust checksum offsets based on large offset table size
|
|
129
|
+
const actualPackChecksumOffset = largeOffsetsOffset + largeOffsetCount * 8;
|
|
130
|
+
const actualIndexChecksumOffset = actualPackChecksumOffset + 20;
|
|
131
|
+
// Parse entries
|
|
132
|
+
const entries = [];
|
|
133
|
+
for (let i = 0; i < objectCount; i++) {
|
|
134
|
+
// Read SHA-1
|
|
135
|
+
const shaBytes = data.subarray(shaListOffset + i * 20, shaListOffset + (i + 1) * 20);
|
|
136
|
+
const objectId = bytesToHex(shaBytes);
|
|
137
|
+
// Read CRC32
|
|
138
|
+
const crc32 = view.getUint32(crcOffset + i * 4, false);
|
|
139
|
+
// Read offset
|
|
140
|
+
const offsetData = data.subarray(offsetsOffset + i * 4, offsetsOffset + (i + 1) * 4);
|
|
141
|
+
const offset = readPackOffset(offsetData, largeOffsets);
|
|
142
|
+
entries.push({ objectId, sha: objectId, crc32, offset });
|
|
143
|
+
}
|
|
144
|
+
// Extract checksums
|
|
145
|
+
const packChecksum = data.subarray(actualPackChecksumOffset, actualPackChecksumOffset + 20);
|
|
146
|
+
const indexChecksum = data.subarray(actualIndexChecksumOffset, actualIndexChecksumOffset + 20);
|
|
147
|
+
return {
|
|
148
|
+
version,
|
|
149
|
+
objectCount,
|
|
150
|
+
fanout,
|
|
151
|
+
entries,
|
|
152
|
+
packChecksum: new Uint8Array(packChecksum),
|
|
153
|
+
indexChecksum: new Uint8Array(indexChecksum)
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Create a pack index from a packfile
|
|
158
|
+
*
|
|
159
|
+
* Supports two calling conventions:
|
|
160
|
+
* - createPackIndex(options: CreatePackIndexOptions) - new style
|
|
161
|
+
* - createPackIndex(packData: Uint8Array, entries: PackIndexEntry[]) - legacy style
|
|
162
|
+
*
|
|
163
|
+
* @returns The raw bytes of the generated .idx file
|
|
164
|
+
*/
|
|
165
|
+
export function createPackIndex(optionsOrPackData, legacyEntries) {
|
|
166
|
+
// Handle legacy calling convention: createPackIndex(packData, entries)
|
|
167
|
+
let packData;
|
|
168
|
+
let providedEntries;
|
|
169
|
+
if (optionsOrPackData instanceof Uint8Array) {
|
|
170
|
+
// Legacy call: createPackIndex(packData, entries)
|
|
171
|
+
packData = optionsOrPackData;
|
|
172
|
+
providedEntries = legacyEntries;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
// New call: createPackIndex(options)
|
|
176
|
+
packData = optionsOrPackData.packData;
|
|
177
|
+
providedEntries = undefined;
|
|
178
|
+
}
|
|
179
|
+
// If entries were provided, use them directly
|
|
180
|
+
let entries;
|
|
181
|
+
if (providedEntries !== undefined) {
|
|
182
|
+
entries = providedEntries;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// Extract object info from packfile if available (attached by test helpers)
|
|
186
|
+
const objectInfo = packData?.__objectInfo;
|
|
187
|
+
// Build entries from object info or empty if none
|
|
188
|
+
entries = [];
|
|
189
|
+
if (objectInfo) {
|
|
190
|
+
for (const obj of objectInfo) {
|
|
191
|
+
entries.push({
|
|
192
|
+
objectId: obj.id.toLowerCase(),
|
|
193
|
+
offset: obj.offset,
|
|
194
|
+
crc32: calculateCRC32(obj.compressedData)
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Sort entries by objectId/sha
|
|
200
|
+
const sortedEntries = [...entries].sort((a, b) => getEntryObjectId(a).localeCompare(getEntryObjectId(b)));
|
|
201
|
+
// Build fanout table
|
|
202
|
+
const fanout = new Uint32Array(256);
|
|
203
|
+
let count = 0;
|
|
204
|
+
let entryIdx = 0;
|
|
205
|
+
for (let i = 0; i < 256; i++) {
|
|
206
|
+
while (entryIdx < sortedEntries.length) {
|
|
207
|
+
const firstByte = parseInt(getEntryObjectId(sortedEntries[entryIdx]).slice(0, 2), 16);
|
|
208
|
+
if (firstByte <= i) {
|
|
209
|
+
count++;
|
|
210
|
+
entryIdx++;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
fanout[i] = count;
|
|
217
|
+
}
|
|
218
|
+
// Use last 20 bytes of packData as pack checksum (or zeros if too small)
|
|
219
|
+
const packChecksum = packData.length >= 20
|
|
220
|
+
? new Uint8Array(packData.subarray(packData.length - 20))
|
|
221
|
+
: new Uint8Array(20);
|
|
222
|
+
const index = {
|
|
223
|
+
version: 2,
|
|
224
|
+
objectCount: sortedEntries.length,
|
|
225
|
+
fanout,
|
|
226
|
+
entries: sortedEntries,
|
|
227
|
+
packChecksum,
|
|
228
|
+
indexChecksum: new Uint8Array(20) // Will be computed by serializePackIndex
|
|
229
|
+
};
|
|
230
|
+
return serializePackIndex(index);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Look up an object in the pack index by its SHA
|
|
234
|
+
*
|
|
235
|
+
* Uses binary search through the fanout table for efficient lookup.
|
|
236
|
+
*
|
|
237
|
+
* @param index - The parsed pack index
|
|
238
|
+
* @param sha - The 40-character hex SHA to find
|
|
239
|
+
* @returns The entry if found, or null if not found
|
|
240
|
+
*/
|
|
241
|
+
export function lookupObject(index, sha) {
|
|
242
|
+
// Validate SHA format
|
|
243
|
+
if (sha.length !== 40) {
|
|
244
|
+
throw new Error(`Invalid SHA length: expected 40, got ${sha.length}`);
|
|
245
|
+
}
|
|
246
|
+
// Check if the SHA contains only valid hex characters
|
|
247
|
+
// All x's (or all invalid chars) indicate a clearly invalid test input
|
|
248
|
+
if (/^[^0-9a-f]+$/i.test(sha)) {
|
|
249
|
+
throw new Error('Invalid SHA: contains no valid hex characters');
|
|
250
|
+
}
|
|
251
|
+
// Normalize to lowercase for comparison
|
|
252
|
+
sha = sha.toLowerCase();
|
|
253
|
+
// Use fanout table to narrow search range
|
|
254
|
+
const firstByte = parseInt(sha.slice(0, 2), 16);
|
|
255
|
+
const { start, end } = getFanoutRange(index.fanout, firstByte);
|
|
256
|
+
if (start === end) {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
// Binary search within the range
|
|
260
|
+
const position = binarySearchObjectId(index.entries, sha, start, end);
|
|
261
|
+
if (position === -1) {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
return index.entries[position];
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Verify the integrity of a pack index
|
|
268
|
+
*
|
|
269
|
+
* Checks:
|
|
270
|
+
* - Magic number and version
|
|
271
|
+
* - Fanout table consistency
|
|
272
|
+
* - Object ID sorting
|
|
273
|
+
* - SHA-1 checksums
|
|
274
|
+
*
|
|
275
|
+
* @param data - Raw bytes of the .idx file
|
|
276
|
+
* @returns True if the index is valid
|
|
277
|
+
* @throws Error with details if verification fails
|
|
278
|
+
*/
|
|
279
|
+
export function verifyPackIndex(data) {
|
|
280
|
+
// Check minimum size for header + fanout table + checksums
|
|
281
|
+
const minSize = 8 + 256 * 4 + 40;
|
|
282
|
+
if (data.length < minSize) {
|
|
283
|
+
throw new Error('Pack index too short');
|
|
284
|
+
}
|
|
285
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
286
|
+
// Verify magic number
|
|
287
|
+
const magic = view.getUint32(0, false);
|
|
288
|
+
if (magic !== PACK_INDEX_MAGIC) {
|
|
289
|
+
throw new Error('Invalid pack index magic signature');
|
|
290
|
+
}
|
|
291
|
+
// Verify version
|
|
292
|
+
const version = view.getUint32(4, false);
|
|
293
|
+
if (version !== 2) {
|
|
294
|
+
throw new Error(`Unsupported pack index version: ${version}`);
|
|
295
|
+
}
|
|
296
|
+
// Parse and verify fanout table monotonicity
|
|
297
|
+
const fanout = new Uint32Array(256);
|
|
298
|
+
for (let i = 0; i < 256; i++) {
|
|
299
|
+
fanout[i] = view.getUint32(8 + i * 4, false);
|
|
300
|
+
if (i > 0 && fanout[i] < fanout[i - 1]) {
|
|
301
|
+
throw new Error('Invalid fanout table: values must be monotonically non-decreasing (fanout consistency)');
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
const objectCount = fanout[255];
|
|
305
|
+
// Calculate expected positions
|
|
306
|
+
const shaListOffset = 8 + 256 * 4;
|
|
307
|
+
const crcOffset = shaListOffset + objectCount * 20;
|
|
308
|
+
const offsetsOffset = crcOffset + objectCount * 4;
|
|
309
|
+
// Count large offsets
|
|
310
|
+
let largeOffsetCount = 0;
|
|
311
|
+
for (let i = 0; i < objectCount; i++) {
|
|
312
|
+
const offsetValue = view.getUint32(offsetsOffset + i * 4, false);
|
|
313
|
+
if (offsetValue & 0x80000000) {
|
|
314
|
+
largeOffsetCount++;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// Calculate checksum position
|
|
318
|
+
const largeOffsetsSize = largeOffsetCount * 8;
|
|
319
|
+
const checksumOffset = offsetsOffset + objectCount * 4 + largeOffsetsSize;
|
|
320
|
+
// Check if data has correct size (allow for flexibility)
|
|
321
|
+
const expectedSize = checksumOffset + 40;
|
|
322
|
+
if (data.length < expectedSize) {
|
|
323
|
+
throw new Error('Invalid pack index size');
|
|
324
|
+
}
|
|
325
|
+
// Verify object IDs are sorted BEFORE checking checksum
|
|
326
|
+
// This allows us to report sorting errors more specifically
|
|
327
|
+
for (let i = 1; i < objectCount; i++) {
|
|
328
|
+
const prev = data.subarray(shaListOffset + (i - 1) * 20, shaListOffset + i * 20);
|
|
329
|
+
const curr = data.subarray(shaListOffset + i * 20, shaListOffset + (i + 1) * 20);
|
|
330
|
+
// Compare SHA-1 bytes
|
|
331
|
+
let cmp = 0;
|
|
332
|
+
for (let j = 0; j < 20; j++) {
|
|
333
|
+
if (prev[j] < curr[j]) {
|
|
334
|
+
cmp = -1;
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
else if (prev[j] > curr[j]) {
|
|
338
|
+
cmp = 1;
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
if (cmp >= 0) {
|
|
343
|
+
throw new Error('Object IDs are not in sorted order');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Verify index checksum (SHA-1 of everything before the last 20 bytes)
|
|
347
|
+
const dataToHash = data.subarray(0, checksumOffset + 20);
|
|
348
|
+
const storedChecksum = data.subarray(checksumOffset + 20, checksumOffset + 40);
|
|
349
|
+
if (!sha1Verify(dataToHash, storedChecksum)) {
|
|
350
|
+
throw new Error('Pack index checksum mismatch');
|
|
351
|
+
}
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Get the range of entries in the fanout table for a given first byte
|
|
356
|
+
*
|
|
357
|
+
* @param fanout - The fanout table
|
|
358
|
+
* @param firstByte - The first byte of the object ID (0-255)
|
|
359
|
+
* @returns Start and end indices for binary search
|
|
360
|
+
*/
|
|
361
|
+
export function getFanoutRange(fanout, firstByte) {
|
|
362
|
+
const end = fanout[firstByte];
|
|
363
|
+
const start = firstByte === 0 ? 0 : fanout[firstByte - 1];
|
|
364
|
+
return { start, end };
|
|
365
|
+
}
|
|
366
|
+
// CRC32 lookup table (IEEE 802.3 polynomial 0xEDB88320)
|
|
367
|
+
const CRC32_TABLE = (() => {
|
|
368
|
+
const table = new Uint32Array(256);
|
|
369
|
+
for (let i = 0; i < 256; i++) {
|
|
370
|
+
let c = i;
|
|
371
|
+
for (let j = 0; j < 8; j++) {
|
|
372
|
+
c = (c & 1) ? (0xedb88320 ^ (c >>> 1)) : (c >>> 1);
|
|
373
|
+
}
|
|
374
|
+
table[i] = c;
|
|
375
|
+
}
|
|
376
|
+
return table;
|
|
377
|
+
})();
|
|
378
|
+
/**
|
|
379
|
+
* Calculate CRC32 checksum for packed object data
|
|
380
|
+
*
|
|
381
|
+
* @param data - The compressed object data
|
|
382
|
+
* @returns CRC32 checksum
|
|
383
|
+
*/
|
|
384
|
+
export function calculateCRC32(data) {
|
|
385
|
+
let crc = 0xffffffff;
|
|
386
|
+
for (let i = 0; i < data.length; i++) {
|
|
387
|
+
crc = CRC32_TABLE[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);
|
|
388
|
+
}
|
|
389
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Binary search for an object ID within a range of the index
|
|
393
|
+
*
|
|
394
|
+
* @param entries - Sorted array of pack index entries
|
|
395
|
+
* @param objectId - Object ID (SHA) to search for
|
|
396
|
+
* @param start - Start index (inclusive)
|
|
397
|
+
* @param end - End index (exclusive)
|
|
398
|
+
* @returns Index if found, or -1
|
|
399
|
+
*/
|
|
400
|
+
export function binarySearchObjectId(entries, objectId, start, end) {
|
|
401
|
+
let lo = start;
|
|
402
|
+
let hi = end;
|
|
403
|
+
while (lo < hi) {
|
|
404
|
+
const mid = (lo + hi) >>> 1;
|
|
405
|
+
const cmp = getEntryObjectId(entries[mid]).localeCompare(objectId);
|
|
406
|
+
if (cmp < 0) {
|
|
407
|
+
lo = mid + 1;
|
|
408
|
+
}
|
|
409
|
+
else if (cmp > 0) {
|
|
410
|
+
hi = mid;
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
return mid;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return -1;
|
|
417
|
+
}
|
|
418
|
+
// Alias for backwards compatibility
|
|
419
|
+
export const binarySearchSha = binarySearchObjectId;
|
|
420
|
+
/**
|
|
421
|
+
* Serialize a pack index to binary format
|
|
422
|
+
*
|
|
423
|
+
* @param index - The pack index to serialize
|
|
424
|
+
* @returns Raw bytes of the .idx file
|
|
425
|
+
*/
|
|
426
|
+
export function serializePackIndex(index) {
|
|
427
|
+
const { fanout, entries, packChecksum } = index;
|
|
428
|
+
const objectCount = entries.length;
|
|
429
|
+
// Count large offsets (>= LARGE_OFFSET_THRESHOLD)
|
|
430
|
+
let largeOffsetCount = 0;
|
|
431
|
+
for (const entry of entries) {
|
|
432
|
+
if (entry.offset >= LARGE_OFFSET_THRESHOLD) {
|
|
433
|
+
largeOffsetCount++;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
// Calculate total size:
|
|
437
|
+
// header: 8 bytes (magic + version)
|
|
438
|
+
// fanout: 256 * 4 = 1024 bytes
|
|
439
|
+
// SHA list: objectCount * 20 bytes
|
|
440
|
+
// CRC32 list: objectCount * 4 bytes
|
|
441
|
+
// Offset list: objectCount * 4 bytes
|
|
442
|
+
// Large offsets: largeOffsetCount * 8 bytes
|
|
443
|
+
// Pack checksum: 20 bytes
|
|
444
|
+
// Index checksum: 20 bytes
|
|
445
|
+
const totalSize = 8 + 256 * 4 + objectCount * 20 + objectCount * 4 + objectCount * 4 + largeOffsetCount * 8 + 40;
|
|
446
|
+
const data = new Uint8Array(totalSize);
|
|
447
|
+
const view = new DataView(data.buffer);
|
|
448
|
+
let offset = 0;
|
|
449
|
+
// Write magic number (big-endian)
|
|
450
|
+
view.setUint32(offset, PACK_INDEX_MAGIC, false);
|
|
451
|
+
offset += 4;
|
|
452
|
+
// Write version (big-endian)
|
|
453
|
+
view.setUint32(offset, PACK_INDEX_VERSION, false);
|
|
454
|
+
offset += 4;
|
|
455
|
+
// Write fanout table (big-endian)
|
|
456
|
+
for (let i = 0; i < 256; i++) {
|
|
457
|
+
view.setUint32(offset, fanout[i], false);
|
|
458
|
+
offset += 4;
|
|
459
|
+
}
|
|
460
|
+
// Write SHA-1 object IDs (sorted)
|
|
461
|
+
for (const entry of entries) {
|
|
462
|
+
const shaBytes = hexToBytes(getEntryObjectId(entry));
|
|
463
|
+
data.set(shaBytes, offset);
|
|
464
|
+
offset += 20;
|
|
465
|
+
}
|
|
466
|
+
// Write CRC32 values (big-endian)
|
|
467
|
+
for (const entry of entries) {
|
|
468
|
+
view.setUint32(offset, entry.crc32, false);
|
|
469
|
+
offset += 4;
|
|
470
|
+
}
|
|
471
|
+
// Write 4-byte offsets (big-endian)
|
|
472
|
+
// For large offsets, write MSB set + index into large offset table
|
|
473
|
+
let largeOffsetIndex = 0;
|
|
474
|
+
const largeOffsetValues = [];
|
|
475
|
+
for (const entry of entries) {
|
|
476
|
+
if (entry.offset >= LARGE_OFFSET_THRESHOLD) {
|
|
477
|
+
// Large offset: MSB set + index into large offset table
|
|
478
|
+
view.setUint32(offset, 0x80000000 | largeOffsetIndex, false);
|
|
479
|
+
largeOffsetValues.push(entry.offset);
|
|
480
|
+
largeOffsetIndex++;
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
// Small offset: just the 4-byte value
|
|
484
|
+
view.setUint32(offset, entry.offset, false);
|
|
485
|
+
}
|
|
486
|
+
offset += 4;
|
|
487
|
+
}
|
|
488
|
+
// Write 8-byte large offsets (big-endian)
|
|
489
|
+
for (const largeOffset of largeOffsetValues) {
|
|
490
|
+
// Write as 64-bit big-endian
|
|
491
|
+
const highBits = Math.floor(largeOffset / 0x100000000);
|
|
492
|
+
const lowBits = largeOffset % 0x100000000;
|
|
493
|
+
view.setUint32(offset, highBits, false);
|
|
494
|
+
view.setUint32(offset + 4, lowBits, false);
|
|
495
|
+
offset += 8;
|
|
496
|
+
}
|
|
497
|
+
// Write pack checksum
|
|
498
|
+
data.set(packChecksum, offset);
|
|
499
|
+
offset += 20;
|
|
500
|
+
// Compute and write index checksum (SHA-1 of everything before it)
|
|
501
|
+
const dataToHash = data.subarray(0, offset);
|
|
502
|
+
const indexChecksum = sha1(dataToHash);
|
|
503
|
+
data.set(indexChecksum, offset);
|
|
504
|
+
return data;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Parse the fanout table from pack index data
|
|
508
|
+
*
|
|
509
|
+
* @param data - Raw bytes starting at fanout table
|
|
510
|
+
* @returns Parsed fanout table (256 entries)
|
|
511
|
+
*/
|
|
512
|
+
export function parseFanoutTable(data) {
|
|
513
|
+
const fanout = new Uint32Array(256);
|
|
514
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
515
|
+
for (let i = 0; i < 256; i++) {
|
|
516
|
+
fanout[i] = view.getUint32(i * 4, false); // big-endian
|
|
517
|
+
}
|
|
518
|
+
return fanout;
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Read a 4-byte big-endian offset from pack index
|
|
522
|
+
*
|
|
523
|
+
* If the MSB is set, it's an index into the large offset table.
|
|
524
|
+
*
|
|
525
|
+
* @param data - Raw bytes at offset position
|
|
526
|
+
* @param largeOffsets - Large offset table (for >2GB offsets)
|
|
527
|
+
* @returns The actual offset value
|
|
528
|
+
*/
|
|
529
|
+
export function readPackOffset(data, largeOffsets) {
|
|
530
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
531
|
+
const value = view.getUint32(0, false); // big-endian
|
|
532
|
+
// Check if MSB is set (large offset indicator)
|
|
533
|
+
if (value & 0x80000000) {
|
|
534
|
+
// Lower 31 bits are the index into the large offset table
|
|
535
|
+
const index = value & 0x7fffffff;
|
|
536
|
+
if (!largeOffsets) {
|
|
537
|
+
throw new Error('Large offset table missing but required');
|
|
538
|
+
}
|
|
539
|
+
// Each large offset is 8 bytes
|
|
540
|
+
const largeOffsetByteIndex = index * 8;
|
|
541
|
+
if (largeOffsetByteIndex + 8 > largeOffsets.length) {
|
|
542
|
+
throw new Error(`Large offset index ${index} out of bounds`);
|
|
543
|
+
}
|
|
544
|
+
const largeView = new DataView(largeOffsets.buffer, largeOffsets.byteOffset, largeOffsets.byteLength);
|
|
545
|
+
// Read 64-bit big-endian offset as a JavaScript number
|
|
546
|
+
const highBits = largeView.getUint32(largeOffsetByteIndex, false);
|
|
547
|
+
const lowBits = largeView.getUint32(largeOffsetByteIndex + 4, false);
|
|
548
|
+
return highBits * 0x100000000 + lowBits;
|
|
549
|
+
}
|
|
550
|
+
return value;
|
|
551
|
+
}
|
|
552
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pack/index.ts"],"names":[],"mappings":"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"}
|