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,606 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit Creation Operations
|
|
3
|
+
*
|
|
4
|
+
* Provides functionality for creating, formatting, and amending git commits.
|
|
5
|
+
* Supports author/committer info, parent handling, GPG signing, and message formatting.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Author/Timestamp Utilities
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Get the current timezone offset string
|
|
12
|
+
*
|
|
13
|
+
* @returns Timezone offset like '+0000' or '-0500'
|
|
14
|
+
*/
|
|
15
|
+
export function getCurrentTimezone() {
|
|
16
|
+
const offset = new Date().getTimezoneOffset();
|
|
17
|
+
const sign = offset <= 0 ? '+' : '-';
|
|
18
|
+
const absOffset = Math.abs(offset);
|
|
19
|
+
const hours = Math.floor(absOffset / 60);
|
|
20
|
+
const minutes = absOffset % 60;
|
|
21
|
+
return `${sign}${String(hours).padStart(2, '0')}${String(minutes).padStart(2, '0')}`;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Format a timestamp and timezone as git author/committer format
|
|
25
|
+
*
|
|
26
|
+
* @param timestamp - Unix timestamp in seconds
|
|
27
|
+
* @param timezone - Timezone offset string (e.g., '+0000', '-0500')
|
|
28
|
+
* @returns Formatted string like "1234567890 +0000"
|
|
29
|
+
*/
|
|
30
|
+
export function formatTimestamp(timestamp, timezone) {
|
|
31
|
+
return `${timestamp} ${timezone}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse a git timestamp string
|
|
35
|
+
*
|
|
36
|
+
* @param timestampStr - Timestamp string like "1234567890 +0000"
|
|
37
|
+
* @returns Object with timestamp and timezone
|
|
38
|
+
*/
|
|
39
|
+
export function parseTimestamp(timestampStr) {
|
|
40
|
+
const match = timestampStr.match(/^(\d+) ([+-]\d{4})$/);
|
|
41
|
+
if (!match) {
|
|
42
|
+
throw new Error(`Invalid timestamp format: ${timestampStr}`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
timestamp: parseInt(match[1], 10),
|
|
46
|
+
timezone: match[2]
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create an Author object with current timestamp
|
|
51
|
+
*
|
|
52
|
+
* @param name - Author name
|
|
53
|
+
* @param email - Author email
|
|
54
|
+
* @param timezone - Optional timezone (defaults to local timezone)
|
|
55
|
+
* @returns Author object with current timestamp
|
|
56
|
+
*/
|
|
57
|
+
export function createAuthor(name, email, timezone) {
|
|
58
|
+
return {
|
|
59
|
+
name,
|
|
60
|
+
email,
|
|
61
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
62
|
+
timezone: timezone ?? getCurrentTimezone()
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Message Formatting
|
|
67
|
+
// ============================================================================
|
|
68
|
+
/**
|
|
69
|
+
* Wrap text at a specified column width
|
|
70
|
+
*/
|
|
71
|
+
function wrapText(text, column) {
|
|
72
|
+
if (column <= 0)
|
|
73
|
+
return text;
|
|
74
|
+
const words = text.split(/\s+/);
|
|
75
|
+
const lines = [];
|
|
76
|
+
let currentLine = '';
|
|
77
|
+
for (const word of words) {
|
|
78
|
+
if (currentLine.length === 0) {
|
|
79
|
+
currentLine = word;
|
|
80
|
+
}
|
|
81
|
+
else if (currentLine.length + 1 + word.length <= column) {
|
|
82
|
+
currentLine += ' ' + word;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
lines.push(currentLine);
|
|
86
|
+
currentLine = word;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (currentLine.length > 0) {
|
|
90
|
+
lines.push(currentLine);
|
|
91
|
+
}
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Format a commit message according to git conventions
|
|
96
|
+
*
|
|
97
|
+
* @param message - The raw commit message
|
|
98
|
+
* @param options - Formatting options
|
|
99
|
+
* @returns The formatted commit message
|
|
100
|
+
*/
|
|
101
|
+
export function formatCommitMessage(message, options = {}) {
|
|
102
|
+
const { cleanup = 'default', commentChar = '#', wrapColumn = 0 } = options;
|
|
103
|
+
// Verbatim mode: return message as-is
|
|
104
|
+
if (cleanup === 'verbatim') {
|
|
105
|
+
return message;
|
|
106
|
+
}
|
|
107
|
+
let result = message;
|
|
108
|
+
// Scissors mode: remove everything after scissors line
|
|
109
|
+
if (cleanup === 'scissors') {
|
|
110
|
+
const scissorsPattern = new RegExp(`^${commentChar} -+ >8 -+`, 'm');
|
|
111
|
+
const scissorsMatch = result.match(scissorsPattern);
|
|
112
|
+
if (scissorsMatch && scissorsMatch.index !== undefined) {
|
|
113
|
+
result = result.slice(0, scissorsMatch.index);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Strip comments if cleanup is 'strip' or 'scissors'
|
|
117
|
+
if (cleanup === 'strip' || cleanup === 'scissors') {
|
|
118
|
+
const lines = result.split('\n');
|
|
119
|
+
result = lines.filter(line => !line.startsWith(commentChar)).join('\n');
|
|
120
|
+
}
|
|
121
|
+
// Strip whitespace (for 'whitespace', 'strip', 'scissors', 'default')
|
|
122
|
+
// Note: verbatim check already handled above, so this always runs
|
|
123
|
+
if (true) {
|
|
124
|
+
// Strip leading/trailing whitespace from each line
|
|
125
|
+
const lines = result.split('\n');
|
|
126
|
+
const trimmedLines = lines.map(line => line.trim());
|
|
127
|
+
// Collapse multiple blank lines into one
|
|
128
|
+
const collapsedLines = [];
|
|
129
|
+
let lastWasBlank = false;
|
|
130
|
+
for (const line of trimmedLines) {
|
|
131
|
+
if (line === '') {
|
|
132
|
+
if (!lastWasBlank) {
|
|
133
|
+
collapsedLines.push(line);
|
|
134
|
+
}
|
|
135
|
+
lastWasBlank = true;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
collapsedLines.push(line);
|
|
139
|
+
lastWasBlank = false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
result = collapsedLines.join('\n');
|
|
143
|
+
// Trim leading/trailing blank lines
|
|
144
|
+
result = result.replace(/^\n+/, '').replace(/\n+$/, '');
|
|
145
|
+
}
|
|
146
|
+
// Wrap body (not subject) if wrapColumn is specified
|
|
147
|
+
if (wrapColumn > 0 && result.length > 0) {
|
|
148
|
+
const lines = result.split('\n');
|
|
149
|
+
if (lines.length > 0) {
|
|
150
|
+
const subject = lines[0];
|
|
151
|
+
const rest = lines.slice(1);
|
|
152
|
+
// Find where body starts (after blank line)
|
|
153
|
+
let bodyStartIndex = 0;
|
|
154
|
+
for (let i = 0; i < rest.length; i++) {
|
|
155
|
+
if (rest[i] === '') {
|
|
156
|
+
bodyStartIndex = i + 1;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Wrap body lines
|
|
161
|
+
const wrappedRest = [];
|
|
162
|
+
for (let i = 0; i < rest.length; i++) {
|
|
163
|
+
if (i >= bodyStartIndex && rest[i] !== '') {
|
|
164
|
+
wrappedRest.push(wrapText(rest[i], wrapColumn));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
wrappedRest.push(rest[i]);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
result = [subject, ...wrappedRest].join('\n');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Parse a commit message into subject and body
|
|
177
|
+
*
|
|
178
|
+
* @param message - The commit message
|
|
179
|
+
* @returns Object with subject (first line) and body (rest)
|
|
180
|
+
*/
|
|
181
|
+
export function parseCommitMessage(message) {
|
|
182
|
+
if (!message) {
|
|
183
|
+
return { subject: '', body: '' };
|
|
184
|
+
}
|
|
185
|
+
const lines = message.split('\n');
|
|
186
|
+
const subject = lines[0] || '';
|
|
187
|
+
// Find the body - it starts after the first blank line (or second line if no blank)
|
|
188
|
+
let bodyStartIndex = 1;
|
|
189
|
+
for (let i = 1; i < lines.length; i++) {
|
|
190
|
+
if (lines[i] === '') {
|
|
191
|
+
bodyStartIndex = i + 1;
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const body = lines.slice(bodyStartIndex).join('\n');
|
|
196
|
+
return { subject, body };
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Validate a commit message format
|
|
200
|
+
*
|
|
201
|
+
* @param message - The commit message to validate
|
|
202
|
+
* @returns Object with valid flag and any error messages
|
|
203
|
+
*/
|
|
204
|
+
export function validateCommitMessage(message) {
|
|
205
|
+
const errors = [];
|
|
206
|
+
const warnings = [];
|
|
207
|
+
if (!message || message.trim() === '') {
|
|
208
|
+
errors.push('Commit message is empty');
|
|
209
|
+
return { valid: false, errors, warnings };
|
|
210
|
+
}
|
|
211
|
+
const { subject, body: _body } = parseCommitMessage(message);
|
|
212
|
+
// Check subject line length (72 chars is conventional max)
|
|
213
|
+
if (subject.length > 72) {
|
|
214
|
+
warnings.push('Subject line exceeds 72 characters');
|
|
215
|
+
}
|
|
216
|
+
// Check if subject ends with a period
|
|
217
|
+
if (subject.endsWith('.')) {
|
|
218
|
+
warnings.push('Subject line should not end with a period');
|
|
219
|
+
}
|
|
220
|
+
// Check for missing blank line between subject and body
|
|
221
|
+
const lines = message.split('\n');
|
|
222
|
+
if (lines.length > 1 && lines[1] !== '') {
|
|
223
|
+
warnings.push('Missing blank line between subject and body');
|
|
224
|
+
}
|
|
225
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
226
|
+
}
|
|
227
|
+
// ============================================================================
|
|
228
|
+
// GPG Signing
|
|
229
|
+
// ============================================================================
|
|
230
|
+
/**
|
|
231
|
+
* Check if a commit is signed
|
|
232
|
+
*
|
|
233
|
+
* @param commit - The commit object
|
|
234
|
+
* @returns true if the commit has a GPG signature
|
|
235
|
+
*/
|
|
236
|
+
export function isCommitSigned(commit) {
|
|
237
|
+
const signedCommit = commit;
|
|
238
|
+
return signedCommit.gpgsig !== undefined && signedCommit.gpgsig !== null;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Extract the GPG signature from a signed commit
|
|
242
|
+
*
|
|
243
|
+
* @param commit - The commit object
|
|
244
|
+
* @returns The signature if present, null otherwise
|
|
245
|
+
*/
|
|
246
|
+
export function extractCommitSignature(commit) {
|
|
247
|
+
const signedCommit = commit;
|
|
248
|
+
return signedCommit.gpgsig ?? null;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Add a GPG signature to a commit
|
|
252
|
+
*
|
|
253
|
+
* @param commit - The unsigned commit object
|
|
254
|
+
* @param signature - The GPG signature
|
|
255
|
+
* @returns The signed commit object
|
|
256
|
+
*/
|
|
257
|
+
export function addSignatureToCommit(commit, signature) {
|
|
258
|
+
const signedCommit = {
|
|
259
|
+
...commit,
|
|
260
|
+
gpgsig: signature
|
|
261
|
+
};
|
|
262
|
+
return signedCommit;
|
|
263
|
+
}
|
|
264
|
+
// ============================================================================
|
|
265
|
+
// Empty Commit Detection
|
|
266
|
+
// ============================================================================
|
|
267
|
+
/**
|
|
268
|
+
* Extract tree SHA from commit data
|
|
269
|
+
*/
|
|
270
|
+
function extractTreeFromCommitData(data) {
|
|
271
|
+
const decoder = new TextDecoder();
|
|
272
|
+
const content = decoder.decode(data);
|
|
273
|
+
const match = content.match(/tree ([0-9a-f]{40})/);
|
|
274
|
+
return match ? match[1] : null;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Check if a commit would be empty (same tree as parent)
|
|
278
|
+
*
|
|
279
|
+
* @param store - The object store for reading objects
|
|
280
|
+
* @param tree - The tree SHA for the new commit
|
|
281
|
+
* @param parent - The parent commit SHA (or null for initial commit)
|
|
282
|
+
* @returns true if the commit would have no changes
|
|
283
|
+
*/
|
|
284
|
+
export async function isEmptyCommit(store, tree, parent) {
|
|
285
|
+
// Initial commits are never "empty"
|
|
286
|
+
if (parent === null) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
const parentObj = await store.getObject(parent);
|
|
290
|
+
if (!parentObj) {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
// Extract tree from parent commit
|
|
294
|
+
const parentTree = extractTreeFromCommitData(parentObj.data);
|
|
295
|
+
return parentTree === tree;
|
|
296
|
+
}
|
|
297
|
+
// ============================================================================
|
|
298
|
+
// Validation Helpers
|
|
299
|
+
// ============================================================================
|
|
300
|
+
const SHA_REGEX = /^[0-9a-f]{40}$/;
|
|
301
|
+
function isValidSha(sha) {
|
|
302
|
+
return SHA_REGEX.test(sha);
|
|
303
|
+
}
|
|
304
|
+
function isValidEmail(email) {
|
|
305
|
+
// Basic email validation - must contain @ and have something before and after
|
|
306
|
+
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
|
307
|
+
}
|
|
308
|
+
function validateAuthorName(name) {
|
|
309
|
+
if (name.includes('<') || name.includes('>')) {
|
|
310
|
+
throw new Error('Author name cannot contain angle brackets');
|
|
311
|
+
}
|
|
312
|
+
if (name.includes('\n')) {
|
|
313
|
+
throw new Error('Author name cannot contain newlines');
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
function validateCommitOptions(options) {
|
|
317
|
+
// Validate tree
|
|
318
|
+
if (!options.tree) {
|
|
319
|
+
throw new Error('Tree SHA is required');
|
|
320
|
+
}
|
|
321
|
+
if (!isValidSha(options.tree)) {
|
|
322
|
+
throw new Error('Invalid tree SHA format');
|
|
323
|
+
}
|
|
324
|
+
// Validate author
|
|
325
|
+
if (!options.author) {
|
|
326
|
+
throw new Error('Author is required');
|
|
327
|
+
}
|
|
328
|
+
validateAuthorName(options.author.name);
|
|
329
|
+
if (!isValidEmail(options.author.email)) {
|
|
330
|
+
throw new Error('Invalid author email format');
|
|
331
|
+
}
|
|
332
|
+
// Validate committer if provided
|
|
333
|
+
if (options.committer) {
|
|
334
|
+
validateAuthorName(options.committer.name);
|
|
335
|
+
if (!isValidEmail(options.committer.email)) {
|
|
336
|
+
throw new Error('Invalid committer email format');
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// Validate message
|
|
340
|
+
if (!options.message || options.message.trim() === '') {
|
|
341
|
+
throw new Error('Commit message is required');
|
|
342
|
+
}
|
|
343
|
+
// Validate parents
|
|
344
|
+
if (options.parents) {
|
|
345
|
+
for (const parent of options.parents) {
|
|
346
|
+
if (!isValidSha(parent)) {
|
|
347
|
+
throw new Error('Invalid parent SHA format');
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Validate timestamp if provided
|
|
352
|
+
if (options.author.timestamp !== undefined && options.author.timestamp < 0) {
|
|
353
|
+
throw new Error('Timestamp cannot be negative');
|
|
354
|
+
}
|
|
355
|
+
if (options.committer?.timestamp !== undefined && options.committer.timestamp < 0) {
|
|
356
|
+
throw new Error('Timestamp cannot be negative');
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// ============================================================================
|
|
360
|
+
// Commit Creation
|
|
361
|
+
// ============================================================================
|
|
362
|
+
/**
|
|
363
|
+
* Resolve a CommitAuthor to a full Author with timestamp and timezone
|
|
364
|
+
*/
|
|
365
|
+
function resolveAuthor(commitAuthor) {
|
|
366
|
+
return {
|
|
367
|
+
name: commitAuthor.name,
|
|
368
|
+
email: commitAuthor.email,
|
|
369
|
+
timestamp: commitAuthor.timestamp ?? Math.floor(Date.now() / 1000),
|
|
370
|
+
timezone: commitAuthor.timezone ?? getCurrentTimezone()
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Serialize commit content to bytes (without the header)
|
|
375
|
+
*/
|
|
376
|
+
function serializeCommitContent(commit) {
|
|
377
|
+
const encoder = new TextEncoder();
|
|
378
|
+
const lines = [];
|
|
379
|
+
lines.push(`tree ${commit.tree}`);
|
|
380
|
+
for (const parent of commit.parents) {
|
|
381
|
+
lines.push(`parent ${parent}`);
|
|
382
|
+
}
|
|
383
|
+
lines.push(`author ${commit.author.name} <${commit.author.email}> ${commit.author.timestamp} ${commit.author.timezone}`);
|
|
384
|
+
lines.push(`committer ${commit.committer.name} <${commit.committer.email}> ${commit.committer.timestamp} ${commit.committer.timezone}`);
|
|
385
|
+
// Add gpgsig if present
|
|
386
|
+
if (commit.gpgsig) {
|
|
387
|
+
const sigLines = commit.gpgsig.split('\n');
|
|
388
|
+
lines.push(`gpgsig ${sigLines[0]}`);
|
|
389
|
+
for (let i = 1; i < sigLines.length; i++) {
|
|
390
|
+
lines.push(` ${sigLines[i]}`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
lines.push('');
|
|
394
|
+
lines.push(commit.message);
|
|
395
|
+
return encoder.encode(lines.join('\n'));
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Create a new commit from raw data without storing
|
|
399
|
+
*
|
|
400
|
+
* @param options - Commit creation options
|
|
401
|
+
* @returns The commit object (not stored)
|
|
402
|
+
*/
|
|
403
|
+
export function buildCommitObject(options) {
|
|
404
|
+
const author = resolveAuthor(options.author);
|
|
405
|
+
const committer = options.committer ? resolveAuthor(options.committer) : author;
|
|
406
|
+
const parents = options.parents ?? [];
|
|
407
|
+
const commit = {
|
|
408
|
+
type: 'commit',
|
|
409
|
+
data: new Uint8Array(),
|
|
410
|
+
tree: options.tree,
|
|
411
|
+
parents,
|
|
412
|
+
author,
|
|
413
|
+
committer,
|
|
414
|
+
message: options.message
|
|
415
|
+
};
|
|
416
|
+
// Set the data field
|
|
417
|
+
commit.data = serializeCommitContent({
|
|
418
|
+
tree: commit.tree,
|
|
419
|
+
parents: commit.parents,
|
|
420
|
+
author: commit.author,
|
|
421
|
+
committer: commit.committer,
|
|
422
|
+
message: commit.message
|
|
423
|
+
});
|
|
424
|
+
return commit;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Create a new commit
|
|
428
|
+
*
|
|
429
|
+
* @param store - The object store for reading/writing objects
|
|
430
|
+
* @param options - Commit creation options
|
|
431
|
+
* @returns The created commit result with SHA and commit object
|
|
432
|
+
* @throws Error if required options are missing or invalid
|
|
433
|
+
*/
|
|
434
|
+
export async function createCommit(store, options) {
|
|
435
|
+
// Validate options
|
|
436
|
+
validateCommitOptions(options);
|
|
437
|
+
const parents = options.parents ?? [];
|
|
438
|
+
// Check for empty commit
|
|
439
|
+
if (options.allowEmpty === false && parents.length > 0) {
|
|
440
|
+
const isEmpty = await isEmptyCommit(store, options.tree, parents[0]);
|
|
441
|
+
if (isEmpty) {
|
|
442
|
+
throw new Error('Nothing to commit (empty commit not allowed)');
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Build the commit object
|
|
446
|
+
let commit = buildCommitObject(options);
|
|
447
|
+
// Sign if requested
|
|
448
|
+
if (options.signing?.sign && options.signing.signer) {
|
|
449
|
+
const commitData = serializeCommitContent({
|
|
450
|
+
tree: commit.tree,
|
|
451
|
+
parents: commit.parents,
|
|
452
|
+
author: commit.author,
|
|
453
|
+
committer: commit.committer,
|
|
454
|
+
message: commit.message
|
|
455
|
+
});
|
|
456
|
+
const signature = await options.signing.signer(commitData);
|
|
457
|
+
commit = addSignatureToCommit(commit, signature);
|
|
458
|
+
// Update commit data with signature
|
|
459
|
+
const signedCommit = commit;
|
|
460
|
+
commit.data = serializeCommitContent({
|
|
461
|
+
tree: commit.tree,
|
|
462
|
+
parents: commit.parents,
|
|
463
|
+
author: commit.author,
|
|
464
|
+
committer: commit.committer,
|
|
465
|
+
message: commit.message,
|
|
466
|
+
gpgsig: signedCommit.gpgsig
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
// Store the commit
|
|
470
|
+
const sha = await store.storeObject('commit', commit.data);
|
|
471
|
+
return {
|
|
472
|
+
sha,
|
|
473
|
+
commit,
|
|
474
|
+
created: true
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
// ============================================================================
|
|
478
|
+
// Commit Amendment
|
|
479
|
+
// ============================================================================
|
|
480
|
+
/**
|
|
481
|
+
* Parse a stored commit object from data
|
|
482
|
+
* Supports both git text format and JSON format (for testing)
|
|
483
|
+
*/
|
|
484
|
+
function parseStoredCommit(data) {
|
|
485
|
+
const decoder = new TextDecoder();
|
|
486
|
+
const content = decoder.decode(data);
|
|
487
|
+
// Try to parse as JSON first (for test compatibility)
|
|
488
|
+
if (content.startsWith('{')) {
|
|
489
|
+
try {
|
|
490
|
+
const parsed = JSON.parse(content);
|
|
491
|
+
return {
|
|
492
|
+
tree: parsed.tree,
|
|
493
|
+
parents: parsed.parents || [],
|
|
494
|
+
author: parsed.author,
|
|
495
|
+
committer: parsed.committer || parsed.author,
|
|
496
|
+
message: parsed.message
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
catch {
|
|
500
|
+
// Not JSON, fall through to git format parsing
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
// Parse git text format
|
|
504
|
+
const lines = content.split('\n');
|
|
505
|
+
let tree = '';
|
|
506
|
+
const parents = [];
|
|
507
|
+
let author = null;
|
|
508
|
+
let committer = null;
|
|
509
|
+
let messageStartIndex = 0;
|
|
510
|
+
for (let i = 0; i < lines.length; i++) {
|
|
511
|
+
const line = lines[i];
|
|
512
|
+
if (line === '') {
|
|
513
|
+
messageStartIndex = i + 1;
|
|
514
|
+
break;
|
|
515
|
+
}
|
|
516
|
+
if (line.startsWith('tree ')) {
|
|
517
|
+
tree = line.slice(5);
|
|
518
|
+
}
|
|
519
|
+
else if (line.startsWith('parent ')) {
|
|
520
|
+
parents.push(line.slice(7));
|
|
521
|
+
}
|
|
522
|
+
else if (line.startsWith('author ')) {
|
|
523
|
+
const match = line.match(/^author (.+) <(.+)> (\d+) ([+-]\d{4})$/);
|
|
524
|
+
if (match) {
|
|
525
|
+
author = {
|
|
526
|
+
name: match[1],
|
|
527
|
+
email: match[2],
|
|
528
|
+
timestamp: parseInt(match[3], 10),
|
|
529
|
+
timezone: match[4]
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
else if (line.startsWith('committer ')) {
|
|
534
|
+
const match = line.match(/^committer (.+) <(.+)> (\d+) ([+-]\d{4})$/);
|
|
535
|
+
if (match) {
|
|
536
|
+
committer = {
|
|
537
|
+
name: match[1],
|
|
538
|
+
email: match[2],
|
|
539
|
+
timestamp: parseInt(match[3], 10),
|
|
540
|
+
timezone: match[4]
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
const message = lines.slice(messageStartIndex).join('\n');
|
|
546
|
+
if (!author) {
|
|
547
|
+
author = { name: 'Unknown', email: 'unknown@example.com', timestamp: 0, timezone: '+0000' };
|
|
548
|
+
}
|
|
549
|
+
if (!committer) {
|
|
550
|
+
committer = author;
|
|
551
|
+
}
|
|
552
|
+
return { tree, parents, author, committer, message };
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Amend an existing commit
|
|
556
|
+
*
|
|
557
|
+
* @param store - The object store for reading/writing objects
|
|
558
|
+
* @param commitSha - SHA of the commit to amend
|
|
559
|
+
* @param options - Amendment options
|
|
560
|
+
* @returns The new commit result (original commit is not modified)
|
|
561
|
+
* @throws Error if the commit doesn't exist or options are invalid
|
|
562
|
+
*/
|
|
563
|
+
export async function amendCommit(store, commitSha, options) {
|
|
564
|
+
// Get the original commit
|
|
565
|
+
const originalObj = await store.getObject(commitSha);
|
|
566
|
+
if (!originalObj) {
|
|
567
|
+
throw new Error(`Commit not found: ${commitSha}`);
|
|
568
|
+
}
|
|
569
|
+
// Parse the original commit
|
|
570
|
+
const original = parseStoredCommit(originalObj.data);
|
|
571
|
+
// Build new author
|
|
572
|
+
let newAuthor = original.author;
|
|
573
|
+
if (options.author) {
|
|
574
|
+
newAuthor = resolveAuthor(options.author);
|
|
575
|
+
}
|
|
576
|
+
else if (options.resetAuthorDate) {
|
|
577
|
+
newAuthor = {
|
|
578
|
+
...original.author,
|
|
579
|
+
timestamp: Math.floor(Date.now() / 1000)
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
// Build new committer (defaults to current time)
|
|
583
|
+
let newCommitter;
|
|
584
|
+
if (options.committer) {
|
|
585
|
+
newCommitter = resolveAuthor(options.committer);
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
newCommitter = {
|
|
589
|
+
...original.committer,
|
|
590
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
591
|
+
timezone: getCurrentTimezone()
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
// Build new commit
|
|
595
|
+
const newCommitOptions = {
|
|
596
|
+
message: options.message ?? original.message,
|
|
597
|
+
tree: options.tree ?? original.tree,
|
|
598
|
+
parents: original.parents,
|
|
599
|
+
author: newAuthor,
|
|
600
|
+
committer: newCommitter,
|
|
601
|
+
signing: options.signing,
|
|
602
|
+
allowEmpty: true
|
|
603
|
+
};
|
|
604
|
+
return createCommit(store, newCommitOptions);
|
|
605
|
+
}
|
|
606
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/ops/commit.ts"],"names":[],"mappings":"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"}
|