dsh-gitnexus-plus 0.1.3 → 0.1.5
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/README-CN.md +34 -10
- package/README.md +79 -14
- package/lib/bin/graph-helper.d.ts +21 -0
- package/lib/bin/graph-helper.d.ts.map +1 -0
- package/lib/bin/graph-helper.js +71 -0
- package/lib/bin/graph-helper.js.map +1 -0
- package/lib/client.js +4402 -2371
- package/lib/gitnexus/analyze.d.ts +54 -8
- package/lib/gitnexus/analyze.d.ts.map +1 -1
- package/lib/gitnexus/analyze.js +355 -84
- package/lib/gitnexus/analyze.js.map +1 -1
- package/lib/gitnexus/commands.d.ts +19 -2
- package/lib/gitnexus/commands.d.ts.map +1 -1
- package/lib/gitnexus/commands.js +42 -4
- package/lib/gitnexus/commands.js.map +1 -1
- package/lib/gitnexus/coverage.d.ts +8 -0
- package/lib/gitnexus/coverage.d.ts.map +1 -1
- package/lib/gitnexus/coverage.js +14 -2
- package/lib/gitnexus/coverage.js.map +1 -1
- package/lib/gitnexus/delta.d.ts +144 -0
- package/lib/gitnexus/delta.d.ts.map +1 -0
- package/lib/gitnexus/delta.js +347 -0
- package/lib/gitnexus/delta.js.map +1 -0
- package/lib/gitnexus/discover.d.ts +91 -0
- package/lib/gitnexus/discover.d.ts.map +1 -0
- package/lib/gitnexus/discover.js +214 -0
- package/lib/gitnexus/discover.js.map +1 -0
- package/lib/gitnexus/git-activity.d.ts +13 -21
- package/lib/gitnexus/git-activity.d.ts.map +1 -1
- package/lib/gitnexus/git-activity.js +60 -26
- package/lib/gitnexus/git-activity.js.map +1 -1
- package/lib/gitnexus/graph.d.ts +135 -0
- package/lib/gitnexus/graph.d.ts.map +1 -0
- package/lib/gitnexus/graph.js +474 -0
- package/lib/gitnexus/graph.js.map +1 -0
- package/lib/gitnexus/index-meta.d.ts +34 -6
- package/lib/gitnexus/index-meta.d.ts.map +1 -1
- package/lib/gitnexus/index-meta.js +47 -7
- package/lib/gitnexus/index-meta.js.map +1 -1
- package/lib/gitnexus/install.d.ts +11 -0
- package/lib/gitnexus/install.d.ts.map +1 -1
- package/lib/gitnexus/install.js +65 -9
- package/lib/gitnexus/install.js.map +1 -1
- package/lib/gitnexus/root.d.ts +0 -3
- package/lib/gitnexus/root.d.ts.map +1 -1
- package/lib/gitnexus/root.js +64 -5
- package/lib/gitnexus/root.js.map +1 -1
- package/lib/gitnexus/search.d.ts +34 -8
- package/lib/gitnexus/search.d.ts.map +1 -1
- package/lib/gitnexus/search.js +89 -13
- package/lib/gitnexus/search.js.map +1 -1
- package/lib/index.d.ts +13 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +189 -7
- package/lib/index.js.map +1 -1
- package/lib/routes/analyze.d.ts +8 -6
- package/lib/routes/analyze.d.ts.map +1 -1
- package/lib/routes/analyze.js +25 -6
- package/lib/routes/analyze.js.map +1 -1
- package/lib/routes/coverage.d.ts +16 -10
- package/lib/routes/coverage.d.ts.map +1 -1
- package/lib/routes/coverage.js +31 -22
- package/lib/routes/coverage.js.map +1 -1
- package/lib/routes/delta.d.ts +22 -0
- package/lib/routes/delta.d.ts.map +1 -0
- package/lib/routes/delta.js +50 -0
- package/lib/routes/delta.js.map +1 -0
- package/lib/routes/file-diff.d.ts +19 -0
- package/lib/routes/file-diff.d.ts.map +1 -0
- package/lib/routes/file-diff.js +69 -0
- package/lib/routes/file-diff.js.map +1 -0
- package/lib/routes/graph.d.ts +22 -0
- package/lib/routes/graph.d.ts.map +1 -0
- package/lib/routes/graph.js +71 -0
- package/lib/routes/graph.js.map +1 -0
- package/lib/routes/guard.d.ts +3 -6
- package/lib/routes/guard.d.ts.map +1 -1
- package/lib/routes/guard.js +3 -6
- package/lib/routes/guard.js.map +1 -1
- package/lib/routes/projects.d.ts +21 -0
- package/lib/routes/projects.d.ts.map +1 -0
- package/lib/routes/projects.js +61 -0
- package/lib/routes/projects.js.map +1 -0
- package/package.json +2 -2
package/lib/gitnexus/analyze.js
CHANGED
|
@@ -21,15 +21,23 @@
|
|
|
21
21
|
*
|
|
22
22
|
* THE ONE RULE THAT MATTERS
|
|
23
23
|
* -------------------------
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
24
|
+
* This runner never **constructs** a sandbox policy and never chooses a mode. It may
|
|
25
|
+
* forward a policy the host resolved (`options.sandboxPolicy`), and the host may only
|
|
26
|
+
* fill in the workspace root — see `src/index.ts`. The reason is measured, not
|
|
27
|
+
* theoretical: an agentless route has no session, so `sandboxPolicy.resolve()` falls
|
|
28
|
+
* back to `config.workspaceRoot ?? process.cwd()` and the sandbox derives its write
|
|
29
|
+
* capability SID from *that* path. The repository's own grant then never applies, and
|
|
30
|
+
* every write inside `.gitnexus` is refused — the failure this plugin reported as
|
|
31
|
+
* "sandbox denies .gitnexus". Supplying the workspace root is not escalation: the mode
|
|
32
|
+
* still comes from the deployment, and a read-only deployment stays read-only.
|
|
33
|
+
*
|
|
34
|
+
* A denial is reported as a denial, not retried wider: the same rule the subagent
|
|
35
|
+
* prompt states, for the same reason.
|
|
29
36
|
*/
|
|
30
|
-
import { existsSync, mkdirSync } from 'node:fs';
|
|
37
|
+
import { existsSync, mkdirSync, readFileSync, rmSync } from 'node:fs';
|
|
31
38
|
import path from 'node:path';
|
|
32
39
|
import { defaultGitnexusHome, effectiveSkipFts } from './commands.js';
|
|
40
|
+
import { hasGitMarker } from './index-meta.js';
|
|
33
41
|
import { findGitnexusCli } from './toolchain.js';
|
|
34
42
|
const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
|
|
35
43
|
const DEFAULT_OUTPUT_LIMIT = 256 * 1024;
|
|
@@ -74,9 +82,18 @@ export function analyzeCommandLine(cliPath, repoPath, options = {}) {
|
|
|
74
82
|
// is spawned through `node`. This is the better shape when available: no shim, no
|
|
75
83
|
// `.cmd`/`.ps1` selection, and therefore no reliance on the shell's call operator.
|
|
76
84
|
const viaNode = options.viaNode === true;
|
|
85
|
+
// Repair and skip are contradictory, and both flags are accepted by the CLI without
|
|
86
|
+
// complaining: `--skip-fts --repair-fts` exits 0 having done nothing. Guard here
|
|
87
|
+
// rather than trusting callers to keep them apart.
|
|
88
|
+
const repairFts = options.repairFts === true;
|
|
89
|
+
const skipFts = options.skipFts === true && !repairFts;
|
|
90
|
+
const skipGit = options.skipGit === true;
|
|
91
|
+
const force = options.force === true && !repairFts;
|
|
77
92
|
const args = `analyze --index-only` +
|
|
78
|
-
`${
|
|
79
|
-
`${
|
|
93
|
+
`${repairFts ? ' --repair-fts' : ''}` +
|
|
94
|
+
`${skipGit ? ' --skip-git' : ''}` +
|
|
95
|
+
`${skipFts ? ' --skip-fts' : ''}` +
|
|
96
|
+
`${force ? ' --force' : ''} ` +
|
|
80
97
|
quoteFor(flavor, repoPath);
|
|
81
98
|
const head = viaNode ? `node ${quoteFor(flavor, cliPath)}` : quoteFor(flavor, cliPath);
|
|
82
99
|
// On Windows a `.cmd` or `.ps1` reached by absolute path needs `&`. POSIX needs none,
|
|
@@ -98,27 +115,151 @@ export function analyzeCommandLine(cliPath, repoPath, options = {}) {
|
|
|
98
115
|
/**
|
|
99
116
|
* A sandbox refusal, recognised from the marker DSH writes into the output.
|
|
100
117
|
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
118
|
+
* The marker is the only reliable signal. It used to also match a bare `EPERM`, which
|
|
119
|
+
* is how a transient Windows file lock got reported as "the sandbox refused this
|
|
120
|
+
* write" — and the operator was told to stop trying, when retrying was the answer.
|
|
103
121
|
*/
|
|
104
122
|
function looksDenied(text) {
|
|
105
|
-
return /\[sandbox:[^\]]*denied/i.test(text) || /access is denied
|
|
123
|
+
return /\[sandbox:[^\]]*denied/i.test(text) || /access is denied/i.test(text);
|
|
124
|
+
}
|
|
125
|
+
/** Delay before the single transient-lock retry. Long enough for a scanner to let go. */
|
|
126
|
+
const RETRY_DELAY_MS = 1500;
|
|
127
|
+
/**
|
|
128
|
+
* Whether a failure looks like a transient file lock rather than a policy refusal.
|
|
129
|
+
*
|
|
130
|
+
* Measured on GitNexus 1.6.12: the first write inside `.gitnexus` is
|
|
131
|
+
* `lbug.init.lock`, opened with `O_CREAT | O_EXCL`, and Windows can refuse it with
|
|
132
|
+
* `EPERM` while another scanner or a previous process holds the directory. The same
|
|
133
|
+
* class produces `unable to acquire init lock` when a crashed run left the file behind.
|
|
134
|
+
* Both are worth one retry; a sandbox marker never is, and neither is a denied
|
|
135
|
+
* directory creation — see {@link isSandboxStoreDenied}.
|
|
136
|
+
*/
|
|
137
|
+
function isTransientLock(text) {
|
|
138
|
+
if (/\[sandbox:[^\]]*denied/i.test(text))
|
|
139
|
+
return false;
|
|
140
|
+
// The parse store is a directory the analyzer must create; a retry cannot grant a
|
|
141
|
+
// right the confined token does not have, so that class is handled separately.
|
|
142
|
+
if (isSandboxStoreDenied(text))
|
|
143
|
+
return false;
|
|
144
|
+
// A refused `spawn` is the sandbox blocking a child process (the FTS installer), not a
|
|
145
|
+
// held file: waiting and retrying changes nothing.
|
|
146
|
+
if (/spawn EPERM/i.test(text))
|
|
147
|
+
return false;
|
|
148
|
+
if (/unable to acquire init lock/i.test(text))
|
|
149
|
+
return true;
|
|
150
|
+
return /(EPERM|EBUSY|resource busy)/i.test(text) && /\.gitnexus|init\.lock|lbug/i.test(text);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Whether GitNexus tried to start a child process and the sandbox refused.
|
|
154
|
+
*
|
|
155
|
+
* Measured on a `--repair-fts` run: `Analysis failed: spawn EPERM`. The FTS extension is
|
|
156
|
+
* installed/loaded out of process, which a confined shell denies. This is the same class
|
|
157
|
+
* as the respawn problem `GITNEXUS_MEMORY=off` was added for — but this one is a child
|
|
158
|
+
* the analyzer starts deliberately, and no flag suppresses it.
|
|
159
|
+
*/
|
|
160
|
+
function looksSpawnDenied(text) {
|
|
161
|
+
return /spawn EPERM/i.test(text);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Whether the FTS extension was found and still could not be loaded.
|
|
165
|
+
*
|
|
166
|
+
* That is an upstream runtime problem, not a sandbox refusal and not something a retry
|
|
167
|
+
* can fix: on Windows it usually names a missing DLL (`找不到指定的模块`), which the
|
|
168
|
+
* upstream message traces to the VC++ 2015-2022 x64 redistributable or OpenSSL 3.
|
|
169
|
+
*/
|
|
170
|
+
function looksFtsUnloadable(text) {
|
|
171
|
+
return (/FTS extension file was found but could not be loaded/i.test(text) ||
|
|
172
|
+
(/failed to load library/i.test(text) && /fts/i.test(text)));
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Whether the parse worker was refused permission to create its cache directories.
|
|
176
|
+
*
|
|
177
|
+
* Measured in a confined DSH profile: the token can create **files** under `.gitnexus`
|
|
178
|
+
* (`lbug.init.lock` succeeds) but not **directories**, so `persistParsedFileShardSync`
|
|
179
|
+
* dies at `mkdir .gitnexus/parsedfile-store` and the pool trips its circuit breaker.
|
|
180
|
+
* Pre-creating the directory does not help either — GitNexus deletes it at the start of
|
|
181
|
+
* every parse, and that delete is refused for the same reason (0.1.3 shipped exactly
|
|
182
|
+
* that workaround and produced `EPERM … rmdir`). This is a property of the deployment,
|
|
183
|
+
* so the honest answer is one precise message pointing at the terminal, not a retry.
|
|
184
|
+
*/
|
|
185
|
+
function isSandboxStoreDenied(text) {
|
|
186
|
+
return (/EPERM[^\n]*mkdir[^\n]*\.gitnexus[\\/](parsedfile-store|parsedfile-cache|parse-cache)/i.test(text) ||
|
|
187
|
+
/mkdir[^\n]*\.gitnexus[\\/](parsedfile-store|parsedfile-cache|parse-cache)[^\n]*EPERM/i.test(text));
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Remove the init lock a crashed run left behind, so the retry can take it.
|
|
191
|
+
*
|
|
192
|
+
* Safe by construction: this runner holds one run per repository, so no other analyze
|
|
193
|
+
* started by this plugin can be inside the window. A live lock from another tool is
|
|
194
|
+
* left to GitNexus's own staleness detection — this only clears the file, it does not
|
|
195
|
+
* decide who owns it.
|
|
196
|
+
*/
|
|
197
|
+
function clearStaleLock(repoPath) {
|
|
198
|
+
try {
|
|
199
|
+
rmSync(path.join(repoPath, '.gitnexus', 'lbug.init.lock'), { force: true });
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
/* the retry may still succeed once a scanner releases it */
|
|
203
|
+
}
|
|
106
204
|
}
|
|
107
205
|
/**
|
|
108
|
-
*
|
|
206
|
+
* Whether the manifest on disk records no commit.
|
|
109
207
|
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* instead of letting the worker fail on a path the panel then has to explain.
|
|
208
|
+
* In a confined shell the analyzer cannot start `git`, so it writes an empty
|
|
209
|
+
* `lastCommit` even on a successful run. The index itself is fine — the baseline is not
|
|
210
|
+
* — and that is what makes the refresh gate answer "无法确认" instead of "已是最新".
|
|
211
|
+
* Reported to the operator rather than repaired here: the manifest belongs to GitNexus,
|
|
212
|
+
* and writing a commit into it is the analyzer's decision, not this plugin's.
|
|
116
213
|
*/
|
|
117
|
-
|
|
214
|
+
function lacksCommitBaseline(repoPath) {
|
|
215
|
+
try {
|
|
216
|
+
const raw = JSON.parse(readFileSync(path.join(repoPath, '.gitnexus', 'gitnexus.json'), 'utf8'));
|
|
217
|
+
return typeof raw.lastCommit !== 'string' || raw.lastCommit === '';
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* The **durable** caches, created from the host before the shell starts.
|
|
225
|
+
*
|
|
226
|
+
* A worker running under a restricted host token can be denied `mkdir` on the project's
|
|
227
|
+
* inherited `.gitnexus` ACL even though it can write files there. The failure is EPERM
|
|
228
|
+
* at the first shard write and takes the whole parse phase down with it. Creating these
|
|
229
|
+
* two from the host, before the shell starts, makes the worker use directories that
|
|
230
|
+
* already exist. They are never cleared between runs, so a pre-created one is inert.
|
|
231
|
+
*/
|
|
232
|
+
const ANALYZE_CACHE_DIRS = ['parsedfile-cache', 'parse-cache'];
|
|
233
|
+
/**
|
|
234
|
+
* GitNexus's **run-scoped** parsed-file store. Deliberately not pre-created.
|
|
235
|
+
*
|
|
236
|
+
* `parse-impl` calls `clearParsedFileStore()` unconditionally at the start of parsing,
|
|
237
|
+
* which is `fs.rm(dir, { recursive: true, force: true })`. `force` only forgives a
|
|
238
|
+
* missing directory — not a refusal or a lock. So a directory that exists there must be
|
|
239
|
+
* deleted before every parse, and 0.1.3 pre-created exactly that: it fixed a worker
|
|
240
|
+
* `mkdir` and introduced a delete the restricted process has to perform on a directory
|
|
241
|
+
* the **host** created. When that delete is denied or briefly locked, the parse dies
|
|
242
|
+
* with `EPERM … rmdir '<repo>\\.gitnexus\\parsedfile-store'` — the failure reported
|
|
243
|
+
* against 0.1.3.
|
|
244
|
+
*
|
|
245
|
+
* Measured against GitNexus 1.6.12: with the directory absent, a cold `--force` parse
|
|
246
|
+
* succeeds and never creates it, while the durable chunk directories it does create
|
|
247
|
+
* show the confined process can `mkdir`. So the store is left to GitNexus, and a
|
|
248
|
+
* leftover from an older plugin version is removed before spawning instead.
|
|
249
|
+
*/
|
|
250
|
+
const RUN_SCOPED_STORE = 'parsedfile-store';
|
|
118
251
|
function prepareAnalyzeCacheDirs(repoPath) {
|
|
119
252
|
const indexDir = path.join(repoPath, '.gitnexus');
|
|
120
253
|
if (!existsSync(indexDir))
|
|
121
254
|
return null;
|
|
255
|
+
// Best effort. If this cannot be removed, GitNexus's own clear gets the next attempt;
|
|
256
|
+
// failing the run here would only replace one EPERM with a less accurate one.
|
|
257
|
+
try {
|
|
258
|
+
rmSync(path.join(indexDir, RUN_SCOPED_STORE), { recursive: true, force: true });
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
/* the analyzer's clear is the next attempt; do not pre-empt it */
|
|
262
|
+
}
|
|
122
263
|
for (const name of ANALYZE_CACHE_DIRS) {
|
|
123
264
|
const target = path.join(indexDir, name);
|
|
124
265
|
try {
|
|
@@ -146,14 +287,35 @@ export function createAnalyzeRunner(options) {
|
|
|
146
287
|
const outputLimit = options.outputLimit ?? DEFAULT_OUTPUT_LIMIT;
|
|
147
288
|
const tailLimit = options.tailLimit ?? DEFAULT_TAIL_LIMIT;
|
|
148
289
|
const now = options.now ?? (() => Date.now());
|
|
290
|
+
const retryDelayMs = options.retryDelayMs ?? RETRY_DELAY_MS;
|
|
149
291
|
const shellFlavor = process.platform === 'win32' ? 'win32' : 'posix';
|
|
150
292
|
const runs = new Map();
|
|
151
293
|
const inFlight = new Map();
|
|
294
|
+
// One status per repository, and a long session can touch many. The map used to grow
|
|
295
|
+
// with every repository ever visited, each entry holding a 4 KB output tail; an idle
|
|
296
|
+
// panel never needs more than the repositories it can still show.
|
|
297
|
+
const RUNS_MAX = 32;
|
|
298
|
+
/** Store the latest status, evicting finished entries beyond the cap, oldest first. */
|
|
299
|
+
const rememberRun = (key, status) => {
|
|
300
|
+
runs.delete(key);
|
|
301
|
+
runs.set(key, status);
|
|
302
|
+
if (runs.size <= RUNS_MAX)
|
|
303
|
+
return;
|
|
304
|
+
for (const [other, entry] of runs) {
|
|
305
|
+
if (entry.state === 'running')
|
|
306
|
+
continue;
|
|
307
|
+
runs.delete(other);
|
|
308
|
+
if (runs.size <= RUNS_MAX)
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
};
|
|
152
312
|
/** The shape a status starts from, before any run has touched it. */
|
|
153
313
|
const BLANK = {
|
|
154
314
|
state: 'failed',
|
|
155
315
|
force: false,
|
|
316
|
+
repairFts: false,
|
|
156
317
|
command: '',
|
|
318
|
+
attempts: 0,
|
|
157
319
|
startedAt: 0,
|
|
158
320
|
finishedAt: null,
|
|
159
321
|
exitCode: null,
|
|
@@ -171,7 +333,7 @@ export function createAnalyzeRunner(options) {
|
|
|
171
333
|
// silent no-op. The spread above cannot express that.
|
|
172
334
|
finishedAt: patch.finishedAt ?? now(),
|
|
173
335
|
};
|
|
174
|
-
|
|
336
|
+
rememberRun(repoPath, next);
|
|
175
337
|
inFlight.delete(repoPath);
|
|
176
338
|
return next;
|
|
177
339
|
};
|
|
@@ -180,11 +342,23 @@ export function createAnalyzeRunner(options) {
|
|
|
180
342
|
// Named `request`, not `options`: the runner's own configuration is the outer
|
|
181
343
|
// `options`, and shadowing it silently dropped `toolchain`, `memoryOff` and
|
|
182
344
|
// `heapMb` from every run built after the force argument was added.
|
|
183
|
-
|
|
345
|
+
//
|
|
346
|
+
// Repair wins over force: a caller asking for both wants the smaller, more targeted
|
|
347
|
+
// operation, and running a full rebuild to fix FTS would be a much larger change
|
|
348
|
+
// than the button said. `analyzeCommandLine` enforces the same precedence so the
|
|
349
|
+
// displayed command cannot disagree with the one executed.
|
|
350
|
+
const repairFts = request.repairFts === true;
|
|
351
|
+
const force = repairFts ? false : request.force === true;
|
|
184
352
|
// Both decisions are per repository, not per plugin: the skip-fts policy depends
|
|
185
353
|
// on the index's own FTS capability, and the registry redirect belongs beside the
|
|
186
|
-
// index so it stays inside the workspace the host was granted.
|
|
187
|
-
|
|
354
|
+
// index so it stays inside the workspace the host was granted. A repair run never
|
|
355
|
+
// skips FTS — that would be the one flag combination that does nothing at all.
|
|
356
|
+
const skipFts = repairFts ? false : effectiveSkipFts(key, options.skipFts === true);
|
|
357
|
+
// GitNexus checks for `.git` before it reads any option, so a plain folder is
|
|
358
|
+
// refused even when its path is explicit. `--skip-git` is the CLI's own answer:
|
|
359
|
+
// it indexes the folder and warns that commit tracking and incremental updates
|
|
360
|
+
// are disabled. The panel reports the same consequence.
|
|
361
|
+
const skipGit = !hasGitMarker(key);
|
|
188
362
|
const gitnexusHome = options.gitnexusHome ?? defaultGitnexusHome(key);
|
|
189
363
|
// One run per repository. Two concurrent `analyze` processes would contend for the
|
|
190
364
|
// same store, and the second would report a failure that says nothing about the
|
|
@@ -192,11 +366,19 @@ export function createAnalyzeRunner(options) {
|
|
|
192
366
|
const running = runs.get(key);
|
|
193
367
|
if (running !== undefined && running.state === 'running')
|
|
194
368
|
return running;
|
|
369
|
+
// The command as a human would type it, for the states that never reach a real
|
|
370
|
+
// invocation. Kept in one place so an early return cannot describe a different
|
|
371
|
+
// operation than the one the request asked for.
|
|
372
|
+
const previewCommand = `gitnexus analyze --index-only` +
|
|
373
|
+
`${repairFts ? ' --repair-fts' : ''}` +
|
|
374
|
+
`${skipGit ? ' --skip-git' : ''}` +
|
|
375
|
+
`${force ? ' --force' : ''}`;
|
|
195
376
|
if (shell === null) {
|
|
196
377
|
return finish(key, {
|
|
197
378
|
state: 'unavailable',
|
|
198
379
|
force,
|
|
199
|
-
|
|
380
|
+
repairFts,
|
|
381
|
+
command: previewCommand,
|
|
200
382
|
startedAt: now(),
|
|
201
383
|
output: '',
|
|
202
384
|
message: '当前部署没有提供 shell 执行器(ctx.shell 未挂载),无法运行命令。' +
|
|
@@ -211,7 +393,8 @@ export function createAnalyzeRunner(options) {
|
|
|
211
393
|
return finish(key, {
|
|
212
394
|
state: 'unavailable',
|
|
213
395
|
force,
|
|
214
|
-
|
|
396
|
+
repairFts,
|
|
397
|
+
command: previewCommand,
|
|
215
398
|
startedAt: now(),
|
|
216
399
|
output: '',
|
|
217
400
|
message: '本机没有找到 gitnexus 命令,无法执行。安装后重试:`npm i -g gitnexus`。' +
|
|
@@ -227,7 +410,9 @@ export function createAnalyzeRunner(options) {
|
|
|
227
410
|
heapMb: options.heapMb,
|
|
228
411
|
viaNode: cli.viaNode,
|
|
229
412
|
force,
|
|
413
|
+
repairFts,
|
|
230
414
|
skipFts,
|
|
415
|
+
skipGit,
|
|
231
416
|
gitnexusHome,
|
|
232
417
|
});
|
|
233
418
|
const cacheError = prepareAnalyzeCacheDirs(key);
|
|
@@ -235,6 +420,7 @@ export function createAnalyzeRunner(options) {
|
|
|
235
420
|
return finish(key, {
|
|
236
421
|
state: 'failed',
|
|
237
422
|
force,
|
|
423
|
+
repairFts,
|
|
238
424
|
command,
|
|
239
425
|
startedAt: now(),
|
|
240
426
|
output: '',
|
|
@@ -247,14 +433,20 @@ export function createAnalyzeRunner(options) {
|
|
|
247
433
|
repoPath: key,
|
|
248
434
|
state: 'running',
|
|
249
435
|
force,
|
|
436
|
+
repairFts,
|
|
250
437
|
command,
|
|
438
|
+
attempts: 1,
|
|
251
439
|
startedAt: now(),
|
|
252
440
|
finishedAt: null,
|
|
253
441
|
exitCode: null,
|
|
254
442
|
message: null,
|
|
255
443
|
output: '',
|
|
256
444
|
};
|
|
257
|
-
|
|
445
|
+
rememberRun(key, started);
|
|
446
|
+
// The host resolves the policy; this runner only carries it. Absent when the
|
|
447
|
+
// deployment has no `sandboxPolicy` service, and then the executor's own default
|
|
448
|
+
// applies — exactly as before.
|
|
449
|
+
const sandboxPolicy = options.sandboxPolicy?.(key);
|
|
258
450
|
const spec = shell.resolve({
|
|
259
451
|
command,
|
|
260
452
|
workdir: key,
|
|
@@ -262,68 +454,147 @@ export function createAnalyzeRunner(options) {
|
|
|
262
454
|
onExpiry: 'kill',
|
|
263
455
|
stdoutMaxBytes: outputLimit,
|
|
264
456
|
signal: controller.signal,
|
|
265
|
-
|
|
457
|
+
...(sandboxPolicy === undefined ? {} : { sandboxPolicy }),
|
|
266
458
|
});
|
|
267
459
|
void (async () => {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
460
|
+
// A single retry, and only for one class of failure.
|
|
461
|
+
//
|
|
462
|
+
// Measured: GitNexus's first write inside `.gitnexus` is the init lock, and on
|
|
463
|
+
// Windows that `open` can fail with `EPERM` while a virus scanner or the indexer
|
|
464
|
+
// holds the directory — a transient refusal, not a policy one. The ACL for that
|
|
465
|
+
// path was verified healthy (`WRITE_DAC`/`WRITE_OWNER` present, no foreign
|
|
466
|
+
// entries), so retrying once after clearing a stale lock is the response, not an
|
|
467
|
+
// escalation. Anything carrying the sandbox's own marker is never retried.
|
|
468
|
+
for (let attempt = 1; attempt <= 2; attempt += 1) {
|
|
469
|
+
let execution;
|
|
470
|
+
try {
|
|
471
|
+
execution = await shell.execute(spec);
|
|
472
|
+
}
|
|
473
|
+
catch (cause) {
|
|
474
|
+
// `execute` rejects only for infrastructure failures — an unusable workdir, no
|
|
475
|
+
// shell. A cancellation rejects here too, before a handle exists.
|
|
476
|
+
const aborted = controller.signal.aborted;
|
|
477
|
+
finish(key, {
|
|
478
|
+
state: aborted ? 'cancelled' : 'failed',
|
|
479
|
+
attempts: attempt,
|
|
480
|
+
message: aborted ? '已取消。' : `无法启动命令:${String(cause?.message ?? cause)}`,
|
|
481
|
+
});
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
let result;
|
|
485
|
+
try {
|
|
486
|
+
result = await execution.result();
|
|
487
|
+
}
|
|
488
|
+
catch (cause) {
|
|
489
|
+
finish(key, {
|
|
490
|
+
state: 'failed',
|
|
491
|
+
attempts: attempt,
|
|
492
|
+
message: `执行失败:${String(cause?.message ?? cause)}`,
|
|
493
|
+
});
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
const combined = `${result.stdout?.text ?? ''}${result.stderr?.text ?? ''}`;
|
|
497
|
+
const body = tail(combined, tailLimit);
|
|
498
|
+
const exitCode = typeof result.exitCode === 'number' ? result.exitCode : null;
|
|
499
|
+
if (attempt === 1 &&
|
|
500
|
+
result.timedOut !== true &&
|
|
501
|
+
!controller.signal.aborted &&
|
|
502
|
+
isTransientLock(combined)) {
|
|
503
|
+
clearStaleLock(key);
|
|
504
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
|
|
505
|
+
if (controller.signal.aborted) {
|
|
506
|
+
finish(key, { state: 'cancelled', attempts: attempt, exitCode, output: body, message: '已取消。' });
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
continue;
|
|
510
|
+
}
|
|
511
|
+
// Order matters. A denial can also be a non-zero exit, and reporting it as a
|
|
512
|
+
// generic failure sends the operator looking for a GitNexus bug that is not
|
|
513
|
+
// there. Cancellation is checked before timeout because a kill from `cancel()`
|
|
514
|
+
// and a kill from the deadline both surface as a killed process.
|
|
515
|
+
if (controller.signal.aborted) {
|
|
516
|
+
finish(key, { state: 'cancelled', attempts: attempt, exitCode, output: body, message: '已取消。' });
|
|
517
|
+
}
|
|
518
|
+
else if (result.timedOut === true) {
|
|
519
|
+
finish(key, {
|
|
520
|
+
state: 'timed-out',
|
|
521
|
+
attempts: attempt,
|
|
522
|
+
exitCode,
|
|
523
|
+
output: body,
|
|
524
|
+
message: `超过 ${Math.round(timeoutMs / 1000)} 秒上限已终止。大仓库的全量重建可能需要更长时间。`,
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
else if (looksFtsUnloadable(combined)) {
|
|
528
|
+
// The extension is present and still cannot load: an upstream runtime gap, not
|
|
529
|
+
// a sandbox refusal and not a retry candidate.
|
|
530
|
+
finish(key, {
|
|
531
|
+
state: 'failed',
|
|
532
|
+
attempts: attempt,
|
|
533
|
+
exitCode,
|
|
534
|
+
output: body,
|
|
535
|
+
message: 'FTS 扩展文件存在但加载失败 —— 通常是 Windows 缺少原生运行时(VC++ 2015-2022 x64 与 OpenSSL 3),' +
|
|
536
|
+
'不是索引损坏,也不是本插件能修的。装好运行时后再试;在此之前搜索仍按名称/路径匹配。',
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
else if (looksSpawnDenied(combined)) {
|
|
540
|
+
finish(key, {
|
|
541
|
+
state: 'denied',
|
|
542
|
+
attempts: attempt,
|
|
543
|
+
exitCode,
|
|
544
|
+
output: body,
|
|
545
|
+
message: '分析器要启动一个子进程(FTS 扩展的安装/加载),当前沙箱不允许 spawn。请在普通终端执行下面的命令;' +
|
|
546
|
+
'若终端里仍报扩展无法加载,那是缺少原生运行时。',
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
else if (isSandboxStoreDenied(combined)) {
|
|
550
|
+
// Deterministic, not transient: the confined token may create files in
|
|
551
|
+
// `.gitnexus` but not directories, and the parse worker needs a directory.
|
|
552
|
+
// Retrying would only spend another parse; say what to do instead.
|
|
553
|
+
finish(key, {
|
|
554
|
+
state: 'denied',
|
|
555
|
+
attempts: attempt,
|
|
556
|
+
exitCode,
|
|
557
|
+
output: body,
|
|
558
|
+
message: '分析器的解析阶段要在 .gitnexus 下创建缓存目录,当前沙箱不允许(可以建文件、不能建目录),' +
|
|
559
|
+
'预建目录也会被 GitNexus 在解析开始时删除。请在普通终端执行下面的命令,再回到面板刷新。',
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
else if (looksDenied(combined)) {
|
|
563
|
+
finish(key, {
|
|
564
|
+
state: 'denied',
|
|
565
|
+
attempts: attempt,
|
|
566
|
+
exitCode,
|
|
567
|
+
output: body,
|
|
568
|
+
message: '沙箱拒绝了这次写入。本插件不会申请扩权 —— 需要在终端里手动执行这条命令。',
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
else if (exitCode === 0) {
|
|
572
|
+
finish(key, {
|
|
573
|
+
state: 'done',
|
|
574
|
+
attempts: attempt,
|
|
575
|
+
exitCode,
|
|
576
|
+
output: body,
|
|
577
|
+
// A confined shell cannot start `git`, so GitNexus cannot record the commit
|
|
578
|
+
// it indexed. The index is still correct; only the baseline is missing, and
|
|
579
|
+
// the gate will honestly say "无法确认" until a terminal run fills it in.
|
|
580
|
+
message: lacksCommitBaseline(key)
|
|
581
|
+
? '刷新完成。但沙箱里分析器读不到 git,索引没有记录提交基线 —— 想让门禁给出"已是最新",在普通终端再跑一次下面的命令。'
|
|
582
|
+
: null,
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
else {
|
|
586
|
+
finish(key, {
|
|
587
|
+
state: 'failed',
|
|
588
|
+
attempts: attempt,
|
|
589
|
+
exitCode,
|
|
590
|
+
output: body,
|
|
591
|
+
message: attempt > 1 && isTransientLock(combined)
|
|
592
|
+
? '缓存或锁文件被临时占用(EPERM/EBUSY),已自动重试一次仍失败。稍后重试;若持续出现,把下面的命令放到普通终端执行。'
|
|
593
|
+
: `gitnexus 以退出码 ${exitCode ?? '未知'} 结束。`,
|
|
594
|
+
});
|
|
595
|
+
}
|
|
288
596
|
return;
|
|
289
597
|
}
|
|
290
|
-
const combined = `${result.stdout?.text ?? ''}${result.stderr?.text ?? ''}`;
|
|
291
|
-
const body = tail(combined, tailLimit);
|
|
292
|
-
const exitCode = typeof result.exitCode === 'number' ? result.exitCode : null;
|
|
293
|
-
// Order matters. A denial can also be a non-zero exit, and reporting it as a
|
|
294
|
-
// generic failure sends the operator looking for a GitNexus bug that is not
|
|
295
|
-
// there. Cancellation is checked before timeout because a kill from `cancel()`
|
|
296
|
-
// and a kill from the deadline both surface as a killed process.
|
|
297
|
-
if (controller.signal.aborted) {
|
|
298
|
-
finish(key, { state: 'cancelled', exitCode, output: body, message: '已取消。' });
|
|
299
|
-
}
|
|
300
|
-
else if (result.timedOut === true) {
|
|
301
|
-
finish(key, {
|
|
302
|
-
state: 'timed-out',
|
|
303
|
-
exitCode,
|
|
304
|
-
output: body,
|
|
305
|
-
message: `超过 ${Math.round(timeoutMs / 1000)} 秒上限已终止。大仓库的全量重建可能需要更长时间。`,
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
else if (looksDenied(combined)) {
|
|
309
|
-
finish(key, {
|
|
310
|
-
state: 'denied',
|
|
311
|
-
exitCode,
|
|
312
|
-
output: body,
|
|
313
|
-
message: '沙箱拒绝了这次写入。本插件不会申请扩权 —— 需要在终端里手动执行这条命令。',
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
else if (exitCode === 0) {
|
|
317
|
-
finish(key, { state: 'done', exitCode, output: body, message: null });
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
finish(key, {
|
|
321
|
-
state: 'failed',
|
|
322
|
-
exitCode,
|
|
323
|
-
output: body,
|
|
324
|
-
message: `gitnexus 以退出码 ${exitCode ?? '未知'} 结束。`,
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
598
|
})();
|
|
328
599
|
return started;
|
|
329
600
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/gitnexus/analyze.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/gitnexus/analyze.ts"],"names":[],"mappings":"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"}
|