faf-mcp 4.1.0 → 4.1.2
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/CHANGELOG.md +18 -1
- package/CLAUDE.md +2 -2
- package/README.md +13 -3
- package/dist/src/handlers/fileHandler.d.ts +6 -0
- package/dist/src/handlers/fileHandler.js +119 -11
- package/dist/src/handlers/fileHandler.js.map +1 -1
- package/dist/src/handlers/tools.js +59 -4
- package/dist/src/handlers/tools.js.map +1 -1
- package/dist/src/instructions.js +1 -1
- package/dist/src/instructions.js.map +1 -1
- package/dist/src/utils/git-history.d.ts +38 -0
- package/dist/src/utils/git-history.js +628 -0
- package/dist/src/utils/git-history.js.map +1 -0
- package/dist/src/utils/safe-path.d.ts +21 -0
- package/dist/src/utils/safe-path.js +99 -0
- package/dist/src/utils/safe-path.js.map +1 -1
- package/package.json +1 -1
- package/project.faf +2 -2
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* git-history.ts — in-process, read-only answer to one question:
|
|
4
|
+
* "has git ever recorded <file> in this repository?"
|
|
5
|
+
*
|
|
6
|
+
* faf_dna uses it to refuse reissuing a `.faf-dna` birth certificate that git
|
|
7
|
+
* shows already existed. The server never spawns a process (see the
|
|
8
|
+
* engine-adapter BRAKE test), so this reads `.git` directly with zlib:
|
|
9
|
+
*
|
|
10
|
+
* 1. the index (staged entries, so a file deleted only in the working tree
|
|
11
|
+
* is found without walking history), then
|
|
12
|
+
* 2. every commit reachable from HEAD, refs/, packed-refs and every reflog
|
|
13
|
+
* (logs/HEAD, logs/refs/**), so a commit dropped by `reset --hard` is
|
|
14
|
+
* still checked — loose and packed objects, OFS/REF deltas, and the
|
|
15
|
+
* object stores named in objects/info/alternates (`clone --shared`) —
|
|
16
|
+
* looking the path up in each tree.
|
|
17
|
+
*
|
|
18
|
+
* Read-only, and fail-closed: `never` is returned only when the whole
|
|
19
|
+
* history was read. Any read error, missing object, unreadable or malformed
|
|
20
|
+
* pack/index/ref/reflog, an alternate object store that cannot be read, a shallow clone, a SHA-256 repository, or a walk past the
|
|
21
|
+
* budget returns `unknown` (never throws). The caller decides what `unknown`
|
|
22
|
+
* means; faf_dna refuses to issue a certificate on it.
|
|
23
|
+
*/
|
|
24
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
+
}
|
|
30
|
+
Object.defineProperty(o, k2, desc);
|
|
31
|
+
}) : (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
o[k2] = m[k];
|
|
34
|
+
}));
|
|
35
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
+
}) : function(o, v) {
|
|
38
|
+
o["default"] = v;
|
|
39
|
+
});
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
+
exports.gitEverTracked = gitEverTracked;
|
|
59
|
+
const fs = __importStar(require("fs"));
|
|
60
|
+
const path = __importStar(require("path"));
|
|
61
|
+
const zlib_1 = require("zlib");
|
|
62
|
+
const OBJ_TYPES = { 1: 'commit', 2: 'tree', 3: 'blob', 4: 'tag' };
|
|
63
|
+
/** Thrown for anything that stops the history from being read in full. */
|
|
64
|
+
class HistoryUnreadable extends Error {
|
|
65
|
+
}
|
|
66
|
+
/** ENOENT / ENOTDIR: the path is simply absent. Anything else is a read failure. */
|
|
67
|
+
function isAbsent(err) {
|
|
68
|
+
const code = typeof err === 'object' && err !== null ? err.code : undefined;
|
|
69
|
+
return code === 'ENOENT' || code === 'ENOTDIR';
|
|
70
|
+
}
|
|
71
|
+
/** Read a file that may legitimately be absent (null). Any other error throws. */
|
|
72
|
+
function readOptional(p) {
|
|
73
|
+
try {
|
|
74
|
+
return fs.readFileSync(p);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
if (isAbsent(err))
|
|
78
|
+
return null;
|
|
79
|
+
throw new HistoryUnreadable(`cannot read ${path.basename(p)}: ${err instanceof Error ? err.message : String(err)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function findRepo(start) {
|
|
83
|
+
let dir = path.resolve(start);
|
|
84
|
+
for (;;) {
|
|
85
|
+
const dotGit = path.join(dir, '.git');
|
|
86
|
+
let st = null;
|
|
87
|
+
try {
|
|
88
|
+
st = fs.statSync(dotGit);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
if (!isAbsent(err))
|
|
92
|
+
throw new HistoryUnreadable(`cannot stat .git: ${err.message}`);
|
|
93
|
+
st = null;
|
|
94
|
+
}
|
|
95
|
+
if (st) {
|
|
96
|
+
let gitDir = dotGit;
|
|
97
|
+
if (st.isFile()) {
|
|
98
|
+
const m = fs.readFileSync(dotGit, 'utf-8').match(/^gitdir:\s*(.+)\s*$/m);
|
|
99
|
+
if (!m)
|
|
100
|
+
throw new HistoryUnreadable('.git file has no gitdir line');
|
|
101
|
+
gitDir = path.resolve(dir, m[1].trim());
|
|
102
|
+
}
|
|
103
|
+
const common = readOptional(path.join(gitDir, 'commondir'));
|
|
104
|
+
const commonDir = common ? path.resolve(gitDir, common.toString('utf-8').trim()) : gitDir;
|
|
105
|
+
return { gitDir, commonDir, root: dir };
|
|
106
|
+
}
|
|
107
|
+
const parent = path.dirname(dir);
|
|
108
|
+
if (parent === dir)
|
|
109
|
+
return null;
|
|
110
|
+
dir = parent;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Paths staged in the index (versions 2, 3, 4). */
|
|
114
|
+
function indexHas(gitDir, rel) {
|
|
115
|
+
const buf = readOptional(path.join(gitDir, 'index'));
|
|
116
|
+
if (!buf)
|
|
117
|
+
return false; // no index yet (fresh repo)
|
|
118
|
+
if (buf.length < 12 || buf.toString('latin1', 0, 4) !== 'DIRC')
|
|
119
|
+
throw new HistoryUnreadable('index has a bad signature');
|
|
120
|
+
const version = buf.readUInt32BE(4);
|
|
121
|
+
if (version < 2 || version > 4)
|
|
122
|
+
throw new HistoryUnreadable(`index version ${version} not supported`);
|
|
123
|
+
const count = buf.readUInt32BE(8);
|
|
124
|
+
let off = 12;
|
|
125
|
+
let prev = '';
|
|
126
|
+
for (let i = 0; i < count; i++) {
|
|
127
|
+
const start = off;
|
|
128
|
+
const flags = buf.readUInt16BE(off + 60);
|
|
129
|
+
off += 62;
|
|
130
|
+
if (version >= 3 && (flags & 0x4000))
|
|
131
|
+
off += 2;
|
|
132
|
+
let name;
|
|
133
|
+
if (version >= 4) {
|
|
134
|
+
// varint: bytes to strip from the previous name, then a NUL-terminated suffix
|
|
135
|
+
let strip = buf[off] & 0x7f;
|
|
136
|
+
while (buf[off++] & 0x80)
|
|
137
|
+
strip = ((strip + 1) << 7) | (buf[off] & 0x7f);
|
|
138
|
+
const end = buf.indexOf(0, off);
|
|
139
|
+
if (end < 0 || strip > prev.length)
|
|
140
|
+
throw new HistoryUnreadable('index entry is malformed');
|
|
141
|
+
name = prev.slice(0, prev.length - strip) + buf.toString('utf-8', off, end);
|
|
142
|
+
off = end + 1;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const end = buf.indexOf(0, off);
|
|
146
|
+
if (end < 0)
|
|
147
|
+
throw new HistoryUnreadable('index entry is malformed');
|
|
148
|
+
name = buf.toString('utf-8', off, end);
|
|
149
|
+
off = start + Math.ceil((end - start + 1) / 8) * 8;
|
|
150
|
+
}
|
|
151
|
+
if (name === rel)
|
|
152
|
+
return true;
|
|
153
|
+
prev = name;
|
|
154
|
+
}
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* The object directories to search: `objectsDir` plus the directories listed
|
|
159
|
+
* in its `info/alternates` (written by `git clone --shared` / `--reference`).
|
|
160
|
+
* Relative entries resolve against `objectsDir`. One level is followed. An
|
|
161
|
+
* alternates file or an alternate directory that cannot be read throws.
|
|
162
|
+
*/
|
|
163
|
+
function objectDirs(objectsDir) {
|
|
164
|
+
const dirs = [objectsDir];
|
|
165
|
+
const raw = readOptional(path.join(objectsDir, 'info', 'alternates'));
|
|
166
|
+
if (!raw)
|
|
167
|
+
return dirs;
|
|
168
|
+
for (const line of raw.toString('utf-8').split('\n')) {
|
|
169
|
+
const entry = line.trim();
|
|
170
|
+
if (!entry || entry.startsWith('#'))
|
|
171
|
+
continue;
|
|
172
|
+
if (entry.startsWith('"'))
|
|
173
|
+
throw new HistoryUnreadable('alternates has a quoted path it cannot parse');
|
|
174
|
+
const dir = path.resolve(objectsDir, entry);
|
|
175
|
+
let st;
|
|
176
|
+
try {
|
|
177
|
+
st = fs.statSync(dir);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
throw new HistoryUnreadable(`cannot read alternate object store ${entry}: ${err instanceof Error ? err.message : String(err)}`);
|
|
181
|
+
}
|
|
182
|
+
if (!st.isDirectory())
|
|
183
|
+
throw new HistoryUnreadable(`alternate object store ${entry} is not a directory`);
|
|
184
|
+
try {
|
|
185
|
+
fs.readdirSync(dir);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
throw new HistoryUnreadable(`cannot read alternate object store ${entry}: ${err instanceof Error ? err.message : String(err)}`);
|
|
189
|
+
}
|
|
190
|
+
if (!dirs.includes(dir))
|
|
191
|
+
dirs.push(dir);
|
|
192
|
+
}
|
|
193
|
+
return dirs;
|
|
194
|
+
}
|
|
195
|
+
class ObjectStore {
|
|
196
|
+
packs = null;
|
|
197
|
+
dirs;
|
|
198
|
+
constructor(objectsDir) {
|
|
199
|
+
this.dirs = objectDirs(objectsDir);
|
|
200
|
+
}
|
|
201
|
+
loadPacks() {
|
|
202
|
+
if (this.packs)
|
|
203
|
+
return this.packs;
|
|
204
|
+
const packs = [];
|
|
205
|
+
for (const objectsDir of this.dirs)
|
|
206
|
+
packs.push(...this.loadPacksIn(objectsDir));
|
|
207
|
+
this.packs = packs;
|
|
208
|
+
return packs;
|
|
209
|
+
}
|
|
210
|
+
loadPacksIn(objectsDir) {
|
|
211
|
+
const packs = [];
|
|
212
|
+
const dir = path.join(objectsDir, 'pack');
|
|
213
|
+
let names = [];
|
|
214
|
+
try {
|
|
215
|
+
names = fs.readdirSync(dir);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
if (!isAbsent(err))
|
|
219
|
+
throw new HistoryUnreadable(`cannot list packs: ${err.message}`);
|
|
220
|
+
names = [];
|
|
221
|
+
}
|
|
222
|
+
for (const n of names) {
|
|
223
|
+
if (!n.endsWith('.idx'))
|
|
224
|
+
continue;
|
|
225
|
+
// A pack that cannot be read is history that cannot be checked: fail closed.
|
|
226
|
+
let idx;
|
|
227
|
+
let pack;
|
|
228
|
+
try {
|
|
229
|
+
idx = fs.readFileSync(path.join(dir, n));
|
|
230
|
+
pack = fs.readFileSync(path.join(dir, n.replace(/\.idx$/, '.pack')));
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
throw new HistoryUnreadable(`cannot read pack ${n}: ${err instanceof Error ? err.message : String(err)}`);
|
|
234
|
+
}
|
|
235
|
+
if (idx.length < 8 + 256 * 4 || idx.readUInt32BE(0) !== 0xff744f63 || idx.readUInt32BE(4) !== 2) {
|
|
236
|
+
throw new HistoryUnreadable(`pack index ${n} is not a v2 index`);
|
|
237
|
+
}
|
|
238
|
+
if (pack.length < 12 || pack.toString('latin1', 0, 4) !== 'PACK') {
|
|
239
|
+
throw new HistoryUnreadable(`pack ${n.replace(/\.idx$/, '.pack')} has a bad signature`);
|
|
240
|
+
}
|
|
241
|
+
packs.push({ idx, pack, count: idx.readUInt32BE(8 + 255 * 4) });
|
|
242
|
+
}
|
|
243
|
+
return packs;
|
|
244
|
+
}
|
|
245
|
+
packOffset(p, sha) {
|
|
246
|
+
const first = sha[0];
|
|
247
|
+
let lo = first === 0 ? 0 : p.idx.readUInt32BE(8 + (first - 1) * 4);
|
|
248
|
+
let hi = p.idx.readUInt32BE(8 + first * 4);
|
|
249
|
+
const shaBase = 8 + 256 * 4;
|
|
250
|
+
while (lo < hi) {
|
|
251
|
+
const mid = (lo + hi) >>> 1;
|
|
252
|
+
const c = p.idx.compare(sha, 0, 20, shaBase + mid * 20, shaBase + mid * 20 + 20) * -1;
|
|
253
|
+
if (c === 0) {
|
|
254
|
+
const offBase = shaBase + p.count * 24; // after shas (20) and crcs (4)
|
|
255
|
+
let off = p.idx.readUInt32BE(offBase + mid * 4);
|
|
256
|
+
if (off & 0x80000000) {
|
|
257
|
+
const big = offBase + p.count * 4 + (off & 0x7fffffff) * 8;
|
|
258
|
+
off = Number(p.idx.readBigUInt64BE(big));
|
|
259
|
+
}
|
|
260
|
+
return off;
|
|
261
|
+
}
|
|
262
|
+
if (c < 0)
|
|
263
|
+
hi = mid;
|
|
264
|
+
else
|
|
265
|
+
lo = mid + 1;
|
|
266
|
+
}
|
|
267
|
+
return -1;
|
|
268
|
+
}
|
|
269
|
+
readPacked(p, offset, depth = 0) {
|
|
270
|
+
if (depth > 64)
|
|
271
|
+
throw new Error('delta chain too deep');
|
|
272
|
+
const buf = p.pack;
|
|
273
|
+
let off = offset;
|
|
274
|
+
let c = buf[off++];
|
|
275
|
+
const type = (c >> 4) & 7;
|
|
276
|
+
while (c & 0x80)
|
|
277
|
+
c = buf[off++];
|
|
278
|
+
if (type === 6) {
|
|
279
|
+
c = buf[off++];
|
|
280
|
+
let rel = c & 0x7f;
|
|
281
|
+
while (c & 0x80) {
|
|
282
|
+
c = buf[off++];
|
|
283
|
+
rel = ((rel + 1) * 128) + (c & 0x7f);
|
|
284
|
+
}
|
|
285
|
+
const base = this.readPacked(p, offset - rel, depth + 1);
|
|
286
|
+
return { type: base.type, data: applyDelta(base.data, (0, zlib_1.inflateSync)(buf.subarray(off))) };
|
|
287
|
+
}
|
|
288
|
+
if (type === 7) {
|
|
289
|
+
const baseSha = buf.subarray(off, off + 20);
|
|
290
|
+
const base = this.read(baseSha.toString('hex'), depth + 1);
|
|
291
|
+
if (!base)
|
|
292
|
+
throw new HistoryUnreadable('missing delta base');
|
|
293
|
+
return { type: base.type, data: applyDelta(base.data, (0, zlib_1.inflateSync)(buf.subarray(off + 20))) };
|
|
294
|
+
}
|
|
295
|
+
const t = OBJ_TYPES[type];
|
|
296
|
+
if (!t)
|
|
297
|
+
throw new Error(`bad pack object type ${type}`);
|
|
298
|
+
return { type: t, data: (0, zlib_1.inflateSync)(buf.subarray(off)) };
|
|
299
|
+
}
|
|
300
|
+
/** The object, or null when it is in neither loose storage nor any pack. Read errors throw. */
|
|
301
|
+
read(hex, depth = 0) {
|
|
302
|
+
for (const dir of this.dirs) {
|
|
303
|
+
const loose = readOptional(path.join(dir, hex.slice(0, 2), hex.slice(2)));
|
|
304
|
+
if (!loose)
|
|
305
|
+
continue;
|
|
306
|
+
const raw = (0, zlib_1.inflateSync)(loose);
|
|
307
|
+
const sp = raw.indexOf(0x20);
|
|
308
|
+
const nul = raw.indexOf(0);
|
|
309
|
+
if (sp < 0 || nul < sp)
|
|
310
|
+
throw new HistoryUnreadable(`loose object ${hex.slice(0, 7)} is malformed`);
|
|
311
|
+
return { type: raw.toString('latin1', 0, sp), data: raw.subarray(nul + 1) };
|
|
312
|
+
}
|
|
313
|
+
const sha = Buffer.from(hex, 'hex');
|
|
314
|
+
for (const p of this.loadPacks()) {
|
|
315
|
+
const off = this.packOffset(p, sha);
|
|
316
|
+
if (off >= 0)
|
|
317
|
+
return this.readPacked(p, off, depth);
|
|
318
|
+
}
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
/** Like read(), but a missing object is an error: history cannot be checked. */
|
|
322
|
+
need(hex) {
|
|
323
|
+
const obj = this.read(hex);
|
|
324
|
+
if (!obj)
|
|
325
|
+
throw new HistoryUnreadable(`object ${hex.slice(0, 7)} is missing`);
|
|
326
|
+
return obj;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
function applyDelta(base, delta) {
|
|
330
|
+
let off = 0;
|
|
331
|
+
const varint = () => {
|
|
332
|
+
let r = 0, s = 0, c;
|
|
333
|
+
do {
|
|
334
|
+
c = delta[off++];
|
|
335
|
+
r += (c & 0x7f) * 2 ** s;
|
|
336
|
+
s += 7;
|
|
337
|
+
} while (c & 0x80);
|
|
338
|
+
return r;
|
|
339
|
+
};
|
|
340
|
+
varint(); // source size
|
|
341
|
+
const out = Buffer.alloc(varint());
|
|
342
|
+
let w = 0;
|
|
343
|
+
while (off < delta.length) {
|
|
344
|
+
const op = delta[off++];
|
|
345
|
+
if (op & 0x80) {
|
|
346
|
+
let cpOff = 0, cpLen = 0;
|
|
347
|
+
for (let i = 0; i < 4; i++)
|
|
348
|
+
if (op & (1 << i))
|
|
349
|
+
cpOff |= delta[off++] << (8 * i);
|
|
350
|
+
for (let i = 0; i < 3; i++)
|
|
351
|
+
if (op & (0x10 << i))
|
|
352
|
+
cpLen |= delta[off++] << (8 * i);
|
|
353
|
+
if (cpLen === 0)
|
|
354
|
+
cpLen = 0x10000;
|
|
355
|
+
base.copy(out, w, cpOff >>> 0, (cpOff >>> 0) + cpLen);
|
|
356
|
+
w += cpLen;
|
|
357
|
+
}
|
|
358
|
+
else if (op) {
|
|
359
|
+
delta.copy(out, w, off, off + op);
|
|
360
|
+
w += op;
|
|
361
|
+
off += op;
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
throw new Error('bad delta opcode');
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return out;
|
|
368
|
+
}
|
|
369
|
+
function treeEntry(tree, name) {
|
|
370
|
+
let off = 0;
|
|
371
|
+
while (off < tree.length) {
|
|
372
|
+
const sp = tree.indexOf(0x20, off);
|
|
373
|
+
const nul = sp < 0 ? -1 : tree.indexOf(0, sp);
|
|
374
|
+
if (sp < 0 || nul < 0 || nul + 21 > tree.length)
|
|
375
|
+
throw new HistoryUnreadable('tree object is malformed');
|
|
376
|
+
if (tree.toString('utf-8', sp + 1, nul) === name) {
|
|
377
|
+
// 160000 = gitlink (submodule): its commit lives in another repository.
|
|
378
|
+
if (tree.toString('latin1', off, sp) === '160000')
|
|
379
|
+
return null;
|
|
380
|
+
return tree.toString('hex', nul + 1, nul + 21);
|
|
381
|
+
}
|
|
382
|
+
off = nul + 21;
|
|
383
|
+
}
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* The admin dirs of linked worktrees: <commonDir>/worktrees/<id>/. Each holds
|
|
388
|
+
* that worktree's own HEAD and logs/HEAD, which git counts as reachable (gc
|
|
389
|
+
* keeps them, `git log --all --reflog` walks them). No worktrees dir is fine;
|
|
390
|
+
* one that exists but cannot be listed throws.
|
|
391
|
+
*/
|
|
392
|
+
function linkedWorktreeDirs(commonDir) {
|
|
393
|
+
const dir = path.join(commonDir, 'worktrees');
|
|
394
|
+
let entries = [];
|
|
395
|
+
try {
|
|
396
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
397
|
+
}
|
|
398
|
+
catch (err) {
|
|
399
|
+
if (isAbsent(err))
|
|
400
|
+
return [];
|
|
401
|
+
throw new HistoryUnreadable(`cannot list worktrees: ${err.message}`);
|
|
402
|
+
}
|
|
403
|
+
return entries.filter((e) => e.isDirectory()).map((e) => path.join(dir, e.name));
|
|
404
|
+
}
|
|
405
|
+
function refTips(commonDir, gitDir) {
|
|
406
|
+
const tips = new Set();
|
|
407
|
+
const packed = new Map();
|
|
408
|
+
const packedRaw = readOptional(path.join(commonDir, 'packed-refs'));
|
|
409
|
+
if (packedRaw) {
|
|
410
|
+
for (const line of packedRaw.toString('utf-8').split('\n')) {
|
|
411
|
+
if (!line || line.startsWith('#'))
|
|
412
|
+
continue;
|
|
413
|
+
const m = line.match(/^([0-9a-f]{40}) (\S+)$/);
|
|
414
|
+
const peeled = line.match(/^\^([0-9a-f]{40})$/);
|
|
415
|
+
if (m) {
|
|
416
|
+
packed.set(m[2], m[1]);
|
|
417
|
+
tips.add(m[1]);
|
|
418
|
+
}
|
|
419
|
+
else if (peeled)
|
|
420
|
+
tips.add(peeled[1]);
|
|
421
|
+
else
|
|
422
|
+
throw new HistoryUnreadable('packed-refs has a line it cannot parse');
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// A ref that names a branch which does not exist yet (unborn HEAD) is null.
|
|
426
|
+
const readRef = (dir, name, depth = 0) => {
|
|
427
|
+
if (depth > 8)
|
|
428
|
+
throw new HistoryUnreadable('symbolic ref loop');
|
|
429
|
+
const raw = readOptional(path.join(dir, name));
|
|
430
|
+
if (!raw)
|
|
431
|
+
return packed.get(name) ?? null;
|
|
432
|
+
const v = raw.toString('utf-8').trim();
|
|
433
|
+
if (/^[0-9a-f]{40}$/.test(v))
|
|
434
|
+
return v;
|
|
435
|
+
const m = v.match(/^ref:\s*(.+)$/);
|
|
436
|
+
if (m)
|
|
437
|
+
return readRef(commonDir, m[1].trim(), depth + 1);
|
|
438
|
+
throw new HistoryUnreadable(`ref ${name} has content it cannot parse`);
|
|
439
|
+
};
|
|
440
|
+
const walk = (dir) => {
|
|
441
|
+
let entries = [];
|
|
442
|
+
try {
|
|
443
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
444
|
+
}
|
|
445
|
+
catch (err) {
|
|
446
|
+
if (isAbsent(err))
|
|
447
|
+
return;
|
|
448
|
+
throw new HistoryUnreadable(`cannot list refs: ${err.message}`);
|
|
449
|
+
}
|
|
450
|
+
for (const e of entries) {
|
|
451
|
+
const p = path.join(dir, e.name);
|
|
452
|
+
if (e.isDirectory()) {
|
|
453
|
+
walk(p);
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
const raw = readOptional(p);
|
|
457
|
+
if (!raw)
|
|
458
|
+
continue; // removed while listing
|
|
459
|
+
const v = raw.toString('utf-8').trim();
|
|
460
|
+
if (/^[0-9a-f]{40}$/.test(v))
|
|
461
|
+
tips.add(v);
|
|
462
|
+
else if (/^ref:\s*\S/.test(v)) {
|
|
463
|
+
const r = readRef(commonDir, path.relative(commonDir, p).split(path.sep).join('/'));
|
|
464
|
+
if (r)
|
|
465
|
+
tips.add(r);
|
|
466
|
+
}
|
|
467
|
+
else
|
|
468
|
+
throw new HistoryUnreadable(`ref ${e.name} has content it cannot parse`);
|
|
469
|
+
}
|
|
470
|
+
};
|
|
471
|
+
walk(path.join(commonDir, 'refs'));
|
|
472
|
+
const head = readRef(gitDir, 'HEAD');
|
|
473
|
+
if (head)
|
|
474
|
+
tips.add(head);
|
|
475
|
+
// Every linked worktree's HEAD, wherever faf_dna was called from: a detached
|
|
476
|
+
// worktree can hold the only commit with .faf-dna.
|
|
477
|
+
for (const w of linkedWorktreeDirs(commonDir)) {
|
|
478
|
+
const h = readRef(w, 'HEAD');
|
|
479
|
+
if (h)
|
|
480
|
+
tips.add(h);
|
|
481
|
+
}
|
|
482
|
+
if (commonDir !== gitDir) {
|
|
483
|
+
const mainHead = readRef(commonDir, 'HEAD');
|
|
484
|
+
if (mainHead)
|
|
485
|
+
tips.add(mainHead);
|
|
486
|
+
}
|
|
487
|
+
return [...tips];
|
|
488
|
+
}
|
|
489
|
+
const ZERO_SHA = '0'.repeat(40);
|
|
490
|
+
/**
|
|
491
|
+
* Every commit a reflog names: logs/HEAD of this worktree, of the common dir
|
|
492
|
+
* and of every linked worktree, and every file under logs/refs/. A commit dropped by `reset --hard`,
|
|
493
|
+
* `commit --amend` or a deleted branch is reachable only from here until the
|
|
494
|
+
* reflog expires. No logs directory is fine (core.logAllRefUpdates=false);
|
|
495
|
+
* a reflog that exists but cannot be read or parsed throws.
|
|
496
|
+
*/
|
|
497
|
+
function reflogTips(commonDir, gitDir) {
|
|
498
|
+
const tips = new Set();
|
|
499
|
+
const readLog = (p) => {
|
|
500
|
+
const raw = readOptional(p);
|
|
501
|
+
if (!raw)
|
|
502
|
+
return;
|
|
503
|
+
for (const line of raw.toString('utf-8').split('\n')) {
|
|
504
|
+
if (!line)
|
|
505
|
+
continue;
|
|
506
|
+
const m = line.match(/^([0-9a-f]{40}) ([0-9a-f]{40}) /);
|
|
507
|
+
if (!m)
|
|
508
|
+
throw new HistoryUnreadable(`reflog ${path.basename(p)} has a line it cannot parse`);
|
|
509
|
+
for (const sha of [m[1], m[2]])
|
|
510
|
+
if (sha !== ZERO_SHA)
|
|
511
|
+
tips.add(sha);
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
const walk = (dir) => {
|
|
515
|
+
let entries = [];
|
|
516
|
+
try {
|
|
517
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
518
|
+
}
|
|
519
|
+
catch (err) {
|
|
520
|
+
if (isAbsent(err))
|
|
521
|
+
return;
|
|
522
|
+
throw new HistoryUnreadable(`cannot list reflogs: ${err.message}`);
|
|
523
|
+
}
|
|
524
|
+
for (const e of entries) {
|
|
525
|
+
const p = path.join(dir, e.name);
|
|
526
|
+
if (e.isDirectory())
|
|
527
|
+
walk(p);
|
|
528
|
+
else
|
|
529
|
+
readLog(p);
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
readLog(path.join(gitDir, 'logs', 'HEAD'));
|
|
533
|
+
if (commonDir !== gitDir)
|
|
534
|
+
readLog(path.join(commonDir, 'logs', 'HEAD'));
|
|
535
|
+
for (const w of linkedWorktreeDirs(commonDir)) {
|
|
536
|
+
if (w !== gitDir)
|
|
537
|
+
readLog(path.join(w, 'logs', 'HEAD'));
|
|
538
|
+
}
|
|
539
|
+
walk(path.join(commonDir, 'logs', 'refs'));
|
|
540
|
+
return [...tips];
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Has git ever recorded `file` (an absolute path) in its repository?
|
|
544
|
+
* `maxCommits` bounds the history walk; past it the answer is `unknown`.
|
|
545
|
+
*/
|
|
546
|
+
function gitEverTracked(file, maxCommits = 200_000) {
|
|
547
|
+
try {
|
|
548
|
+
const repo = findRepo(path.dirname(file));
|
|
549
|
+
if (!repo)
|
|
550
|
+
return { status: 'not-a-repo' };
|
|
551
|
+
let rootReal = repo.root;
|
|
552
|
+
let fileReal = file;
|
|
553
|
+
try {
|
|
554
|
+
rootReal = fs.realpathSync(repo.root);
|
|
555
|
+
}
|
|
556
|
+
catch { /* keep */ }
|
|
557
|
+
try {
|
|
558
|
+
fileReal = path.join(fs.realpathSync(path.dirname(file)), path.basename(file));
|
|
559
|
+
}
|
|
560
|
+
catch { /* keep */ }
|
|
561
|
+
const rel = path.relative(rootReal, fileReal).split(path.sep).join('/');
|
|
562
|
+
if (!rel || rel.startsWith('..'))
|
|
563
|
+
return { status: 'unknown', reason: 'file outside work tree' };
|
|
564
|
+
const cfg = readOptional(path.join(repo.commonDir, 'config'))?.toString('utf-8') ?? '';
|
|
565
|
+
if (/objectformat\s*=\s*sha256/i.test(cfg))
|
|
566
|
+
return { status: 'unknown', reason: 'sha256 repository' };
|
|
567
|
+
// A shallow clone has cut history: commits before the cut are not here.
|
|
568
|
+
if (readOptional(path.join(repo.commonDir, 'shallow'))) {
|
|
569
|
+
return { status: 'unknown', reason: 'shallow clone (history is incomplete)' };
|
|
570
|
+
}
|
|
571
|
+
if (indexHas(repo.gitDir, rel))
|
|
572
|
+
return { status: 'found', where: 'the git index' };
|
|
573
|
+
const store = new ObjectStore(path.join(repo.commonDir, 'objects'));
|
|
574
|
+
const segments = rel.split('/');
|
|
575
|
+
const seenCommits = new Set();
|
|
576
|
+
const seenTrees = new Set();
|
|
577
|
+
const queue = [...refTips(repo.commonDir, repo.gitDir), ...reflogTips(repo.commonDir, repo.gitDir)];
|
|
578
|
+
while (queue.length) {
|
|
579
|
+
let sha = queue.pop();
|
|
580
|
+
if (seenCommits.has(sha))
|
|
581
|
+
continue;
|
|
582
|
+
seenCommits.add(sha);
|
|
583
|
+
if (seenCommits.size > maxCommits)
|
|
584
|
+
return { status: 'unknown', reason: 'history too large to scan' };
|
|
585
|
+
// Every reachable object must be readable; a missing one is unknown, not never.
|
|
586
|
+
let obj = store.need(sha);
|
|
587
|
+
// Annotated tags point at the commit.
|
|
588
|
+
for (let hops = 0; obj.type === 'tag'; hops++) {
|
|
589
|
+
const m = obj.data.toString('latin1').match(/^object ([0-9a-f]{40})/);
|
|
590
|
+
if (!m || hops > 16)
|
|
591
|
+
throw new HistoryUnreadable(`tag ${sha.slice(0, 7)} is malformed`);
|
|
592
|
+
sha = m[1];
|
|
593
|
+
obj = store.need(sha);
|
|
594
|
+
}
|
|
595
|
+
if (obj.type !== 'commit')
|
|
596
|
+
continue; // a ref to a tree or blob has no history
|
|
597
|
+
const text = obj.data.toString('utf-8');
|
|
598
|
+
const headerEnd = text.indexOf('\n\n');
|
|
599
|
+
const header = headerEnd >= 0 ? text.slice(0, headerEnd) : text;
|
|
600
|
+
const treeSha = header.match(/^tree ([0-9a-f]{40})/m)?.[1];
|
|
601
|
+
if (!treeSha)
|
|
602
|
+
throw new HistoryUnreadable(`commit ${sha.slice(0, 7)} has no tree`);
|
|
603
|
+
for (const m of header.matchAll(/^parent ([0-9a-f]{40})/gm))
|
|
604
|
+
queue.push(m[1]);
|
|
605
|
+
if (seenTrees.has(treeSha))
|
|
606
|
+
continue;
|
|
607
|
+
seenTrees.add(treeSha);
|
|
608
|
+
// Absent from a readable tree is "not here"; an unreadable tree throws.
|
|
609
|
+
// A non-tree at a directory position (that name was a file) is "not here" too.
|
|
610
|
+
let cur = treeSha;
|
|
611
|
+
for (const seg of segments) {
|
|
612
|
+
const tree = store.need(cur);
|
|
613
|
+
cur = tree.type === 'tree' ? treeEntry(tree.data, seg) : null;
|
|
614
|
+
if (!cur)
|
|
615
|
+
break;
|
|
616
|
+
}
|
|
617
|
+
if (cur) {
|
|
618
|
+
const subject = headerEnd >= 0 ? text.slice(headerEnd + 2).split('\n')[0] : '';
|
|
619
|
+
return { status: 'found', where: `commit ${sha.slice(0, 7)}${subject ? ` "${subject}"` : ''}` };
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
return { status: 'never' };
|
|
623
|
+
}
|
|
624
|
+
catch (err) {
|
|
625
|
+
return { status: 'unknown', reason: err instanceof Error ? err.message : String(err) };
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
//# sourceMappingURL=git-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-history.js","sourceRoot":"","sources":["../../../src/utils/git-history.ts"],"names":[],"mappings":"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"}
|