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
package/dist/ops/tag.js
ADDED
|
@@ -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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"}
|