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,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git packfile delta encoding/decoding
|
|
3
|
+
*
|
|
4
|
+
* Git uses delta compression in packfiles to store objects efficiently.
|
|
5
|
+
* A delta is a set of instructions to transform a base object into a target object.
|
|
6
|
+
*
|
|
7
|
+
* Delta format:
|
|
8
|
+
* - Source (base) size: variable-length integer
|
|
9
|
+
* - Target size: variable-length integer
|
|
10
|
+
* - Instructions: sequence of copy or insert commands
|
|
11
|
+
*
|
|
12
|
+
* Instruction types:
|
|
13
|
+
* - Copy (MSB=1): Copy bytes from source object
|
|
14
|
+
* Bits 0-3: which offset bytes are present
|
|
15
|
+
* Bits 4-6: which size bytes are present
|
|
16
|
+
* - Insert (MSB=0): Insert literal bytes
|
|
17
|
+
* Bits 0-6: number of bytes to insert (1-127)
|
|
18
|
+
*/
|
|
19
|
+
/** Copy instruction type marker (MSB set) */
|
|
20
|
+
export declare const COPY_INSTRUCTION = 128;
|
|
21
|
+
/** Insert instruction type marker (MSB clear) */
|
|
22
|
+
export declare const INSERT_INSTRUCTION = 0;
|
|
23
|
+
/** Result of parsing a delta header */
|
|
24
|
+
export interface DeltaHeaderResult {
|
|
25
|
+
size: number;
|
|
26
|
+
bytesRead: number;
|
|
27
|
+
}
|
|
28
|
+
/** Delta instruction representation */
|
|
29
|
+
export interface DeltaInstruction {
|
|
30
|
+
type: 'copy' | 'insert';
|
|
31
|
+
offset?: number;
|
|
32
|
+
size: number;
|
|
33
|
+
data?: Uint8Array;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse a variable-length size from delta header
|
|
37
|
+
*
|
|
38
|
+
* Git uses a variable-length encoding where each byte's MSB indicates
|
|
39
|
+
* if more bytes follow. The lower 7 bits of each byte contribute to the value.
|
|
40
|
+
*
|
|
41
|
+
* @param data The delta data buffer
|
|
42
|
+
* @param offset Starting offset in the buffer
|
|
43
|
+
* @returns The parsed size and number of bytes consumed
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseDeltaHeader(data: Uint8Array, offset: number): DeltaHeaderResult;
|
|
46
|
+
/**
|
|
47
|
+
* Apply a delta to a base object to produce the target object
|
|
48
|
+
*
|
|
49
|
+
* @param base The source/base object
|
|
50
|
+
* @param delta The delta data
|
|
51
|
+
* @returns The reconstructed target object
|
|
52
|
+
* @throws Error if delta is invalid or sizes don't match
|
|
53
|
+
*/
|
|
54
|
+
export declare function applyDelta(base: Uint8Array, delta: Uint8Array): Uint8Array;
|
|
55
|
+
/**
|
|
56
|
+
* Create a delta between two objects
|
|
57
|
+
*
|
|
58
|
+
* This uses a simple but effective algorithm:
|
|
59
|
+
* 1. Build a hash table of 4-byte sequences in the base
|
|
60
|
+
* 2. Scan the target looking for matches
|
|
61
|
+
* 3. Emit copy instructions for matches, insert for non-matches
|
|
62
|
+
*
|
|
63
|
+
* @param base The source/base object
|
|
64
|
+
* @param target The target object to encode
|
|
65
|
+
* @returns The delta data
|
|
66
|
+
*/
|
|
67
|
+
export declare function createDelta(base: Uint8Array, target: Uint8Array): Uint8Array;
|
|
68
|
+
//# sourceMappingURL=delta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../src/pack/delta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB,MAAO,CAAA;AAEpC,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,IAAO,CAAA;AAEtC,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,CA8BpF;AAuBD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CAgF1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CA0F5E"}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git packfile delta encoding/decoding
|
|
3
|
+
*
|
|
4
|
+
* Git uses delta compression in packfiles to store objects efficiently.
|
|
5
|
+
* A delta is a set of instructions to transform a base object into a target object.
|
|
6
|
+
*
|
|
7
|
+
* Delta format:
|
|
8
|
+
* - Source (base) size: variable-length integer
|
|
9
|
+
* - Target size: variable-length integer
|
|
10
|
+
* - Instructions: sequence of copy or insert commands
|
|
11
|
+
*
|
|
12
|
+
* Instruction types:
|
|
13
|
+
* - Copy (MSB=1): Copy bytes from source object
|
|
14
|
+
* Bits 0-3: which offset bytes are present
|
|
15
|
+
* Bits 4-6: which size bytes are present
|
|
16
|
+
* - Insert (MSB=0): Insert literal bytes
|
|
17
|
+
* Bits 0-6: number of bytes to insert (1-127)
|
|
18
|
+
*/
|
|
19
|
+
/** Copy instruction type marker (MSB set) */
|
|
20
|
+
export const COPY_INSTRUCTION = 0x80;
|
|
21
|
+
/** Insert instruction type marker (MSB clear) */
|
|
22
|
+
export const INSERT_INSTRUCTION = 0x00;
|
|
23
|
+
/**
|
|
24
|
+
* Parse a variable-length size from delta header
|
|
25
|
+
*
|
|
26
|
+
* Git uses a variable-length encoding where each byte's MSB indicates
|
|
27
|
+
* if more bytes follow. The lower 7 bits of each byte contribute to the value.
|
|
28
|
+
*
|
|
29
|
+
* @param data The delta data buffer
|
|
30
|
+
* @param offset Starting offset in the buffer
|
|
31
|
+
* @returns The parsed size and number of bytes consumed
|
|
32
|
+
*/
|
|
33
|
+
export function parseDeltaHeader(data, offset) {
|
|
34
|
+
let size = 0;
|
|
35
|
+
let shift = 0;
|
|
36
|
+
let bytesRead = 0;
|
|
37
|
+
// Maximum bytes for a varint to prevent infinite loops
|
|
38
|
+
const MAX_VARINT_BYTES = 10;
|
|
39
|
+
while (true) {
|
|
40
|
+
if (offset + bytesRead >= data.length) {
|
|
41
|
+
throw new Error(`Delta header parsing failed: unexpected end of data at offset ${offset + bytesRead}`);
|
|
42
|
+
}
|
|
43
|
+
if (bytesRead >= MAX_VARINT_BYTES) {
|
|
44
|
+
throw new Error(`Delta header parsing failed: exceeded maximum length of ${MAX_VARINT_BYTES} bytes (possible infinite loop or corrupted data)`);
|
|
45
|
+
}
|
|
46
|
+
const byte = data[offset + bytesRead];
|
|
47
|
+
bytesRead++;
|
|
48
|
+
// Add the lower 7 bits to the result
|
|
49
|
+
size |= (byte & 0x7f) << shift;
|
|
50
|
+
shift += 7;
|
|
51
|
+
// If MSB is not set, we're done
|
|
52
|
+
if ((byte & 0x80) === 0) {
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { size, bytesRead };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Encode a size as a variable-length integer
|
|
60
|
+
*
|
|
61
|
+
* @param size The size to encode
|
|
62
|
+
* @returns The encoded bytes
|
|
63
|
+
*/
|
|
64
|
+
function encodeDeltaSize(size) {
|
|
65
|
+
const bytes = [];
|
|
66
|
+
do {
|
|
67
|
+
let byte = size & 0x7f;
|
|
68
|
+
size >>>= 7;
|
|
69
|
+
if (size > 0) {
|
|
70
|
+
byte |= 0x80; // Set continuation bit
|
|
71
|
+
}
|
|
72
|
+
bytes.push(byte);
|
|
73
|
+
} while (size > 0);
|
|
74
|
+
return new Uint8Array(bytes);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Apply a delta to a base object to produce the target object
|
|
78
|
+
*
|
|
79
|
+
* @param base The source/base object
|
|
80
|
+
* @param delta The delta data
|
|
81
|
+
* @returns The reconstructed target object
|
|
82
|
+
* @throws Error if delta is invalid or sizes don't match
|
|
83
|
+
*/
|
|
84
|
+
export function applyDelta(base, delta) {
|
|
85
|
+
let offset = 0;
|
|
86
|
+
// Parse source size
|
|
87
|
+
const sourceHeader = parseDeltaHeader(delta, offset);
|
|
88
|
+
offset += sourceHeader.bytesRead;
|
|
89
|
+
if (sourceHeader.size !== base.length) {
|
|
90
|
+
throw new Error(`Delta source size mismatch: expected ${sourceHeader.size}, got ${base.length}`);
|
|
91
|
+
}
|
|
92
|
+
// Parse target size
|
|
93
|
+
const targetHeader = parseDeltaHeader(delta, offset);
|
|
94
|
+
offset += targetHeader.bytesRead;
|
|
95
|
+
// Allocate result buffer
|
|
96
|
+
const result = new Uint8Array(targetHeader.size);
|
|
97
|
+
let resultOffset = 0;
|
|
98
|
+
// Process instructions
|
|
99
|
+
while (offset < delta.length) {
|
|
100
|
+
const cmd = delta[offset++];
|
|
101
|
+
if (cmd & COPY_INSTRUCTION) {
|
|
102
|
+
// Copy instruction
|
|
103
|
+
let copyOffset = 0;
|
|
104
|
+
let copySize = 0;
|
|
105
|
+
// Read offset bytes (bits 0-3 indicate which bytes are present)
|
|
106
|
+
if (cmd & 0x01)
|
|
107
|
+
copyOffset |= delta[offset++];
|
|
108
|
+
if (cmd & 0x02)
|
|
109
|
+
copyOffset |= delta[offset++] << 8;
|
|
110
|
+
if (cmd & 0x04)
|
|
111
|
+
copyOffset |= delta[offset++] << 16;
|
|
112
|
+
if (cmd & 0x08)
|
|
113
|
+
copyOffset |= delta[offset++] << 24;
|
|
114
|
+
// Read size bytes (bits 4-6 indicate which bytes are present)
|
|
115
|
+
if (cmd & 0x10)
|
|
116
|
+
copySize |= delta[offset++];
|
|
117
|
+
if (cmd & 0x20)
|
|
118
|
+
copySize |= delta[offset++] << 8;
|
|
119
|
+
if (cmd & 0x40)
|
|
120
|
+
copySize |= delta[offset++] << 16;
|
|
121
|
+
// Size of 0 means 0x10000 (65536)
|
|
122
|
+
if (copySize === 0) {
|
|
123
|
+
copySize = 0x10000;
|
|
124
|
+
}
|
|
125
|
+
// Bounds checking to prevent buffer overflows
|
|
126
|
+
if (copyOffset < 0 || copySize < 0) {
|
|
127
|
+
throw new Error(`Invalid copy instruction: offset=${copyOffset}, size=${copySize}`);
|
|
128
|
+
}
|
|
129
|
+
if (copyOffset + copySize > base.length) {
|
|
130
|
+
throw new Error(`Copy instruction out of bounds: offset=${copyOffset}, size=${copySize}, base length=${base.length}`);
|
|
131
|
+
}
|
|
132
|
+
if (resultOffset + copySize > result.length) {
|
|
133
|
+
throw new Error(`Copy would overflow result buffer: resultOffset=${resultOffset}, size=${copySize}, result length=${result.length}`);
|
|
134
|
+
}
|
|
135
|
+
// Copy from base to result
|
|
136
|
+
result.set(base.subarray(copyOffset, copyOffset + copySize), resultOffset);
|
|
137
|
+
resultOffset += copySize;
|
|
138
|
+
}
|
|
139
|
+
else if (cmd !== 0) {
|
|
140
|
+
// Insert instruction: cmd is the number of bytes to insert
|
|
141
|
+
const insertSize = cmd;
|
|
142
|
+
result.set(delta.subarray(offset, offset + insertSize), resultOffset);
|
|
143
|
+
offset += insertSize;
|
|
144
|
+
resultOffset += insertSize;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
// cmd === 0 is reserved/invalid
|
|
148
|
+
throw new Error('Invalid delta instruction: 0x00');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Verify we produced the expected size
|
|
152
|
+
if (resultOffset !== targetHeader.size) {
|
|
153
|
+
throw new Error(`Delta result size mismatch: expected ${targetHeader.size}, got ${resultOffset}`);
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Create a delta between two objects
|
|
159
|
+
*
|
|
160
|
+
* This uses a simple but effective algorithm:
|
|
161
|
+
* 1. Build a hash table of 4-byte sequences in the base
|
|
162
|
+
* 2. Scan the target looking for matches
|
|
163
|
+
* 3. Emit copy instructions for matches, insert for non-matches
|
|
164
|
+
*
|
|
165
|
+
* @param base The source/base object
|
|
166
|
+
* @param target The target object to encode
|
|
167
|
+
* @returns The delta data
|
|
168
|
+
*/
|
|
169
|
+
export function createDelta(base, target) {
|
|
170
|
+
const instructions = [];
|
|
171
|
+
// Add source and target size headers
|
|
172
|
+
instructions.push(encodeDeltaSize(base.length));
|
|
173
|
+
instructions.push(encodeDeltaSize(target.length));
|
|
174
|
+
if (target.length === 0) {
|
|
175
|
+
// Empty target, just return headers
|
|
176
|
+
return concatArrays(instructions);
|
|
177
|
+
}
|
|
178
|
+
if (base.length === 0) {
|
|
179
|
+
// No base to copy from, insert everything
|
|
180
|
+
emitInserts(instructions, target, 0, target.length);
|
|
181
|
+
return concatArrays(instructions);
|
|
182
|
+
}
|
|
183
|
+
// Build hash table for base object
|
|
184
|
+
// Key: 4-byte hash, Value: array of offsets
|
|
185
|
+
const WINDOW_SIZE = 4;
|
|
186
|
+
const hashTable = new Map();
|
|
187
|
+
if (base.length >= WINDOW_SIZE) {
|
|
188
|
+
for (let i = 0; i <= base.length - WINDOW_SIZE; i++) {
|
|
189
|
+
const hash = hashBytes(base, i, WINDOW_SIZE);
|
|
190
|
+
const offsets = hashTable.get(hash);
|
|
191
|
+
if (offsets) {
|
|
192
|
+
offsets.push(i);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
hashTable.set(hash, [i]);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Scan target and find matches
|
|
200
|
+
let targetOffset = 0;
|
|
201
|
+
let insertStart = 0;
|
|
202
|
+
while (targetOffset < target.length) {
|
|
203
|
+
let bestMatchOffset = -1;
|
|
204
|
+
let bestMatchLength = 0;
|
|
205
|
+
// Look for a match if we have enough bytes
|
|
206
|
+
if (targetOffset <= target.length - WINDOW_SIZE) {
|
|
207
|
+
const hash = hashBytes(target, targetOffset, WINDOW_SIZE);
|
|
208
|
+
const candidates = hashTable.get(hash);
|
|
209
|
+
if (candidates) {
|
|
210
|
+
for (const baseOffset of candidates) {
|
|
211
|
+
// Verify the match and extend it
|
|
212
|
+
const matchLength = getMatchLength(base, baseOffset, target, targetOffset, Math.min(base.length - baseOffset, target.length - targetOffset));
|
|
213
|
+
if (matchLength >= WINDOW_SIZE && matchLength > bestMatchLength) {
|
|
214
|
+
bestMatchOffset = baseOffset;
|
|
215
|
+
bestMatchLength = matchLength;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Minimum match length to be worth a copy instruction
|
|
221
|
+
const MIN_COPY_SIZE = 4;
|
|
222
|
+
if (bestMatchLength >= MIN_COPY_SIZE) {
|
|
223
|
+
// Emit pending inserts
|
|
224
|
+
if (targetOffset > insertStart) {
|
|
225
|
+
emitInserts(instructions, target, insertStart, targetOffset);
|
|
226
|
+
}
|
|
227
|
+
// Emit copy instruction
|
|
228
|
+
emitCopy(instructions, bestMatchOffset, bestMatchLength);
|
|
229
|
+
targetOffset += bestMatchLength;
|
|
230
|
+
insertStart = targetOffset;
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
targetOffset++;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Emit any remaining inserts
|
|
237
|
+
if (target.length > insertStart) {
|
|
238
|
+
emitInserts(instructions, target, insertStart, target.length);
|
|
239
|
+
}
|
|
240
|
+
return concatArrays(instructions);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Simple hash function for a sequence of bytes
|
|
244
|
+
*/
|
|
245
|
+
function hashBytes(data, offset, length) {
|
|
246
|
+
let hash = 0;
|
|
247
|
+
for (let i = 0; i < length; i++) {
|
|
248
|
+
hash = ((hash << 5) - hash + data[offset + i]) | 0;
|
|
249
|
+
}
|
|
250
|
+
return hash;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get the length of matching bytes between two arrays
|
|
254
|
+
*/
|
|
255
|
+
function getMatchLength(a, aOffset, b, bOffset, maxLength) {
|
|
256
|
+
let length = 0;
|
|
257
|
+
while (length < maxLength && a[aOffset + length] === b[bOffset + length]) {
|
|
258
|
+
length++;
|
|
259
|
+
}
|
|
260
|
+
return length;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Emit insert instructions for a range of bytes
|
|
264
|
+
* Insert commands can only handle 1-127 bytes, so we may need multiple
|
|
265
|
+
*/
|
|
266
|
+
function emitInserts(instructions, data, start, end) {
|
|
267
|
+
const MAX_INSERT = 127;
|
|
268
|
+
let offset = start;
|
|
269
|
+
while (offset < end) {
|
|
270
|
+
const size = Math.min(MAX_INSERT, end - offset);
|
|
271
|
+
const instruction = new Uint8Array(1 + size);
|
|
272
|
+
instruction[0] = size; // Insert command: size in lower 7 bits
|
|
273
|
+
instruction.set(data.subarray(offset, offset + size), 1);
|
|
274
|
+
instructions.push(instruction);
|
|
275
|
+
offset += size;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Emit a copy instruction
|
|
280
|
+
*/
|
|
281
|
+
function emitCopy(instructions, offset, size) {
|
|
282
|
+
const bytes = [];
|
|
283
|
+
let cmd = COPY_INSTRUCTION;
|
|
284
|
+
// Encode offset bytes (little-endian)
|
|
285
|
+
if (offset & 0xff) {
|
|
286
|
+
cmd |= 0x01;
|
|
287
|
+
bytes.push(offset & 0xff);
|
|
288
|
+
}
|
|
289
|
+
if (offset & 0xff00) {
|
|
290
|
+
cmd |= 0x02;
|
|
291
|
+
bytes.push((offset >> 8) & 0xff);
|
|
292
|
+
}
|
|
293
|
+
if (offset & 0xff0000) {
|
|
294
|
+
cmd |= 0x04;
|
|
295
|
+
bytes.push((offset >> 16) & 0xff);
|
|
296
|
+
}
|
|
297
|
+
if (offset & 0xff000000) {
|
|
298
|
+
cmd |= 0x08;
|
|
299
|
+
bytes.push((offset >> 24) & 0xff);
|
|
300
|
+
}
|
|
301
|
+
// Special case: if offset is 0, we don't emit any offset bytes
|
|
302
|
+
// The cmd byte already indicates no offset bytes are present
|
|
303
|
+
// Encode size bytes (little-endian)
|
|
304
|
+
// Note: size of 0x10000 is encoded as no size bytes (all zero)
|
|
305
|
+
if (size !== 0x10000) {
|
|
306
|
+
if (size & 0xff) {
|
|
307
|
+
cmd |= 0x10;
|
|
308
|
+
bytes.push(size & 0xff);
|
|
309
|
+
}
|
|
310
|
+
if (size & 0xff00) {
|
|
311
|
+
cmd |= 0x20;
|
|
312
|
+
bytes.push((size >> 8) & 0xff);
|
|
313
|
+
}
|
|
314
|
+
if (size & 0xff0000) {
|
|
315
|
+
cmd |= 0x40;
|
|
316
|
+
bytes.push((size >> 16) & 0xff);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// If size is 0x10000, we don't set any size bits, which encodes as size=0x10000
|
|
320
|
+
const instruction = new Uint8Array(1 + bytes.length);
|
|
321
|
+
instruction[0] = cmd;
|
|
322
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
323
|
+
instruction[1 + i] = bytes[i];
|
|
324
|
+
}
|
|
325
|
+
instructions.push(instruction);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Concatenate multiple Uint8Arrays into one
|
|
329
|
+
*/
|
|
330
|
+
function concatArrays(arrays) {
|
|
331
|
+
let totalLength = 0;
|
|
332
|
+
for (const arr of arrays) {
|
|
333
|
+
totalLength += arr.length;
|
|
334
|
+
}
|
|
335
|
+
const result = new Uint8Array(totalLength);
|
|
336
|
+
let offset = 0;
|
|
337
|
+
for (const arr of arrays) {
|
|
338
|
+
result.set(arr, offset);
|
|
339
|
+
offset += arr.length;
|
|
340
|
+
}
|
|
341
|
+
return result;
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=delta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/pack/delta.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Packfile Format Implementation
|
|
3
|
+
*
|
|
4
|
+
* The packfile format is used by git for efficient storage and transfer of objects.
|
|
5
|
+
* Format:
|
|
6
|
+
* - 4 bytes: "PACK" signature
|
|
7
|
+
* - 4 bytes: version number (network byte order, big-endian)
|
|
8
|
+
* - 4 bytes: number of objects (network byte order)
|
|
9
|
+
* - N objects: each object has header + compressed data
|
|
10
|
+
* - 20 bytes: SHA-1 checksum of all preceding content
|
|
11
|
+
*
|
|
12
|
+
* Object header encoding:
|
|
13
|
+
* - First byte: (MSB) continuation bit | 3-bit type | 4-bit size LSB
|
|
14
|
+
* - Subsequent bytes: (MSB) continuation bit | 7-bit size
|
|
15
|
+
*
|
|
16
|
+
* Object types:
|
|
17
|
+
* - 1: commit
|
|
18
|
+
* - 2: tree
|
|
19
|
+
* - 3: blob
|
|
20
|
+
* - 4: tag
|
|
21
|
+
* - 6: ofs_delta (offset delta)
|
|
22
|
+
* - 7: ref_delta (reference delta)
|
|
23
|
+
*/
|
|
24
|
+
export declare const PACK_SIGNATURE = "PACK";
|
|
25
|
+
export declare const PACK_VERSION = 2;
|
|
26
|
+
export declare enum PackObjectType {
|
|
27
|
+
OBJ_COMMIT = 1,
|
|
28
|
+
OBJ_TREE = 2,
|
|
29
|
+
OBJ_BLOB = 3,
|
|
30
|
+
OBJ_TAG = 4,
|
|
31
|
+
OBJ_OFS_DELTA = 6,
|
|
32
|
+
OBJ_REF_DELTA = 7
|
|
33
|
+
}
|
|
34
|
+
export declare function packObjectTypeToString(type: PackObjectType): string;
|
|
35
|
+
export declare function stringToPackObjectType(str: string): PackObjectType;
|
|
36
|
+
export declare function encodeVarint(value: number): Uint8Array;
|
|
37
|
+
export declare function decodeVarint(data: Uint8Array, offset: number): {
|
|
38
|
+
value: number;
|
|
39
|
+
bytesRead: number;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Encode object type and size into pack object header format
|
|
43
|
+
*
|
|
44
|
+
* First byte: MSB continuation bit | 3-bit type | 4-bit size LSB
|
|
45
|
+
* Subsequent bytes: MSB continuation bit | 7-bit size continuation
|
|
46
|
+
*/
|
|
47
|
+
export declare function encodeTypeAndSize(type: PackObjectType, size: number): Uint8Array;
|
|
48
|
+
export declare function decodeTypeAndSize(data: Uint8Array, offset: number): {
|
|
49
|
+
type: PackObjectType;
|
|
50
|
+
size: number;
|
|
51
|
+
bytesRead: number;
|
|
52
|
+
};
|
|
53
|
+
export interface PackHeader {
|
|
54
|
+
signature: string;
|
|
55
|
+
version: number;
|
|
56
|
+
objectCount: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parse pack file header
|
|
60
|
+
* @param data - The packfile data
|
|
61
|
+
* @returns Parsed header information
|
|
62
|
+
*/
|
|
63
|
+
export declare function parsePackHeader(data: Uint8Array): PackHeader;
|
|
64
|
+
export interface ParsedPackObject {
|
|
65
|
+
type: PackObjectType;
|
|
66
|
+
size: number;
|
|
67
|
+
headerSize: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parse individual pack object header
|
|
71
|
+
* Note: This only parses the header, not the compressed data
|
|
72
|
+
*/
|
|
73
|
+
export declare function parsePackObject(data: Uint8Array, offset: number): ParsedPackObject;
|
|
74
|
+
export interface PackableObject {
|
|
75
|
+
type: 'blob' | 'tree' | 'commit' | 'tag';
|
|
76
|
+
data: Uint8Array;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a packfile from a list of objects
|
|
80
|
+
* @param objects - Array of objects to pack
|
|
81
|
+
* @returns Complete packfile as Uint8Array
|
|
82
|
+
*/
|
|
83
|
+
export declare function createPackfile(objects: PackableObject[]): Uint8Array;
|
|
84
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/pack/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,eAAO,MAAM,cAAc,SAAS,CAAA;AACpC,eAAO,MAAM,YAAY,IAAI,CAAA;AAG7B,oBAAY,cAAc;IACxB,UAAU,IAAI;IACd,QAAQ,IAAI;IACZ,QAAQ,IAAI;IACZ,OAAO,IAAI;IACX,aAAa,IAAI;IACjB,aAAa,IAAI;CAClB;AAGD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAiBnE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAalE;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CActD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CA2BnG;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAuBhF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG;IACnE,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,CAyCA;AAGD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAqB5D;AAGD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAQlF;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;IACxC,IAAI,EAAE,UAAU,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,UAAU,CA2DpE"}
|