@telora/daemon 0.23.12 → 0.23.14
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/build-info.json +2 -2
- package/dist/composition/attribution-base-git.d.ts.map +1 -1
- package/dist/composition/attribution-base-git.js +3 -1
- package/dist/composition/attribution-base-git.js.map +1 -1
- package/dist/composition/verification-context.d.ts.map +1 -1
- package/dist/composition/verification-context.js +21 -4
- package/dist/composition/verification-context.js.map +1 -1
- package/dist/queries/verification/verification.js +1 -1
- package/dist/testing/fixtures/verification-deps.d.ts +2 -1
- package/dist/testing/fixtures/verification-deps.d.ts.map +1 -1
- package/dist/testing/fixtures/verification-deps.js +4 -1
- package/dist/testing/fixtures/verification-deps.js.map +1 -1
- package/dist/testing/fixtures/vitest-failure-log.d.ts +10 -0
- package/dist/testing/fixtures/vitest-failure-log.d.ts.map +1 -0
- package/dist/testing/fixtures/vitest-failure-log.js +27 -0
- package/dist/testing/fixtures/vitest-failure-log.js.map +1 -0
- package/dist/verify/attribution/verification-attribution.d.ts.map +1 -1
- package/dist/verify/attribution/verification-attribution.js +2 -1
- package/dist/verify/attribution/verification-attribution.js.map +1 -1
- package/dist/verify/attribution/verification-baseline-files.d.ts +29 -0
- package/dist/verify/attribution/verification-baseline-files.d.ts.map +1 -0
- package/dist/verify/attribution/verification-baseline-files.js +125 -0
- package/dist/verify/attribution/verification-baseline-files.js.map +1 -0
- package/dist/verify/attribution/verification-baseline-run.d.ts.map +1 -1
- package/dist/verify/attribution/verification-baseline-run.js +1 -0
- package/dist/verify/attribution/verification-baseline-run.js.map +1 -1
- package/dist/verify/attribution/verification-baseline.d.ts +15 -0
- package/dist/verify/attribution/verification-baseline.d.ts.map +1 -1
- package/dist/verify/attribution/verification-baseline.js +28 -3
- package/dist/verify/attribution/verification-baseline.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.js +1 -0
- package/dist/verify/deterministic-gate/verification-checkout.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.d.ts +30 -0
- package/dist/verify/deterministic-gate/verification-deterministic.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.js +2 -0
- package/dist/verify/deterministic-gate/verification-deterministic.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-gate-stages.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-gate-stages.js +1 -0
- package/dist/verify/deterministic-gate/verification-gate-stages.js.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.d.ts.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.js +14 -2
- package/dist/verify/engine/verification-commit-sharing.js.map +1 -1
- package/dist/verify/engine/verification-deps.d.ts +23 -0
- package/dist/verify/engine/verification-deps.d.ts.map +1 -1
- package/dist/verify/failing-test-rerun/failing-test-rerunner.d.ts +34 -0
- package/dist/verify/failing-test-rerun/failing-test-rerunner.d.ts.map +1 -0
- package/dist/verify/failing-test-rerun/failing-test-rerunner.js +34 -0
- package/dist/verify/failing-test-rerun/failing-test-rerunner.js.map +1 -0
- package/dist/verify/failing-test-rerun/failing-test-retry.d.ts +80 -0
- package/dist/verify/failing-test-rerun/failing-test-retry.d.ts.map +1 -0
- package/dist/verify/failing-test-rerun/failing-test-retry.js +102 -0
- package/dist/verify/failing-test-rerun/failing-test-retry.js.map +1 -0
- package/dist/verify/failing-test-rerun/flaky-test-finding.d.ts +11 -0
- package/dist/verify/failing-test-rerun/flaky-test-finding.d.ts.map +1 -0
- package/dist/verify/failing-test-rerun/flaky-test-finding.js +63 -0
- package/dist/verify/failing-test-rerun/flaky-test-finding.js.map +1 -0
- package/dist/verify/failing-test-rerun/rerun-command.d.ts +45 -0
- package/dist/verify/failing-test-rerun/rerun-command.d.ts.map +1 -0
- package/dist/verify/failing-test-rerun/rerun-command.js +132 -0
- package/dist/verify/failing-test-rerun/rerun-command.js.map +1 -0
- package/dist/verify/failing-test-rerun/rework-recheck.d.ts +41 -0
- package/dist/verify/failing-test-rerun/rework-recheck.d.ts.map +1 -0
- package/dist/verify/failing-test-rerun/rework-recheck.js +169 -0
- package/dist/verify/failing-test-rerun/rework-recheck.js.map +1 -0
- package/dist/verify/gate-config/verification-config.d.ts.map +1 -1
- package/dist/verify/gate-config/verification-config.js +16 -2
- package/dist/verify/gate-config/verification-config.js.map +1 -1
- package/dist/verify/gate-config/verification-manifest.d.ts +26 -1
- package/dist/verify/gate-config/verification-manifest.d.ts.map +1 -1
- package/dist/verify/gate-config/verification-manifest.js +31 -1
- package/dist/verify/gate-config/verification-manifest.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/verify/failing-test-rerun/rerun-command.test.ts
|
|
3
|
+
// PINNED-BY-END
|
|
4
|
+
/**
|
|
5
|
+
* The pure core of answering a small gate failure through a product's DECLARED
|
|
6
|
+
* per-file re-run command (telora.verify.json `rerunCommand`): which failures
|
|
7
|
+
* are small enough to be answered that way, which test FILES they name, and the
|
|
8
|
+
* command that re-runs exactly those files.
|
|
9
|
+
*
|
|
10
|
+
* Why a declared command and never a derived one: the daemon cannot know how a
|
|
11
|
+
* product runs one test file (vitest, jest, node:test, a workspace runner, a
|
|
12
|
+
* wrapper script). falsifier/falsifier-command.ts guesses that for Telora's own
|
|
13
|
+
* layout only; generalising its guess would run the wrong thing in another
|
|
14
|
+
* product and read the silence as a verdict. So the product declares the
|
|
15
|
+
* command, the daemon substitutes the files, and a product that declares none
|
|
16
|
+
* keeps paying whole-gate runs exactly as before.
|
|
17
|
+
*
|
|
18
|
+
* Why a failing id must name its FILE, or nothing is re-run: a re-run of a
|
|
19
|
+
* subset that silently left out one failing test would read as a pass on the
|
|
20
|
+
* rest. A failure set any of whose ids names no test file (a node:test TAP id
|
|
21
|
+
* carries only the test's description) is not answered by a re-run at all.
|
|
22
|
+
*
|
|
23
|
+
* Decisions (reasoning: docs/daemon/history-verify.md, verify/failing-test-rerun/):
|
|
24
|
+
* - FAILURE-SET CEILING: DEFAULT_RERUN_MAX_FAILURES (5,
|
|
25
|
+
* gate-config/verification-manifest.ts), overridable per product with
|
|
26
|
+
* `rerunMaxFailures`. A flake is one or two tests; a red of dozens is a
|
|
27
|
+
* change, and re-running it file by file buys nothing a whole run does not.
|
|
28
|
+
* - RETRY COUNT: RERUN_RETRY_ATTEMPTS (2). One retry catches most order and
|
|
29
|
+
* timing flakes; a second separates "flaky" from "fails half the time" at
|
|
30
|
+
* the cost of one more small run. Fixed, not configurable: the count is what
|
|
31
|
+
* makes "passed on retry" a uniform claim across products.
|
|
32
|
+
*
|
|
33
|
+
* @module verify/failing-test-rerun/rerun-command
|
|
34
|
+
*/
|
|
35
|
+
import { parseFailingTests } from '../deterministic-gate/verification-failure-parser.js';
|
|
36
|
+
import { RERUN_FILES_PLACEHOLDER } from '../gate-config/verification-manifest.js';
|
|
37
|
+
/** How many times a failing set is re-run on the same commit before it is charged. */
|
|
38
|
+
export const RERUN_RETRY_ATTEMPTS = 2;
|
|
39
|
+
/** A test file path: a token ending in a JS/TS source extension. */
|
|
40
|
+
const TEST_FILE_PATH = /^\S+\.[cm]?[jt]sx?$/;
|
|
41
|
+
/** A vitest workspace project label preceding the file: `|web| tests/a.test.ts > ...`. */
|
|
42
|
+
const PROJECT_LABEL = /^\|[^|]+\|\s+/;
|
|
43
|
+
/** The daemon's own checkout directories: `<state>/verification-checkout/<key>/`. */
|
|
44
|
+
const DAEMON_CHECKOUT_PREFIX = /^(?:\/[^\s/]+)*\/verification-(?:checkout|baseline-wt)\/[^\s/]+\//;
|
|
45
|
+
/**
|
|
46
|
+
* The checkout-relative test file a failing-test id names, or null when it
|
|
47
|
+
* names none. Ids are `<file> > <suite path> > <test>` (vitest's reporters,
|
|
48
|
+
* verification-failure-parser.ts) or a bare `<file>` (a file that failed to
|
|
49
|
+
* load). An absolute path is made relative to the run's root (`roots`: the
|
|
50
|
+
* `(cwd: ...)` a gate log opens with) or to a daemon checkout directory; an
|
|
51
|
+
* absolute path under neither is not one this checkout can name. Pure.
|
|
52
|
+
*/
|
|
53
|
+
export function testFileOfId(id, roots) {
|
|
54
|
+
const head = (id.split(' > ')[0] ?? '').replace(PROJECT_LABEL, '').trim();
|
|
55
|
+
if (!TEST_FILE_PATH.test(head))
|
|
56
|
+
return null;
|
|
57
|
+
if (!head.startsWith('/'))
|
|
58
|
+
return head.replace(/^\.\//, '');
|
|
59
|
+
for (const root of roots) {
|
|
60
|
+
const prefix = `${root.replace(/\/+$/, '')}/`;
|
|
61
|
+
if (prefix.length > 1 && head.startsWith(prefix))
|
|
62
|
+
return head.slice(prefix.length);
|
|
63
|
+
}
|
|
64
|
+
const underCheckout = head.replace(DAEMON_CHECKOUT_PREFIX, '');
|
|
65
|
+
return underCheckout !== head ? underCheckout : null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The distinct test files a failure set names, sorted, or null when ANY id names
|
|
69
|
+
* none (module doc: a subset re-run must never leave a failing test out). Pure.
|
|
70
|
+
*/
|
|
71
|
+
export function testFilesOf(ids, roots) {
|
|
72
|
+
const files = new Set();
|
|
73
|
+
for (const id of ids) {
|
|
74
|
+
const file = testFileOfId(id, roots);
|
|
75
|
+
if (file === null)
|
|
76
|
+
return null;
|
|
77
|
+
files.add(file);
|
|
78
|
+
}
|
|
79
|
+
return [...files].sort();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A failing id with its file made checkout-relative, so the same test failing in
|
|
83
|
+
* two checkouts (the HEAD checkout and the base checkout, or two re-runs) yields
|
|
84
|
+
* one id. An id that names no file is returned unchanged. Pure.
|
|
85
|
+
*/
|
|
86
|
+
export function normalizeTestId(id, roots) {
|
|
87
|
+
const parts = id.split(' > ');
|
|
88
|
+
const file = testFileOfId(id, roots);
|
|
89
|
+
if (file === null)
|
|
90
|
+
return id;
|
|
91
|
+
const label = PROJECT_LABEL.exec(parts[0] ?? '')?.[0] ?? '';
|
|
92
|
+
return [`${label}${file}`, ...parts.slice(1)].join(' > ');
|
|
93
|
+
}
|
|
94
|
+
/** POSIX single-quote one shell word. Pure. */
|
|
95
|
+
function shellQuote(word) {
|
|
96
|
+
return /^[A-Za-z0-9_./@%+=:,-]+$/.test(word) ? word : `'${word.replace(/'/g, `'\\''`)}'`;
|
|
97
|
+
}
|
|
98
|
+
/** The declared re-run command with the files substituted for every `{files}`. Pure. */
|
|
99
|
+
export function renderRerunCommand(template, files) {
|
|
100
|
+
return template.split(RERUN_FILES_PLACEHOLDER).join(files.map(shellQuote).join(' '));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Whether a failed run's failing tests are answered by the declared re-run
|
|
104
|
+
* command, and the command that does it. Not when the product declares none,
|
|
105
|
+
* when the run named no failing test, when it named more than the ceiling, or
|
|
106
|
+
* when any failing id names no test file. Pure.
|
|
107
|
+
*/
|
|
108
|
+
export function planRerun(logText, rerun) {
|
|
109
|
+
if (!rerun)
|
|
110
|
+
return { kind: 'not_rerun', reason: 'the product declares no rerunCommand' };
|
|
111
|
+
const ids = [...parseFailingTests(logText)].sort();
|
|
112
|
+
if (ids.length === 0)
|
|
113
|
+
return { kind: 'not_rerun', reason: 'the run named no failing test' };
|
|
114
|
+
if (ids.length > rerun.maxFailures) {
|
|
115
|
+
return { kind: 'not_rerun', reason: `the run failed ${ids.length} tests, more than the ${rerun.maxFailures} a re-run answers` };
|
|
116
|
+
}
|
|
117
|
+
const files = testFilesOf(ids, logRoots(logText));
|
|
118
|
+
if (files === null)
|
|
119
|
+
return { kind: 'not_rerun', reason: 'a failing test id names no test file' };
|
|
120
|
+
return { kind: 'rerun', ids, files, command: renderRerunCommand(rerun.command, files) };
|
|
121
|
+
}
|
|
122
|
+
/** The `(cwd: <path>)` roots a deterministic run's log opens with. Pure. */
|
|
123
|
+
export function logRoots(logText) {
|
|
124
|
+
const roots = [];
|
|
125
|
+
for (const line of (typeof logText === 'string' ? logText : '').split(/\r?\n/)) {
|
|
126
|
+
const match = /^\(cwd: (.+)\)$/.exec(line.trim());
|
|
127
|
+
if (match?.[1])
|
|
128
|
+
roots.push(match[1].trim());
|
|
129
|
+
}
|
|
130
|
+
return roots;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=rerun-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rerun-command.js","sourceRoot":"","sources":["../../../src/verify/failing-test-rerun/rerun-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { PendingVerification } from '../../queries/verification/verification.js';
|
|
2
|
+
import type { StrategyResult } from '../deterministic-gate/verification-deterministic.js';
|
|
3
|
+
import type { VerificationDeps } from '../engine/verification-deps.js';
|
|
4
|
+
/** The failing tests a delivery's last verdict charged, to be re-checked at its next commit. */
|
|
5
|
+
export interface ReworkRecheckRecord {
|
|
6
|
+
deliveryId: string;
|
|
7
|
+
/** The commit they failed on. */
|
|
8
|
+
failedAtSha: string;
|
|
9
|
+
tests: string[];
|
|
10
|
+
files: string[];
|
|
11
|
+
recordedAt: string;
|
|
12
|
+
}
|
|
13
|
+
/** Where re-check records are kept. Production: one JSON file per delivery under the state dir. */
|
|
14
|
+
export interface ReworkRecheckStore {
|
|
15
|
+
read: (deliveryId: string) => ReworkRecheckRecord | null;
|
|
16
|
+
write: (record: ReworkRecheckRecord) => void;
|
|
17
|
+
clear: (deliveryId: string) => void;
|
|
18
|
+
}
|
|
19
|
+
/** Validate a record read back from disk; null when it is not one. Pure. */
|
|
20
|
+
export declare function parseReworkRecheckRecord(value: unknown): ReworkRecheckRecord | null;
|
|
21
|
+
/** The file-backed store (module doc). Best-effort: a write or clear that fails is logged, never thrown. */
|
|
22
|
+
export declare const fileReworkRecheckStore: ReworkRecheckStore;
|
|
23
|
+
/**
|
|
24
|
+
* Keep the delivery's re-check record in step with the verdict just rendered:
|
|
25
|
+
* a FAILED verdict at a known commit whose charged tests the declared re-run
|
|
26
|
+
* command can name is recorded; a pass, or a failure it cannot name (a lint
|
|
27
|
+
* red, a large set, no declaration), removes the record. A run that rendered
|
|
28
|
+
* no verdict changes nothing. The log is read only when a re-run command is declared.
|
|
29
|
+
*/
|
|
30
|
+
export declare function noteReworkRecheck(v: PendingVerification, result: StrategyResult, readLogText: () => string, store: ReworkRecheckStore, now?: Date): void;
|
|
31
|
+
/** The record a failed verdict leaves, or null when it charges nothing the re-run command can name. Pure. */
|
|
32
|
+
export declare function recheckRecordOf(v: PendingVerification, result: StrategyResult, logText: string, now: Date): ReworkRecheckRecord | null;
|
|
33
|
+
/** The deps the re-check reaches reality through. */
|
|
34
|
+
export type ReworkRecheckDeps = Pick<VerificationDeps, 'reworkRecheck' | 'resolveFocusHeadSha' | 'runFailingTestRerun' | 'fileFlakyTestFinding'>;
|
|
35
|
+
/**
|
|
36
|
+
* Re-check the delivery's previously failing tests at the focus HEAD (module
|
|
37
|
+
* doc): the still-red result -- the verdict for that commit, no whole gate run
|
|
38
|
+
* -- or null, when the whole gate must run.
|
|
39
|
+
*/
|
|
40
|
+
export declare function recheckPreviouslyFailing(v: PendingVerification, deps: ReworkRecheckDeps): Promise<StrategyResult | null>;
|
|
41
|
+
//# sourceMappingURL=rework-recheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rework-recheck.d.ts","sourceRoot":"","sources":["../../../src/verify/failing-test-rerun/rework-recheck.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAC;AAC1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAOvE,gGAAgG;AAChG,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,mGAAmG;AACnG,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,mBAAmB,GAAG,IAAI,CAAC;IACzD,KAAK,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC7C,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAMD,4EAA4E;AAC5E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAMnF;AAED,4GAA4G;AAC5G,eAAO,MAAM,sBAAsB,EAAE,kBA0BpC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,mBAAmB,EACtB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,MAAM,EACzB,KAAK,EAAE,kBAAkB,EACzB,GAAG,GAAE,IAAiB,GACrB,IAAI,CAMN;AAED,6GAA6G;AAC7G,wBAAgB,eAAe,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,mBAAmB,GAAG,IAAI,CAgBtI;AAED,qDAAqD;AACrD,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,eAAe,GAAG,qBAAqB,GAAG,qBAAqB,GAAG,sBAAsB,CAAC,CAAC;AAEjJ;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAsB9H"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/verify/failing-test-rerun/rework-recheck.test.ts
|
|
3
|
+
// PINNED-BY-END
|
|
4
|
+
/**
|
|
5
|
+
* After a rework commit, re-check the tests that failed first: a still-red
|
|
6
|
+
* rework goes back to coding without a whole-gate run.
|
|
7
|
+
*
|
|
8
|
+
* A delivery charged with N failing tests comes back with a commit that claims
|
|
9
|
+
* to fix them. The cheapest question that can refute the claim is "do those
|
|
10
|
+
* tests still fail?" -- and the whole gate is the most expensive way to ask it.
|
|
11
|
+
* So when the delivery's last verdict charged a small set of failing tests the
|
|
12
|
+
* product's declared re-run command can name (rerun-command.ts planRerun), the
|
|
13
|
+
* set is RECORDED against the delivery (noteReworkRecheck), and the next
|
|
14
|
+
* dispatch at a NEW commit re-runs those files first (recheckPreviouslyFailing):
|
|
15
|
+
* - any attempt passes => nothing is decided here; the whole gate runs, as
|
|
16
|
+
* before (the re-check refutes, it never vouches). A failed attempt followed
|
|
17
|
+
* by a pass is a flake and is filed like one.
|
|
18
|
+
* - every attempt (1 + RERUN_RETRY_ATTEMPTS) fails => that result IS the
|
|
19
|
+
* verdict for the commit: failed, attributed and routed to rework like any
|
|
20
|
+
* gate red, with no whole-gate run.
|
|
21
|
+
* - a run that renders no verdict about the commit (no checkout, a timeout,
|
|
22
|
+
* no rerunCommand declared there) => the whole gate runs.
|
|
23
|
+
*
|
|
24
|
+
* The record is keyed by delivery and kept under the daemon state dir, beside
|
|
25
|
+
* the per-commit verdict records: it outlives the gate_state clears a rework
|
|
26
|
+
* cycle makes, and a pass removes it. A record whose commit is the HEAD being
|
|
27
|
+
* judged asks nothing (that commit already has its verdict).
|
|
28
|
+
*
|
|
29
|
+
* @module verify/failing-test-rerun/rework-recheck
|
|
30
|
+
*/
|
|
31
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
32
|
+
import { resolve } from 'node:path';
|
|
33
|
+
import { resolveGlobalStateDir } from '../../daemon-state/daemon-process.js';
|
|
34
|
+
import { logRoots, planRerun, RERUN_RETRY_ATTEMPTS, testFilesOf } from './rerun-command.js';
|
|
35
|
+
import { rerunUntilPass } from './failing-test-retry.js';
|
|
36
|
+
import { createLogger } from '../../log/daemon-log.js';
|
|
37
|
+
const log = createLogger({ module: 'verification' });
|
|
38
|
+
const recheckDir = () => resolve(resolveGlobalStateDir(), 'verification-rework-recheck');
|
|
39
|
+
const recheckPath = (deliveryId) => resolve(recheckDir(), `${deliveryId.replace(/[^a-zA-Z0-9._-]/g, '_')}.json`);
|
|
40
|
+
const isStringArray = (value) => Array.isArray(value) && value.every((item) => typeof item === 'string');
|
|
41
|
+
/** Validate a record read back from disk; null when it is not one. Pure. */
|
|
42
|
+
export function parseReworkRecheckRecord(value) {
|
|
43
|
+
if (value === null || typeof value !== 'object')
|
|
44
|
+
return null;
|
|
45
|
+
const { deliveryId, failedAtSha, tests, files, recordedAt } = value;
|
|
46
|
+
if (typeof deliveryId !== 'string' || typeof failedAtSha !== 'string' || failedAtSha === '' || typeof recordedAt !== 'string')
|
|
47
|
+
return null;
|
|
48
|
+
if (!isStringArray(tests) || !isStringArray(files) || files.length === 0)
|
|
49
|
+
return null;
|
|
50
|
+
return { deliveryId, failedAtSha, tests: [...tests], files: [...files], recordedAt };
|
|
51
|
+
}
|
|
52
|
+
/** The file-backed store (module doc). Best-effort: a write or clear that fails is logged, never thrown. */
|
|
53
|
+
export const fileReworkRecheckStore = {
|
|
54
|
+
read: (deliveryId) => {
|
|
55
|
+
const path = recheckPath(deliveryId);
|
|
56
|
+
if (!existsSync(path))
|
|
57
|
+
return null;
|
|
58
|
+
try {
|
|
59
|
+
const record = parseReworkRecheckRecord(JSON.parse(readFileSync(path, 'utf8')));
|
|
60
|
+
return record?.deliveryId === deliveryId ? record : null;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
write: (record) => {
|
|
67
|
+
try {
|
|
68
|
+
mkdirSync(recheckDir(), { recursive: true });
|
|
69
|
+
writeFileSync(recheckPath(record.deliveryId), JSON.stringify(record, null, 2), { mode: 0o600 });
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
log.warn(`failed to write the rework re-check record for delivery ${record.deliveryId}:`, err.message);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
clear: (deliveryId) => {
|
|
76
|
+
try {
|
|
77
|
+
rmSync(recheckPath(deliveryId), { force: true });
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
log.warn(`failed to clear the rework re-check record for delivery ${deliveryId}:`, err.message);
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Keep the delivery's re-check record in step with the verdict just rendered:
|
|
86
|
+
* a FAILED verdict at a known commit whose charged tests the declared re-run
|
|
87
|
+
* command can name is recorded; a pass, or a failure it cannot name (a lint
|
|
88
|
+
* red, a large set, no declaration), removes the record. A run that rendered
|
|
89
|
+
* no verdict changes nothing. The log is read only when a re-run command is declared.
|
|
90
|
+
*/
|
|
91
|
+
export function noteReworkRecheck(v, result, readLogText, store, now = new Date()) {
|
|
92
|
+
if (result.outcome === 'passed')
|
|
93
|
+
return store.clear(v.deliveryId);
|
|
94
|
+
if (result.outcome !== 'failed')
|
|
95
|
+
return;
|
|
96
|
+
const record = result.appliedConfig?.rerun ? recheckRecordOf(v, result, readLogText(), now) : null;
|
|
97
|
+
if (record)
|
|
98
|
+
store.write(record);
|
|
99
|
+
else
|
|
100
|
+
store.clear(v.deliveryId);
|
|
101
|
+
}
|
|
102
|
+
/** The record a failed verdict leaves, or null when it charges nothing the re-run command can name. Pure. */
|
|
103
|
+
export function recheckRecordOf(v, result, logText, now) {
|
|
104
|
+
const sha = result.verifiedSha;
|
|
105
|
+
const rerun = result.appliedConfig?.rerun;
|
|
106
|
+
if (!sha || !rerun || result.timedOut)
|
|
107
|
+
return null;
|
|
108
|
+
// Charged tests: attribution's NEW failures when it ran, else every failing test the run named.
|
|
109
|
+
const charged = result.newFailures;
|
|
110
|
+
if (charged === undefined) {
|
|
111
|
+
const plan = planRerun(logText, rerun);
|
|
112
|
+
return plan.kind === 'rerun'
|
|
113
|
+
? { deliveryId: v.deliveryId, failedAtSha: sha, tests: plan.ids, files: plan.files, recordedAt: now.toISOString() }
|
|
114
|
+
: null;
|
|
115
|
+
}
|
|
116
|
+
if (charged.length === 0 || charged.length > rerun.maxFailures)
|
|
117
|
+
return null;
|
|
118
|
+
const files = testFilesOf(charged, logRoots(logText));
|
|
119
|
+
if (files === null)
|
|
120
|
+
return null;
|
|
121
|
+
return { deliveryId: v.deliveryId, failedAtSha: sha, tests: [...charged].sort(), files, recordedAt: now.toISOString() };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Re-check the delivery's previously failing tests at the focus HEAD (module
|
|
125
|
+
* doc): the still-red result -- the verdict for that commit, no whole gate run
|
|
126
|
+
* -- or null, when the whole gate must run.
|
|
127
|
+
*/
|
|
128
|
+
export async function recheckPreviouslyFailing(v, deps) {
|
|
129
|
+
const record = deps.reworkRecheck.read(v.deliveryId);
|
|
130
|
+
if (!record || !v.focusId || !v.defaultOnSource)
|
|
131
|
+
return null;
|
|
132
|
+
const head = deps.resolveFocusHeadSha(v.focusId);
|
|
133
|
+
if (!head || head === record.failedAtSha)
|
|
134
|
+
return null;
|
|
135
|
+
const reds = [];
|
|
136
|
+
const attempts = 1 + RERUN_RETRY_ATTEMPTS;
|
|
137
|
+
const passedOn = await rerunUntilPass(deps.runFailingTestRerun, v, record.files, head, attempts, (run) => reds.push(run));
|
|
138
|
+
if (passedOn === null)
|
|
139
|
+
return null;
|
|
140
|
+
if (passedOn > 0) {
|
|
141
|
+
if (reds.length > 0)
|
|
142
|
+
await fileRecheckFlake(v, record, head, passedOn, deps);
|
|
143
|
+
log.info(`[verification] delivery ${v.deliveryId}: the ${record.files.length} previously failing test file(s) pass at ` +
|
|
144
|
+
`${head.slice(0, 8)} -- the whole gate runs`);
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const red = reds.at(-1);
|
|
148
|
+
if (!red)
|
|
149
|
+
return null;
|
|
150
|
+
return {
|
|
151
|
+
...red,
|
|
152
|
+
rationale: `the ${record.tests.length} previously failing test(s) (${record.files.join(', ')}) still fail at ${head.slice(0, 8)} on the ` +
|
|
153
|
+
`declared re-run command (${attempts} run(s)) -- returned to rework without a whole-gate run`,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/** A re-check that failed and then passed is a flake: filed best-effort (the whole gate runs either way). */
|
|
157
|
+
async function fileRecheckFlake(v, record, head, passedOnAttempt, deps) {
|
|
158
|
+
const finding = {
|
|
159
|
+
productId: v.productId, focusId: v.focusId, deliveryId: v.deliveryId, deliveryName: v.deliveryName,
|
|
160
|
+
sha: head, tests: record.tests, files: record.files, passedOnAttempt, logPath: null, origin: 'rework_recheck',
|
|
161
|
+
};
|
|
162
|
+
try {
|
|
163
|
+
await deps.fileFlakyTestFinding(v, finding);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
log.warn(`[verification] delivery ${v.deliveryId}: the flaky-test finding from the rework re-check could not be filed: ${err.message}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=rework-recheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rework-recheck.js","sourceRoot":"","sources":["../../../src/verify/failing-test-rerun/rework-recheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-config.d.ts","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-config.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEtF,OAAO,
|
|
1
|
+
{"version":3,"file":"verification-config.d.ts","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
-
// Pinned by:
|
|
2
|
+
// Pinned by: 25 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/verify/gate-config/verification-config.ts
|
|
3
3
|
// PINNED-BY-END
|
|
4
4
|
import { loadEnvConfig, productLabel } from '@telora/daemon-core';
|
|
5
5
|
import { resolveVerificationCarriage } from '../../config/config.js';
|
|
6
|
-
import { resolveVerifyManifestPath, VERIFY_MANIFEST_FILENAME, } from './verification-manifest.js';
|
|
6
|
+
import { DEFAULT_RERUN_MAX_FAILURES, resolveVerifyManifestPath, VERIFY_MANIFEST_FILENAME, } from './verification-manifest.js';
|
|
7
7
|
/** Default timeout for the default-on deterministic run: 30 min (full build+test sweep). */
|
|
8
8
|
export const DEFAULT_VERIFY_TIMEOUT_MS = 30 * 60 * 1000;
|
|
9
9
|
/** Default max concurrent daemon-side verification runs. */
|
|
@@ -134,6 +134,7 @@ export function resolveAppliedVerificationConfig(source, runPath, env, readManif
|
|
|
134
134
|
const own = readManifest(path);
|
|
135
135
|
if (own !== undefined) {
|
|
136
136
|
read.manifestPath = verifiedManifestPath;
|
|
137
|
+
read.manifest = own;
|
|
137
138
|
return own;
|
|
138
139
|
}
|
|
139
140
|
if (!source.repoPath || resolveVerifyManifestPath(source.repoPath) === verifiedManifestPath)
|
|
@@ -142,6 +143,7 @@ export function resolveAppliedVerificationConfig(source, runPath, env, readManif
|
|
|
142
143
|
if (fallback !== undefined) {
|
|
143
144
|
read.manifestPath = resolveVerifyManifestPath(source.repoPath);
|
|
144
145
|
read.fallback = true;
|
|
146
|
+
read.manifest = fallback;
|
|
145
147
|
}
|
|
146
148
|
return fallback;
|
|
147
149
|
};
|
|
@@ -159,8 +161,20 @@ export function resolveAppliedVerificationConfig(source, runPath, env, readManif
|
|
|
159
161
|
verifiedManifestPath,
|
|
160
162
|
...(read.manifestPath !== undefined ? { manifestPath: read.manifestPath } : {}),
|
|
161
163
|
...(read.fallback ? { manifestFallback: true } : {}),
|
|
164
|
+
...declaredRerunOf(read.manifest),
|
|
162
165
|
};
|
|
163
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* The re-run declaration a manifest carries, as an applied config records it:
|
|
169
|
+
* its command and its failure-set ceiling (the manifest's, else the default).
|
|
170
|
+
* Read from the same manifest the command and timeout were, so a branch's
|
|
171
|
+
* declaration applies to the runs of that branch. Pure.
|
|
172
|
+
*/
|
|
173
|
+
function declaredRerunOf(manifest) {
|
|
174
|
+
if (manifest?.rerunCommand === undefined)
|
|
175
|
+
return {};
|
|
176
|
+
return { rerun: { command: manifest.rerunCommand, maxFailures: manifest.rerunMaxFailures ?? DEFAULT_RERUN_MAX_FAILURES } };
|
|
177
|
+
}
|
|
164
178
|
/**
|
|
165
179
|
* Derive the verification posture for one (product-scoped) config.
|
|
166
180
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-config.js","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-config.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,4HAA4H;AAC5H,gBAAgB;AAqDhB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EACL,yBAAyB,EACzB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"verification-config.js","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,30 @@ export interface VerifyManifest {
|
|
|
29
29
|
* declares none is unaffected. Rationale: docs/runbook-verify-gate-command.md.
|
|
30
30
|
*/
|
|
31
31
|
commitCheck?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Optional command that runs NAMED test files, with the literal placeholder
|
|
34
|
+
* `{files}` where the daemon substitutes them (shell-quoted, space-separated),
|
|
35
|
+
* e.g. `npx vitest run {files}`. Run at the checkout root. Declared, the daemon
|
|
36
|
+
* answers a small gate failure by re-running only the failing files: a
|
|
37
|
+
* same-commit retry before the red is charged, a re-check after a rework
|
|
38
|
+
* commit, and base attribution of those files alone
|
|
39
|
+
* (verify/failing-test-rerun/). Absent => every one of those questions keeps
|
|
40
|
+
* costing whole-gate runs, exactly as before. The daemon never derives one by
|
|
41
|
+
* guessing paths: the product declares it. Rationale:
|
|
42
|
+
* docs/runbook-verify-gate-command.md, "The re-run command".
|
|
43
|
+
*/
|
|
44
|
+
rerunCommand?: string;
|
|
45
|
+
/**
|
|
46
|
+
* The most failing tests a run may report and still be answered through
|
|
47
|
+
* `rerunCommand` (a positive integer). Omitted => DEFAULT_RERUN_MAX_FAILURES.
|
|
48
|
+
* A larger red is not a flake: it is attributed and charged exactly as before.
|
|
49
|
+
*/
|
|
50
|
+
rerunMaxFailures?: number;
|
|
32
51
|
}
|
|
52
|
+
/** The placeholder a `rerunCommand` names the failing test files with. */
|
|
53
|
+
export declare const RERUN_FILES_PLACEHOLDER = "{files}";
|
|
54
|
+
/** The failure-set ceiling a manifest that declares a `rerunCommand` but no `rerunMaxFailures` gets. */
|
|
55
|
+
export declare const DEFAULT_RERUN_MAX_FAILURES = 5;
|
|
33
56
|
/**
|
|
34
57
|
* The file-system seam the manifest is read through (existence + read):
|
|
35
58
|
* readVerifyManifestFrom takes it as a required parameter, so a reader over the
|
|
@@ -56,7 +79,9 @@ export declare function resolveVerifyManifestPath(repoPath: string): string;
|
|
|
56
79
|
* @throws Error naming the file path when the manifest exists but is
|
|
57
80
|
* unreadable / not JSON / not an object / carries no usable `command`
|
|
58
81
|
* / carries a non-positive `timeoutMs` or `maxConcurrent` / carries a
|
|
59
|
-
* `commitCheck` that is not a non-empty string
|
|
82
|
+
* `commitCheck` that is not a non-empty string / carries a
|
|
83
|
+
* `rerunCommand` without the `{files}` placeholder or a non-integer
|
|
84
|
+
* `rerunMaxFailures`.
|
|
60
85
|
*/
|
|
61
86
|
export declare function readVerifyManifestFrom(repoPath: string | undefined, fs: VerifyManifestFs): VerifyManifest | undefined;
|
|
62
87
|
/** Read the repo's verification manifest from the working tree on disk (see readVerifyManifestFrom). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-manifest.d.ts","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-manifest.ts"],"names":[],"mappings":"AAgFA;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"verification-manifest.d.ts","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-manifest.ts"],"names":[],"mappings":"AAgFA;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,0EAA0E;AAC1E,eAAO,MAAM,uBAAuB,YAAY,CAAC;AAEjD,wGAAwG;AACxG,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAQD,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,cAAc,GAAG,SAAS,CAAC;AAEhG,0DAA0D;AAC1D,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AAoED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAiDrH;AAED,wGAAwG;AACxG,eAAO,MAAM,kBAAkB,EAAE,oBAAoF,CAAC;AAEtH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,GAAG,SAAS,CAOzG"}
|
|
@@ -84,6 +84,10 @@ import { resolve } from 'node:path';
|
|
|
84
84
|
* trackable (`git check-ignore -v telora.verify.json` finds no match).
|
|
85
85
|
*/
|
|
86
86
|
export const VERIFY_MANIFEST_FILENAME = 'telora.verify.json';
|
|
87
|
+
/** The placeholder a `rerunCommand` names the failing test files with. */
|
|
88
|
+
export const RERUN_FILES_PLACEHOLDER = '{files}';
|
|
89
|
+
/** The failure-set ceiling a manifest that declares a `rerunCommand` but no `rerunMaxFailures` gets. */
|
|
90
|
+
export const DEFAULT_RERUN_MAX_FAILURES = 5;
|
|
87
91
|
/** The working tree on disk, as readVerifyManifest reads it. */
|
|
88
92
|
const workingTreeFs = {
|
|
89
93
|
exists: (path) => existsSync(path),
|
|
@@ -129,6 +133,28 @@ function optionalCommand(raw, key, path) {
|
|
|
129
133
|
}
|
|
130
134
|
return value;
|
|
131
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Validate the optional re-run declaration. A `rerunCommand` that cannot name
|
|
138
|
+
* the files (no `{files}` placeholder) or a `rerunMaxFailures` that is not a
|
|
139
|
+
* positive integer is malformed (loud), like every other present-but-wrong key.
|
|
140
|
+
*/
|
|
141
|
+
function optionalRerun(raw, path) {
|
|
142
|
+
const rerunCommand = optionalCommand(raw, 'rerunCommand', path);
|
|
143
|
+
if (rerunCommand !== undefined && !rerunCommand.includes(RERUN_FILES_PLACEHOLDER)) {
|
|
144
|
+
manifestError(path, `"rerunCommand" must name the test files with the placeholder ${RERUN_FILES_PLACEHOLDER} (got ${JSON.stringify(rerunCommand)})`);
|
|
145
|
+
}
|
|
146
|
+
const rerunMaxFailures = raw.rerunMaxFailures;
|
|
147
|
+
if (rerunMaxFailures !== undefined && (typeof rerunMaxFailures !== 'number' || !Number.isInteger(rerunMaxFailures) || rerunMaxFailures <= 0)) {
|
|
148
|
+
manifestError(path, `"rerunMaxFailures" must be an integer > 0 (got ${JSON.stringify(rerunMaxFailures)})`);
|
|
149
|
+
}
|
|
150
|
+
if (rerunMaxFailures !== undefined && rerunCommand === undefined) {
|
|
151
|
+
manifestError(path, `"rerunMaxFailures" is set but no "rerunCommand" is declared -- it bounds nothing without one`);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
...(rerunCommand !== undefined ? { rerunCommand } : {}),
|
|
155
|
+
...(rerunMaxFailures !== undefined ? { rerunMaxFailures } : {}),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
132
158
|
/**
|
|
133
159
|
* Read the repo's verification manifest through `fs`.
|
|
134
160
|
*
|
|
@@ -139,7 +165,9 @@ function optionalCommand(raw, key, path) {
|
|
|
139
165
|
* @throws Error naming the file path when the manifest exists but is
|
|
140
166
|
* unreadable / not JSON / not an object / carries no usable `command`
|
|
141
167
|
* / carries a non-positive `timeoutMs` or `maxConcurrent` / carries a
|
|
142
|
-
* `commitCheck` that is not a non-empty string
|
|
168
|
+
* `commitCheck` that is not a non-empty string / carries a
|
|
169
|
+
* `rerunCommand` without the `{files}` placeholder or a non-integer
|
|
170
|
+
* `rerunMaxFailures`.
|
|
143
171
|
*/
|
|
144
172
|
export function readVerifyManifestFrom(repoPath, fs) {
|
|
145
173
|
if (!repoPath)
|
|
@@ -177,11 +205,13 @@ export function readVerifyManifestFrom(repoPath, fs) {
|
|
|
177
205
|
const timeoutMs = optionalPositiveNumber(raw, 'timeoutMs', path);
|
|
178
206
|
const maxConcurrent = optionalPositiveNumber(raw, 'maxConcurrent', path);
|
|
179
207
|
const commitCheck = optionalCommand(raw, 'commitCheck', path);
|
|
208
|
+
const rerun = optionalRerun(raw, path);
|
|
180
209
|
return {
|
|
181
210
|
command,
|
|
182
211
|
...(timeoutMs !== undefined ? { timeoutMs } : {}),
|
|
183
212
|
...(maxConcurrent !== undefined ? { maxConcurrent } : {}),
|
|
184
213
|
...(commitCheck !== undefined ? { commitCheck } : {}),
|
|
214
|
+
...rerun,
|
|
185
215
|
};
|
|
186
216
|
}
|
|
187
217
|
/** Read the repo's verification manifest from the working tree on disk (see readVerifyManifestFrom). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-manifest.js","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-manifest.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,gGAAgG;AAChG,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,mFAAmF;AACnF,oEAAoE;AACpE,4EAA4E;AAC5E,6EAA6E;AAC7E,sEAAsE;AACtE,yFAAyF;AACzF,2EAA2E;AAC3E,2EAA2E;AAC3E,uEAAuE;AACvE,oFAAoF;AACpF,0EAA0E;AAC1E,yEAAyE;AACzE,mFAAmF;AACnF,8EAA8E;AAC9E,uFAAuF;AACvF,gBAAgB;AAEhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"verification-manifest.js","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-manifest.ts"],"names":[],"mappings":"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"}
|