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.
Files changed (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/durable-object/object-store.d.ts +113 -0
  4. package/dist/durable-object/object-store.d.ts.map +1 -0
  5. package/dist/durable-object/object-store.js +387 -0
  6. package/dist/durable-object/object-store.js.map +1 -0
  7. package/dist/durable-object/schema.d.ts +17 -0
  8. package/dist/durable-object/schema.d.ts.map +1 -0
  9. package/dist/durable-object/schema.js +43 -0
  10. package/dist/durable-object/schema.js.map +1 -0
  11. package/dist/durable-object/wal.d.ts +111 -0
  12. package/dist/durable-object/wal.d.ts.map +1 -0
  13. package/dist/durable-object/wal.js +200 -0
  14. package/dist/durable-object/wal.js.map +1 -0
  15. package/dist/index.d.ts +24 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +101 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mcp/adapter.d.ts +231 -0
  20. package/dist/mcp/adapter.d.ts.map +1 -0
  21. package/dist/mcp/adapter.js +502 -0
  22. package/dist/mcp/adapter.js.map +1 -0
  23. package/dist/mcp/sandbox.d.ts +261 -0
  24. package/dist/mcp/sandbox.d.ts.map +1 -0
  25. package/dist/mcp/sandbox.js +983 -0
  26. package/dist/mcp/sandbox.js.map +1 -0
  27. package/dist/mcp/sdk-adapter.d.ts +413 -0
  28. package/dist/mcp/sdk-adapter.d.ts.map +1 -0
  29. package/dist/mcp/sdk-adapter.js +672 -0
  30. package/dist/mcp/sdk-adapter.js.map +1 -0
  31. package/dist/mcp/tools.d.ts +133 -0
  32. package/dist/mcp/tools.d.ts.map +1 -0
  33. package/dist/mcp/tools.js +1604 -0
  34. package/dist/mcp/tools.js.map +1 -0
  35. package/dist/ops/blame.d.ts +148 -0
  36. package/dist/ops/blame.d.ts.map +1 -0
  37. package/dist/ops/blame.js +754 -0
  38. package/dist/ops/blame.js.map +1 -0
  39. package/dist/ops/branch.d.ts +215 -0
  40. package/dist/ops/branch.d.ts.map +1 -0
  41. package/dist/ops/branch.js +608 -0
  42. package/dist/ops/branch.js.map +1 -0
  43. package/dist/ops/commit-traversal.d.ts +209 -0
  44. package/dist/ops/commit-traversal.d.ts.map +1 -0
  45. package/dist/ops/commit-traversal.js +755 -0
  46. package/dist/ops/commit-traversal.js.map +1 -0
  47. package/dist/ops/commit.d.ts +221 -0
  48. package/dist/ops/commit.d.ts.map +1 -0
  49. package/dist/ops/commit.js +606 -0
  50. package/dist/ops/commit.js.map +1 -0
  51. package/dist/ops/merge-base.d.ts +223 -0
  52. package/dist/ops/merge-base.d.ts.map +1 -0
  53. package/dist/ops/merge-base.js +581 -0
  54. package/dist/ops/merge-base.js.map +1 -0
  55. package/dist/ops/merge.d.ts +385 -0
  56. package/dist/ops/merge.d.ts.map +1 -0
  57. package/dist/ops/merge.js +1203 -0
  58. package/dist/ops/merge.js.map +1 -0
  59. package/dist/ops/tag.d.ts +182 -0
  60. package/dist/ops/tag.d.ts.map +1 -0
  61. package/dist/ops/tag.js +608 -0
  62. package/dist/ops/tag.js.map +1 -0
  63. package/dist/ops/tree-builder.d.ts +82 -0
  64. package/dist/ops/tree-builder.d.ts.map +1 -0
  65. package/dist/ops/tree-builder.js +246 -0
  66. package/dist/ops/tree-builder.js.map +1 -0
  67. package/dist/ops/tree-diff.d.ts +243 -0
  68. package/dist/ops/tree-diff.d.ts.map +1 -0
  69. package/dist/ops/tree-diff.js +657 -0
  70. package/dist/ops/tree-diff.js.map +1 -0
  71. package/dist/pack/delta.d.ts +68 -0
  72. package/dist/pack/delta.d.ts.map +1 -0
  73. package/dist/pack/delta.js +343 -0
  74. package/dist/pack/delta.js.map +1 -0
  75. package/dist/pack/format.d.ts +84 -0
  76. package/dist/pack/format.d.ts.map +1 -0
  77. package/dist/pack/format.js +261 -0
  78. package/dist/pack/format.js.map +1 -0
  79. package/dist/pack/full-generation.d.ts +327 -0
  80. package/dist/pack/full-generation.d.ts.map +1 -0
  81. package/dist/pack/full-generation.js +1159 -0
  82. package/dist/pack/full-generation.js.map +1 -0
  83. package/dist/pack/generation.d.ts +118 -0
  84. package/dist/pack/generation.d.ts.map +1 -0
  85. package/dist/pack/generation.js +459 -0
  86. package/dist/pack/generation.js.map +1 -0
  87. package/dist/pack/index.d.ts +181 -0
  88. package/dist/pack/index.d.ts.map +1 -0
  89. package/dist/pack/index.js +552 -0
  90. package/dist/pack/index.js.map +1 -0
  91. package/dist/refs/branch.d.ts +224 -0
  92. package/dist/refs/branch.d.ts.map +1 -0
  93. package/dist/refs/branch.js +170 -0
  94. package/dist/refs/branch.js.map +1 -0
  95. package/dist/refs/storage.d.ts +208 -0
  96. package/dist/refs/storage.d.ts.map +1 -0
  97. package/dist/refs/storage.js +421 -0
  98. package/dist/refs/storage.js.map +1 -0
  99. package/dist/refs/tag.d.ts +230 -0
  100. package/dist/refs/tag.d.ts.map +1 -0
  101. package/dist/refs/tag.js +188 -0
  102. package/dist/refs/tag.js.map +1 -0
  103. package/dist/storage/lru-cache.d.ts +188 -0
  104. package/dist/storage/lru-cache.d.ts.map +1 -0
  105. package/dist/storage/lru-cache.js +410 -0
  106. package/dist/storage/lru-cache.js.map +1 -0
  107. package/dist/storage/object-index.d.ts +140 -0
  108. package/dist/storage/object-index.d.ts.map +1 -0
  109. package/dist/storage/object-index.js +166 -0
  110. package/dist/storage/object-index.js.map +1 -0
  111. package/dist/storage/r2-pack.d.ts +394 -0
  112. package/dist/storage/r2-pack.d.ts.map +1 -0
  113. package/dist/storage/r2-pack.js +1062 -0
  114. package/dist/storage/r2-pack.js.map +1 -0
  115. package/dist/tiered/cdc-pipeline.d.ts +316 -0
  116. package/dist/tiered/cdc-pipeline.d.ts.map +1 -0
  117. package/dist/tiered/cdc-pipeline.js +771 -0
  118. package/dist/tiered/cdc-pipeline.js.map +1 -0
  119. package/dist/tiered/migration.d.ts +242 -0
  120. package/dist/tiered/migration.d.ts.map +1 -0
  121. package/dist/tiered/migration.js +592 -0
  122. package/dist/tiered/migration.js.map +1 -0
  123. package/dist/tiered/parquet-writer.d.ts +248 -0
  124. package/dist/tiered/parquet-writer.d.ts.map +1 -0
  125. package/dist/tiered/parquet-writer.js +555 -0
  126. package/dist/tiered/parquet-writer.js.map +1 -0
  127. package/dist/tiered/read-path.d.ts +141 -0
  128. package/dist/tiered/read-path.d.ts.map +1 -0
  129. package/dist/tiered/read-path.js +204 -0
  130. package/dist/tiered/read-path.js.map +1 -0
  131. package/dist/types/objects.d.ts +53 -0
  132. package/dist/types/objects.d.ts.map +1 -0
  133. package/dist/types/objects.js +291 -0
  134. package/dist/types/objects.js.map +1 -0
  135. package/dist/types/storage.d.ts +117 -0
  136. package/dist/types/storage.d.ts.map +1 -0
  137. package/dist/types/storage.js +8 -0
  138. package/dist/types/storage.js.map +1 -0
  139. package/dist/utils/hash.d.ts +31 -0
  140. package/dist/utils/hash.d.ts.map +1 -0
  141. package/dist/utils/hash.js +60 -0
  142. package/dist/utils/hash.js.map +1 -0
  143. package/dist/utils/sha1.d.ts +26 -0
  144. package/dist/utils/sha1.d.ts.map +1 -0
  145. package/dist/utils/sha1.js +127 -0
  146. package/dist/utils/sha1.js.map +1 -0
  147. package/dist/wire/capabilities.d.ts +236 -0
  148. package/dist/wire/capabilities.d.ts.map +1 -0
  149. package/dist/wire/capabilities.js +437 -0
  150. package/dist/wire/capabilities.js.map +1 -0
  151. package/dist/wire/pkt-line.d.ts +67 -0
  152. package/dist/wire/pkt-line.d.ts.map +1 -0
  153. package/dist/wire/pkt-line.js +145 -0
  154. package/dist/wire/pkt-line.js.map +1 -0
  155. package/dist/wire/receive-pack.d.ts +302 -0
  156. package/dist/wire/receive-pack.d.ts.map +1 -0
  157. package/dist/wire/receive-pack.js +885 -0
  158. package/dist/wire/receive-pack.js.map +1 -0
  159. package/dist/wire/smart-http.d.ts +321 -0
  160. package/dist/wire/smart-http.d.ts.map +1 -0
  161. package/dist/wire/smart-http.js +654 -0
  162. package/dist/wire/smart-http.js.map +1 -0
  163. package/dist/wire/upload-pack.d.ts +333 -0
  164. package/dist/wire/upload-pack.d.ts.map +1 -0
  165. package/dist/wire/upload-pack.js +850 -0
  166. package/dist/wire/upload-pack.js.map +1 -0
  167. 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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"}