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,608 @@
1
+ /**
2
+ * Git Tag Operations
3
+ *
4
+ * Implements lightweight and annotated tag operations with
5
+ * support for GPG signatures, pattern filtering, and version sorting.
6
+ */
7
+ // ============================================================================
8
+ // Constants
9
+ // ============================================================================
10
+ const encoder = new TextEncoder();
11
+ const decoder = new TextDecoder();
12
+ const TAG_REF_PREFIX = 'refs/tags/';
13
+ const MAX_TAG_RECURSION_DEPTH = 50;
14
+ // ============================================================================
15
+ // Validation
16
+ // ============================================================================
17
+ /**
18
+ * Validate a tag name according to Git ref naming rules
19
+ */
20
+ function validateTagName(name) {
21
+ if (!name || name.length === 0) {
22
+ throw new Error('Tag name cannot be empty');
23
+ }
24
+ // Git ref naming rules
25
+ if (name.startsWith('-')) {
26
+ throw new Error('Tag name cannot start with a dash');
27
+ }
28
+ if (name.endsWith('.lock')) {
29
+ throw new Error('Tag name cannot end with .lock');
30
+ }
31
+ if (name.includes('..')) {
32
+ throw new Error('Tag name cannot contain consecutive dots');
33
+ }
34
+ if (/\s/.test(name)) {
35
+ throw new Error('Tag name cannot contain spaces');
36
+ }
37
+ // Control characters (ASCII 0-31 and 127)
38
+ if (/[\x00-\x1f\x7f]/.test(name)) {
39
+ throw new Error('Tag name cannot contain control characters');
40
+ }
41
+ // Special Git characters that are not allowed
42
+ if (/[~^:?*\[\]\\]/.test(name)) {
43
+ throw new Error('Tag name cannot contain special characters (~^:?*[]\\)');
44
+ }
45
+ }
46
+ /**
47
+ * Validate a SHA format
48
+ */
49
+ function validateSha(sha) {
50
+ if (!/^[0-9a-f]{40}$/i.test(sha) && !/^mock\d+$/.test(sha)) {
51
+ throw new Error('Invalid SHA format');
52
+ }
53
+ }
54
+ /**
55
+ * Validate tagger information
56
+ */
57
+ function validateTagger(tagger) {
58
+ if (tagger.name.includes('\n') || tagger.name.includes('\r')) {
59
+ throw new Error('Tagger name cannot contain newlines');
60
+ }
61
+ if (/<|>/.test(tagger.name)) {
62
+ throw new Error('Tagger name cannot contain angle brackets');
63
+ }
64
+ if (!tagger.email.includes('@') || !tagger.email.includes('.')) {
65
+ throw new Error('Invalid email format');
66
+ }
67
+ if (tagger.timestamp !== undefined && tagger.timestamp < 0) {
68
+ throw new Error('Timestamp cannot be negative');
69
+ }
70
+ }
71
+ /**
72
+ * Validate a message
73
+ */
74
+ function validateMessage(message) {
75
+ if (!message || message.trim().length === 0) {
76
+ throw new Error('Message cannot be empty');
77
+ }
78
+ if (message.includes('\x00')) {
79
+ throw new Error('Message cannot contain null bytes');
80
+ }
81
+ }
82
+ // ============================================================================
83
+ // Helper Functions
84
+ // ============================================================================
85
+ /**
86
+ * Get the local timezone offset in +HHMM format
87
+ */
88
+ function getLocalTimezoneOffset() {
89
+ const offset = new Date().getTimezoneOffset();
90
+ const sign = offset <= 0 ? '+' : '-';
91
+ const absOffset = Math.abs(offset);
92
+ const hours = String(Math.floor(absOffset / 60)).padStart(2, '0');
93
+ const minutes = String(absOffset % 60).padStart(2, '0');
94
+ return `${sign}${hours}${minutes}`;
95
+ }
96
+ /**
97
+ * Complete tagger info with defaults
98
+ */
99
+ function completeTagger(tagger) {
100
+ return {
101
+ name: tagger.name,
102
+ email: tagger.email,
103
+ timestamp: tagger.timestamp ?? Math.floor(Date.now() / 1000),
104
+ timezone: tagger.timezone ?? getLocalTimezoneOffset()
105
+ };
106
+ }
107
+ /**
108
+ * Format an author line
109
+ */
110
+ function formatAuthorLine(prefix, author) {
111
+ return `${prefix} ${author.name} <${author.email}> ${author.timestamp} ${author.timezone}`;
112
+ }
113
+ /**
114
+ * Serialize a tag object to bytes (without header)
115
+ */
116
+ function serializeTagContent(object, objectType, tag, tagger, message, signature) {
117
+ const lines = [];
118
+ lines.push(`object ${object}`);
119
+ lines.push(`type ${objectType}`);
120
+ lines.push(`tag ${tag}`);
121
+ lines.push(formatAuthorLine('tagger', tagger));
122
+ lines.push('');
123
+ lines.push(message);
124
+ if (signature) {
125
+ lines.push(signature);
126
+ }
127
+ return encoder.encode(lines.join('\n'));
128
+ }
129
+ /**
130
+ * Compare version strings for sorting
131
+ */
132
+ function compareVersions(a, b) {
133
+ // Extract version parts from strings like "v1.2.3" or "1.2.3"
134
+ const aParts = a.replace(/^v/, '').split('.').map(p => {
135
+ const num = parseInt(p, 10);
136
+ return isNaN(num) ? 0 : num;
137
+ });
138
+ const bParts = b.replace(/^v/, '').split('.').map(p => {
139
+ const num = parseInt(p, 10);
140
+ return isNaN(num) ? 0 : num;
141
+ });
142
+ const maxLen = Math.max(aParts.length, bParts.length);
143
+ for (let i = 0; i < maxLen; i++) {
144
+ const aVal = aParts[i] ?? 0;
145
+ const bVal = bParts[i] ?? 0;
146
+ if (aVal < bVal)
147
+ return -1;
148
+ if (aVal > bVal)
149
+ return 1;
150
+ }
151
+ return 0;
152
+ }
153
+ /**
154
+ * Match a pattern against a tag name (simple glob matching)
155
+ */
156
+ function matchPattern(name, pattern) {
157
+ // Convert glob pattern to regex
158
+ const regexPattern = pattern
159
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape regex special chars except * and ?
160
+ .replace(/\*/g, '.*')
161
+ .replace(/\?/g, '.');
162
+ const regex = new RegExp(`^${regexPattern}$`);
163
+ return regex.test(name);
164
+ }
165
+ // ============================================================================
166
+ // Main Functions
167
+ // ============================================================================
168
+ /**
169
+ * Create a lightweight tag
170
+ */
171
+ export async function createLightweightTag(store, options) {
172
+ const { name, target, verify = false, force = false } = options;
173
+ validateTagName(name);
174
+ validateSha(target);
175
+ // Check if target exists when verify is true
176
+ if (verify) {
177
+ const exists = await store.hasObject(target);
178
+ if (!exists) {
179
+ throw new Error('Target object does not exist');
180
+ }
181
+ }
182
+ const refName = TAG_REF_PREFIX + name;
183
+ // Check if tag already exists
184
+ const existingRef = await store.getRef(refName);
185
+ if (existingRef && !force) {
186
+ throw new Error(`Tag '${name}' already exists`);
187
+ }
188
+ // Create the ref
189
+ await store.setRef(refName, target);
190
+ return {
191
+ name,
192
+ target,
193
+ isAnnotated: false
194
+ };
195
+ }
196
+ /**
197
+ * Create an annotated tag
198
+ */
199
+ export async function createAnnotatedTag(store, options) {
200
+ const { name, target, message, tagger, targetType = 'commit', verify = false, force = false, signing } = options;
201
+ validateTagName(name);
202
+ validateSha(target);
203
+ validateMessage(message);
204
+ validateTagger(tagger);
205
+ // Check if target exists when verify is true
206
+ if (verify) {
207
+ const exists = await store.hasObject(target);
208
+ if (!exists) {
209
+ throw new Error('Target object does not exist');
210
+ }
211
+ }
212
+ const refName = TAG_REF_PREFIX + name;
213
+ // Check if tag already exists
214
+ const existingRef = await store.getRef(refName);
215
+ if (existingRef && !force) {
216
+ throw new Error(`Tag '${name}' already exists`);
217
+ }
218
+ // Complete tagger info with defaults
219
+ const completedTagger = completeTagger(tagger);
220
+ // Create tag content
221
+ let signature;
222
+ let isSigned = false;
223
+ if (signing?.sign && signing.signer) {
224
+ const contentToSign = serializeTagContent(target, targetType, name, completedTagger, message);
225
+ signature = await signing.signer(contentToSign, signing.keyId);
226
+ isSigned = true;
227
+ }
228
+ const tagContent = serializeTagContent(target, targetType, name, completedTagger, message, signature);
229
+ // Store the tag object
230
+ const tagSha = await store.storeObject('tag', tagContent);
231
+ // Create the ref pointing to the tag object
232
+ await store.setRef(refName, tagSha);
233
+ return {
234
+ name,
235
+ target,
236
+ isAnnotated: true,
237
+ tagSha,
238
+ signed: isSigned
239
+ };
240
+ }
241
+ /**
242
+ * Build a tag object without storing it
243
+ */
244
+ export function buildTagObject(options) {
245
+ const { name, target, message, tagger, targetType = 'commit' } = options;
246
+ const completedTagger = completeTagger(tagger);
247
+ const tagContent = serializeTagContent(target, targetType, name, completedTagger, message);
248
+ return {
249
+ type: 'tag',
250
+ data: tagContent,
251
+ object: target,
252
+ objectType: targetType,
253
+ tag: name,
254
+ tagger: completedTagger,
255
+ message,
256
+ name
257
+ };
258
+ }
259
+ /**
260
+ * Delete a tag
261
+ */
262
+ export async function deleteTag(store, name, options = {}) {
263
+ const { force = false } = options;
264
+ const refName = TAG_REF_PREFIX + name;
265
+ // Get the current ref value
266
+ const sha = await store.getRef(refName);
267
+ if (!sha) {
268
+ if (force) {
269
+ return { deleted: false, name };
270
+ }
271
+ throw new Error(`Tag '${name}' not found`);
272
+ }
273
+ // Delete the ref
274
+ await store.deleteRef(refName);
275
+ return {
276
+ deleted: true,
277
+ name,
278
+ sha
279
+ };
280
+ }
281
+ /**
282
+ * List tags
283
+ */
284
+ export async function listTags(store, options = {}) {
285
+ const { pattern, sortByVersion = false, pointsAt, limit } = options;
286
+ // Get all tag refs
287
+ const refs = await store.listRefs(TAG_REF_PREFIX);
288
+ // Build tag entries
289
+ const entries = [];
290
+ for (const ref of refs) {
291
+ const name = ref.name.slice(TAG_REF_PREFIX.length);
292
+ const sha = ref.sha;
293
+ // Check if it's an annotated tag by looking up the object
294
+ const obj = await store.getObject(sha);
295
+ const isAnnotated = obj?.type === 'tag';
296
+ // Get target for annotated tags
297
+ let target = sha;
298
+ if (isAnnotated && obj) {
299
+ const parsed = parseTagObject(obj.data);
300
+ target = parsed.object;
301
+ }
302
+ // Apply pattern filter
303
+ if (pattern && !matchPattern(name, pattern)) {
304
+ continue;
305
+ }
306
+ // Apply pointsAt filter
307
+ if (pointsAt && target !== pointsAt) {
308
+ continue;
309
+ }
310
+ entries.push({
311
+ name,
312
+ sha,
313
+ isAnnotated,
314
+ target
315
+ });
316
+ }
317
+ // Sort entries
318
+ if (sortByVersion) {
319
+ entries.sort((a, b) => compareVersions(a.name, b.name));
320
+ }
321
+ else {
322
+ entries.sort((a, b) => a.name.localeCompare(b.name));
323
+ }
324
+ // Apply limit
325
+ if (limit && limit > 0) {
326
+ return entries.slice(0, limit);
327
+ }
328
+ return entries;
329
+ }
330
+ /**
331
+ * Get a tag by name
332
+ */
333
+ export async function getTag(store, name) {
334
+ const refName = TAG_REF_PREFIX + name;
335
+ const sha = await store.getRef(refName);
336
+ if (!sha) {
337
+ return null;
338
+ }
339
+ const obj = await store.getObject(sha);
340
+ if (!obj) {
341
+ return null;
342
+ }
343
+ if (obj.type === 'tag') {
344
+ // Annotated tag
345
+ const parsed = parseTagObject(obj.data);
346
+ return {
347
+ name,
348
+ target: parsed.object,
349
+ isAnnotated: true,
350
+ sha,
351
+ objectType: parsed.objectType,
352
+ tagger: parsed.tagger,
353
+ message: parsed.message,
354
+ signature: parsed.signature
355
+ };
356
+ }
357
+ else {
358
+ // Lightweight tag
359
+ return {
360
+ name,
361
+ target: sha,
362
+ isAnnotated: false
363
+ };
364
+ }
365
+ }
366
+ /**
367
+ * Verify a tag's signature
368
+ */
369
+ export async function verifyTag(store, name, options = {}) {
370
+ const { verifier } = options;
371
+ const tag = await getTag(store, name);
372
+ if (!tag) {
373
+ throw new Error(`Tag '${name}' not found`);
374
+ }
375
+ if (!tag.isAnnotated) {
376
+ return { valid: false, signed: false };
377
+ }
378
+ if (!tag.signature) {
379
+ return { valid: false, signed: false };
380
+ }
381
+ if (!verifier) {
382
+ return { valid: false, signed: true };
383
+ }
384
+ try {
385
+ // Get the tag object
386
+ const refName = TAG_REF_PREFIX + name;
387
+ const sha = await store.getRef(refName);
388
+ if (!sha) {
389
+ throw new Error(`Tag '${name}' not found`);
390
+ }
391
+ const obj = await store.getObject(sha);
392
+ if (!obj) {
393
+ throw new Error(`Tag object not found`);
394
+ }
395
+ // Extract the content without signature for verification
396
+ const content = obj.data;
397
+ const contentStr = decoder.decode(content);
398
+ const sigStart = contentStr.indexOf('-----BEGIN PGP SIGNATURE-----');
399
+ const dataToVerify = sigStart > 0
400
+ ? encoder.encode(contentStr.slice(0, sigStart))
401
+ : content;
402
+ const result = await verifier(dataToVerify, tag.signature);
403
+ return {
404
+ valid: result.valid,
405
+ signed: true,
406
+ keyId: result.keyId,
407
+ signer: result.signer,
408
+ error: result.error
409
+ };
410
+ }
411
+ catch (error) {
412
+ return {
413
+ valid: false,
414
+ signed: true,
415
+ error: error instanceof Error ? error.message : 'Verification failed'
416
+ };
417
+ }
418
+ }
419
+ /**
420
+ * Parse a tag object from raw data
421
+ */
422
+ export function parseTagObject(data) {
423
+ const content = decoder.decode(data);
424
+ const lines = content.split('\n');
425
+ let object = '';
426
+ let objectType = 'commit';
427
+ let tag = '';
428
+ let tagger;
429
+ let messageStartIndex = 0;
430
+ for (let i = 0; i < lines.length; i++) {
431
+ const line = lines[i];
432
+ if (line === '') {
433
+ messageStartIndex = i + 1;
434
+ break;
435
+ }
436
+ if (line.startsWith('object ')) {
437
+ object = line.slice(7);
438
+ }
439
+ else if (line.startsWith('type ')) {
440
+ objectType = line.slice(5);
441
+ }
442
+ else if (line.startsWith('tag ')) {
443
+ tag = line.slice(4);
444
+ }
445
+ else if (line.startsWith('tagger ')) {
446
+ const match = line.match(/^tagger (.+) <(.+)> (\d+) ([+-]\d{4})$/);
447
+ if (match) {
448
+ tagger = {
449
+ name: match[1],
450
+ email: match[2],
451
+ timestamp: parseInt(match[3], 10),
452
+ timezone: match[4]
453
+ };
454
+ }
455
+ }
456
+ }
457
+ if (!object) {
458
+ throw new Error('Invalid tag: missing object field');
459
+ }
460
+ // Get message and signature
461
+ const messageContent = lines.slice(messageStartIndex).join('\n');
462
+ const sigStart = messageContent.indexOf('-----BEGIN PGP SIGNATURE-----');
463
+ let message;
464
+ let signature;
465
+ if (sigStart >= 0) {
466
+ message = messageContent.slice(0, sigStart).trimEnd();
467
+ signature = messageContent.slice(sigStart);
468
+ }
469
+ else {
470
+ message = messageContent;
471
+ }
472
+ return {
473
+ object,
474
+ objectType,
475
+ tag,
476
+ tagger,
477
+ message,
478
+ signature
479
+ };
480
+ }
481
+ /**
482
+ * Format a tag message with cleanup options
483
+ */
484
+ export function formatTagMessage(message, options = {}) {
485
+ const { cleanup = true, commentChar } = options;
486
+ if (!cleanup) {
487
+ return message;
488
+ }
489
+ let result = message.trim();
490
+ // Strip comment lines if commentChar is provided
491
+ if (commentChar) {
492
+ result = result
493
+ .split('\n')
494
+ .filter(line => !line.startsWith(commentChar))
495
+ .join('\n');
496
+ }
497
+ // Collapse multiple blank lines to a single blank line
498
+ result = result.replace(/\n{3,}/g, '\n\n');
499
+ return result;
500
+ }
501
+ /**
502
+ * Check if a tag is an annotated tag
503
+ */
504
+ export async function isAnnotatedTag(store, name) {
505
+ const tag = await getTag(store, name);
506
+ if (!tag) {
507
+ throw new Error(`Tag '${name}' not found`);
508
+ }
509
+ return tag.isAnnotated;
510
+ }
511
+ /**
512
+ * Get the target SHA for a tag
513
+ */
514
+ export async function getTagTarget(store, name) {
515
+ const tag = await getTag(store, name);
516
+ if (!tag) {
517
+ throw new Error(`Tag '${name}' not found`);
518
+ }
519
+ return tag.target;
520
+ }
521
+ /**
522
+ * Get the tagger info for a tag
523
+ */
524
+ export async function getTagTagger(store, name) {
525
+ const tag = await getTag(store, name);
526
+ if (!tag) {
527
+ throw new Error(`Tag '${name}' not found`);
528
+ }
529
+ return tag.tagger ?? null;
530
+ }
531
+ /**
532
+ * Resolve a tag to its final commit SHA
533
+ * Follows nested tags until reaching a commit
534
+ */
535
+ export async function resolveTagToCommit(store, name, depth = 0) {
536
+ if (depth >= MAX_TAG_RECURSION_DEPTH) {
537
+ throw new Error('Maximum tag recursion depth exceeded');
538
+ }
539
+ const tag = await getTag(store, name);
540
+ if (!tag) {
541
+ throw new Error(`Tag '${name}' not found`);
542
+ }
543
+ // For lightweight tags pointing directly to a commit
544
+ if (!tag.isAnnotated) {
545
+ const obj = await store.getObject(tag.target);
546
+ if (!obj || obj.type !== 'commit') {
547
+ throw new Error(`Tag '${name}' does not point to a commit`);
548
+ }
549
+ return tag.target;
550
+ }
551
+ // For annotated tags, check what type of object they point to
552
+ if (tag.objectType === 'commit') {
553
+ return tag.target;
554
+ }
555
+ if (tag.objectType === 'tag') {
556
+ // Nested tag - we need to resolve it
557
+ // Get the nested tag object and parse it
558
+ const nestedObj = await store.getObject(tag.target);
559
+ if (!nestedObj || nestedObj.type !== 'tag') {
560
+ throw new Error(`Nested tag object not found`);
561
+ }
562
+ const nestedParsed = parseTagObject(nestedObj.data);
563
+ // Create a temporary tag info to continue resolution
564
+ if (nestedParsed.objectType === 'commit') {
565
+ return nestedParsed.object;
566
+ }
567
+ if (nestedParsed.objectType === 'tag') {
568
+ // Continue recursion - find the nested tag name if it exists
569
+ // Since we have the SHA, we need to follow it
570
+ const innerObj = await store.getObject(nestedParsed.object);
571
+ if (!innerObj) {
572
+ throw new Error('Cannot resolve nested tag chain');
573
+ }
574
+ if (innerObj.type === 'commit') {
575
+ return nestedParsed.object;
576
+ }
577
+ if (innerObj.type === 'tag') {
578
+ // Parse and continue
579
+ const innerParsed = parseTagObject(innerObj.data);
580
+ return resolveNestedTag(store, innerParsed, depth + 1);
581
+ }
582
+ throw new Error(`Tag chain does not resolve to a commit`);
583
+ }
584
+ throw new Error(`Tag '${name}' does not resolve to a commit`);
585
+ }
586
+ throw new Error(`Tag '${name}' does not point to a commit (points to ${tag.objectType})`);
587
+ }
588
+ /**
589
+ * Helper to resolve a nested tag structure
590
+ */
591
+ async function resolveNestedTag(store, parsed, depth) {
592
+ if (depth >= MAX_TAG_RECURSION_DEPTH) {
593
+ throw new Error('Maximum tag recursion depth exceeded');
594
+ }
595
+ if (parsed.objectType === 'commit') {
596
+ return parsed.object;
597
+ }
598
+ if (parsed.objectType === 'tag') {
599
+ const obj = await store.getObject(parsed.object);
600
+ if (!obj || obj.type !== 'tag') {
601
+ throw new Error('Cannot resolve nested tag chain');
602
+ }
603
+ const innerParsed = parseTagObject(obj.data);
604
+ return resolveNestedTag(store, innerParsed, depth + 1);
605
+ }
606
+ throw new Error(`Tag does not resolve to a commit (points to ${parsed.objectType})`);
607
+ }
608
+ //# sourceMappingURL=tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/ops/tag.ts"],"names":[],"mappings":"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"}