@telora/daemon 0.24.16 → 0.24.25
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 +7 -3
- package/dist/ci/candidate-failure-record.d.ts +104 -0
- package/dist/ci/candidate-failure-record.d.ts.map +1 -0
- package/dist/ci/candidate-failure-record.js +135 -0
- package/dist/ci/candidate-failure-record.js.map +1 -0
- package/dist/ci/candidate-ref.d.ts.map +1 -1
- package/dist/ci/candidate-ref.js +10 -3
- package/dist/ci/candidate-ref.js.map +1 -1
- package/dist/ci/ci-status-git.d.ts.map +1 -1
- package/dist/ci/ci-status-git.js +1 -0
- package/dist/ci/ci-status-git.js.map +1 -1
- package/dist/ci/ci-status.d.ts.map +1 -1
- package/dist/ci/ci-status.js +1 -0
- package/dist/ci/ci-status.js.map +1 -1
- package/dist/ci/gate-ref.d.ts +10 -1
- package/dist/ci/gate-ref.d.ts.map +1 -1
- package/dist/ci/gate-ref.js +11 -4
- package/dist/ci/gate-ref.js.map +1 -1
- package/dist/ci/product-ci-repo.d.ts.map +1 -1
- package/dist/ci/product-ci-repo.js +3 -2
- package/dist/ci/product-ci-repo.js.map +1 -1
- package/dist/completion/review-exit/review-exit-phase.js +7 -3
- package/dist/completion/review-exit/review-exit-phase.js.map +1 -1
- package/dist/completion/review-exit/review-exit-rehoming.d.ts +27 -3
- package/dist/completion/review-exit/review-exit-rehoming.d.ts.map +1 -1
- package/dist/completion/review-exit/review-exit-rehoming.js +29 -5
- package/dist/completion/review-exit/review-exit-rehoming.js.map +1 -1
- package/dist/composition/execution-merge-context.d.ts +13 -0
- package/dist/composition/execution-merge-context.d.ts.map +1 -1
- package/dist/composition/execution-merge-context.js +76 -3
- package/dist/composition/execution-merge-context.js.map +1 -1
- package/dist/composition/focus-activity-live-sources.d.ts.map +1 -1
- package/dist/composition/focus-activity-live-sources.js +1 -0
- package/dist/composition/focus-activity-live-sources.js.map +1 -1
- package/dist/composition/runtime-heartbeat-context.d.ts +11 -0
- package/dist/composition/runtime-heartbeat-context.d.ts.map +1 -1
- package/dist/composition/runtime-heartbeat-context.js +26 -1
- package/dist/composition/runtime-heartbeat-context.js.map +1 -1
- package/dist/composition/team-liveness-phase-sources.d.ts.map +1 -1
- package/dist/composition/team-liveness-phase-sources.js +1 -0
- package/dist/composition/team-liveness-phase-sources.js.map +1 -1
- package/dist/composition/verification-context.d.ts.map +1 -1
- package/dist/composition/verification-context.js +34 -4
- package/dist/composition/verification-context.js.map +1 -1
- package/dist/focus/control-state.d.ts +12 -6
- package/dist/focus/control-state.d.ts.map +1 -1
- package/dist/focus/control-state.js +16 -9
- package/dist/focus/control-state.js.map +1 -1
- package/dist/focus/heartbeat-metadata.d.ts +5 -0
- package/dist/focus/heartbeat-metadata.d.ts.map +1 -1
- package/dist/focus/heartbeat-metadata.js +12 -0
- package/dist/focus/heartbeat-metadata.js.map +1 -1
- package/dist/focus/heartbeat.d.ts.map +1 -1
- package/dist/focus/heartbeat.js +1 -0
- package/dist/focus/heartbeat.js.map +1 -1
- package/dist/focus/host-pressure.d.ts +77 -0
- package/dist/focus/host-pressure.d.ts.map +1 -0
- package/dist/focus/host-pressure.js +83 -0
- package/dist/focus/host-pressure.js.map +1 -0
- package/dist/focus-stage-lifecycle/index.js +1 -1
- package/dist/focus-stage-lifecycle/index.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +17 -7
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +58 -28
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/git/types.js +1 -1
- package/dist/merge/candidate-ci-failures.d.ts +72 -0
- package/dist/merge/candidate-ci-failures.d.ts.map +1 -0
- package/dist/merge/candidate-ci-failures.js +240 -0
- package/dist/merge/candidate-ci-failures.js.map +1 -0
- package/dist/merge/candidate-red-record.d.ts +44 -0
- package/dist/merge/candidate-red-record.d.ts.map +1 -0
- package/dist/merge/candidate-red-record.js +98 -0
- package/dist/merge/candidate-red-record.js.map +1 -0
- package/dist/merge/candidate-rework.d.ts +4 -3
- package/dist/merge/candidate-rework.d.ts.map +1 -1
- package/dist/merge/candidate-rework.js +46 -14
- package/dist/merge/candidate-rework.js.map +1 -1
- package/dist/merge/candidate-tip-attribution.d.ts +135 -0
- package/dist/merge/candidate-tip-attribution.d.ts.map +1 -0
- package/dist/merge/candidate-tip-attribution.js +319 -0
- package/dist/merge/candidate-tip-attribution.js.map +1 -0
- package/dist/merge/completion-merge-driver.d.ts +49 -5
- package/dist/merge/completion-merge-driver.d.ts.map +1 -1
- package/dist/merge/completion-merge-driver.js +56 -2
- package/dist/merge/completion-merge-driver.js.map +1 -1
- package/dist/merge/completion-merge-gate.d.ts +4 -1
- package/dist/merge/completion-merge-gate.d.ts.map +1 -1
- package/dist/merge/completion-merge-gate.js +9 -8
- package/dist/merge/completion-merge-gate.js.map +1 -1
- package/dist/queries/api-client/shared.d.ts.map +1 -1
- package/dist/queries/api-client/shared.js +6 -1
- package/dist/queries/api-client/shared.js.map +1 -1
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts +35 -0
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts.map +1 -0
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.js +42 -0
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.js.map +1 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts +16 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts.map +1 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.js +51 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.js.map +1 -0
- package/dist/queries/focuses/ended-arm.d.ts +55 -7
- package/dist/queries/focuses/ended-arm.d.ts.map +1 -1
- package/dist/queries/focuses/ended-arm.js +59 -8
- package/dist/queries/focuses/ended-arm.js.map +1 -1
- package/dist/queries/focuses/focus-discovery.d.ts +18 -8
- package/dist/queries/focuses/focus-discovery.d.ts.map +1 -1
- package/dist/queries/focuses/focus-discovery.js +1 -0
- package/dist/queries/focuses/focus-discovery.js.map +1 -1
- package/dist/queries/sessions/daemon-connection.d.ts.map +1 -1
- package/dist/queries/sessions/daemon-connection.js +1 -0
- package/dist/queries/sessions/daemon-connection.js.map +1 -1
- package/dist/queries/verification/verification.js +1 -1
- package/dist/queries/wire-schemas/schemas.d.ts +2 -0
- package/dist/queries/wire-schemas/schemas.d.ts.map +1 -1
- package/dist/queries/wire-schemas/schemas.js +10 -3
- package/dist/queries/wire-schemas/schemas.js.map +1 -1
- package/dist/resolvers/delivery-acceptance-criteria.d.ts +23 -1
- package/dist/resolvers/delivery-acceptance-criteria.d.ts.map +1 -1
- package/dist/resolvers/delivery-acceptance-criteria.js +52 -8
- package/dist/resolvers/delivery-acceptance-criteria.js.map +1 -1
- package/dist/shell/unified-shell.d.ts +25 -0
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +26 -80
- package/dist/shell/unified-shell.js.map +1 -1
- package/dist/shell/update-restart.d.ts +47 -0
- package/dist/shell/update-restart.d.ts.map +1 -0
- package/dist/shell/update-restart.js +124 -0
- package/dist/shell/update-restart.js.map +1 -0
- package/dist/supervision/escalation-suppression.js +1 -1
- package/dist/supervision/recorded-new-intent.d.ts +49 -0
- package/dist/supervision/recorded-new-intent.d.ts.map +1 -1
- package/dist/supervision/recorded-new-intent.js +10 -2
- package/dist/supervision/recorded-new-intent.js.map +1 -1
- package/dist/testing/fixtures/api-client.js +1 -1
- package/dist/testing/fixtures/completion-judge-stubs.d.ts +7 -2
- package/dist/testing/fixtures/completion-judge-stubs.d.ts.map +1 -1
- package/dist/testing/fixtures/completion-judge-stubs.js +11 -1
- package/dist/testing/fixtures/completion-judge-stubs.js.map +1 -1
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/testing/fixtures/merge-log-capture.d.ts.map +1 -1
- package/dist/testing/fixtures/merge-log-capture.js +1 -0
- package/dist/testing/fixtures/merge-log-capture.js.map +1 -1
- package/dist/testing/fixtures/recording-api-client.js +1 -1
- package/dist/testing/fixtures/verification-deps.d.ts +7 -0
- package/dist/testing/fixtures/verification-deps.d.ts.map +1 -1
- package/dist/testing/fixtures/verification-deps.js +17 -1
- package/dist/testing/fixtures/verification-deps.js.map +1 -1
- package/dist/testing/fixtures/vitest-failure-log.d.ts.map +1 -1
- package/dist/testing/fixtures/vitest-failure-log.js +2 -1
- package/dist/testing/fixtures/vitest-failure-log.js.map +1 -1
- package/dist/update/auto-update.d.ts +11 -5
- package/dist/update/auto-update.d.ts.map +1 -1
- package/dist/update/auto-update.js +11 -5
- package/dist/update/auto-update.js.map +1 -1
- package/dist/update/restart-contract.d.ts +62 -0
- package/dist/update/restart-contract.d.ts.map +1 -0
- package/dist/update/restart-contract.js +137 -0
- package/dist/update/restart-contract.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/ci-gate/ci-gate-dispatch.d.ts +3 -0
- package/dist/verify/ci-gate/ci-gate-dispatch.d.ts.map +1 -1
- package/dist/verify/ci-gate/ci-gate-dispatch.js +31 -9
- package/dist/verify/ci-gate/ci-gate-dispatch.js.map +1 -1
- package/dist/verify/ci-gate/ci-gate-wait-record.d.ts +6 -0
- package/dist/verify/ci-gate/ci-gate-wait-record.d.ts.map +1 -1
- package/dist/verify/ci-gate/ci-gate-wait-record.js +1 -0
- package/dist/verify/ci-gate/ci-gate-wait-record.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.d.ts +12 -2
- package/dist/verify/deterministic-gate/verification-checkout.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.js +18 -3
- package/dist/verify/deterministic-gate/verification-checkout.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.js +1 -1
- package/dist/verify/deterministic-gate/verification-failure-parser.d.ts +30 -9
- package/dist/verify/deterministic-gate/verification-failure-parser.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-failure-parser.js +52 -8
- package/dist/verify/deterministic-gate/verification-failure-parser.js.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.d.ts.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.js +6 -2
- package/dist/verify/engine/verification-commit-sharing.js.map +1 -1
- package/dist/verify/engine/verification-deps.d.ts +9 -0
- package/dist/verify/engine/verification-deps.d.ts.map +1 -1
- package/dist/verify/engine/verification-deps.js +1 -1
- package/dist/verify/engine/verification-engine.d.ts.map +1 -1
- package/dist/verify/engine/verification-engine.js +4 -1
- package/dist/verify/engine/verification-engine.js.map +1 -1
- package/dist/verify/escaped-tests/escaped-pass-store.d.ts +19 -0
- package/dist/verify/escaped-tests/escaped-pass-store.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-pass-store.js +90 -0
- package/dist/verify/escaped-tests/escaped-pass-store.js.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-run.d.ts +39 -0
- package/dist/verify/escaped-tests/escaped-test-run.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-run.js +156 -0
- package/dist/verify/escaped-tests/escaped-test-run.js.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-set.d.ts +65 -0
- package/dist/verify/escaped-tests/escaped-test-set.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-set.js +95 -0
- package/dist/verify/escaped-tests/escaped-test-set.js.map +1 -0
- package/dist/verify/escaped-tests/escaped-tests-source.d.ts +44 -0
- package/dist/verify/escaped-tests/escaped-tests-source.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-tests-source.js +142 -0
- package/dist/verify/escaped-tests/escaped-tests-source.js.map +1 -0
- package/dist/verify/gate-config/verification-manifest.d.ts +12 -1
- package/dist/verify/gate-config/verification-manifest.d.ts.map +1 -1
- package/dist/verify/gate-config/verification-manifest.js +12 -1
- package/dist/verify/gate-config/verification-manifest.js.map +1 -1
- package/dist/verify/gate-verdicts/commit-verdict-record.js +1 -1
- package/package.json +2 -2
- package/scripts/telora-daemon-wrapper.sh +16 -7
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/ci/candidate-failure-contract.test.ts,
|
|
3
|
+
// packages/daemon/src/merge/candidate-ci-failures.test.ts,
|
|
4
|
+
// packages/daemon/src/merge/candidate-red-record.test.ts,
|
|
5
|
+
// packages/daemon/src/merge/candidate-tip-attribution.test.ts,
|
|
6
|
+
// packages/daemon/src/merge/completion-merge-driver.test.ts
|
|
7
|
+
// PINNED-BY-END
|
|
8
|
+
/**
|
|
9
|
+
* The test files a red integration candidate failed in CI, as the daemon HOLDS
|
|
10
|
+
* them: read back over git from the run's failure records
|
|
11
|
+
* (ci/candidate-failure-record.ts), parsed with the gate's own failure parser
|
|
12
|
+
* (verify/deterministic-gate/verification-failure-parser.ts), and kept per
|
|
13
|
+
* (product, focus, candidate sha) under the global state dir.
|
|
14
|
+
*
|
|
15
|
+
* Read when the completion merge driver routes a red candidate's rework
|
|
16
|
+
* (merge/completion-merge-driver.ts), whose Bug names the files
|
|
17
|
+
* (merge/candidate-rework.ts). A held set is reused while the run that decided
|
|
18
|
+
* red, and the records that run has published, are the ones it was read from; a
|
|
19
|
+
* newer red run of the same commit, or another job's record of the same run, is
|
|
20
|
+
* read afresh.
|
|
21
|
+
*
|
|
22
|
+
* Sharded CI: every record (job) of the deciding run is merged into ONE set. A
|
|
23
|
+
* record whose log was cut, could not be read, or reported failures none of
|
|
24
|
+
* whose ids names a test file makes the set INCOMPLETE (`complete: false`):
|
|
25
|
+
* the files it holds failed, but they may not be all that failed. A run that
|
|
26
|
+
* published no record yields null -- the daemon holds nothing, exactly as before
|
|
27
|
+
* records existed -- and so does any read that fails. Nothing here can turn a red
|
|
28
|
+
* into a green.
|
|
29
|
+
*
|
|
30
|
+
* A LATE RECORD: CI may publish the red status before the failing job's record
|
|
31
|
+
* lands, and the red's rework is routed once (it re-opens the focus, and the
|
|
32
|
+
* candidate is not read again). So for a product whose CI has published a
|
|
33
|
+
* failure record before (one is held for it on this host), a red with no record
|
|
34
|
+
* yet waits up to FAILURE_RECORD_WAIT_MS from this process's first sighting
|
|
35
|
+
* before its rework is routed without files ({@link awaitsFailureRecord}). A
|
|
36
|
+
* product that has never published one waits not at all: no record is coming.
|
|
37
|
+
*
|
|
38
|
+
* @module merge/candidate-ci-failures
|
|
39
|
+
*/
|
|
40
|
+
import { mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
41
|
+
import { resolve } from 'node:path';
|
|
42
|
+
import { resolveGlobalStateDir } from '../daemon-state/daemon-process.js';
|
|
43
|
+
import { createLogger } from '../log/daemon-log.js';
|
|
44
|
+
import { decidingRedRun, recordsOfRun, } from '../ci/candidate-failure-record.js';
|
|
45
|
+
import { parseFailingTests, reportedFailureCount } from '../verify/deterministic-gate/verification-failure-parser.js';
|
|
46
|
+
import { testFileOfId } from '../verify/failing-test-rerun/rerun-command.js';
|
|
47
|
+
const log = createLogger({ module: 'completion-merge' });
|
|
48
|
+
/** How long a red with no failure record yet waits for one, when its product's CI publishes them (module doc). */
|
|
49
|
+
export const FAILURE_RECORD_WAIT_MS = 15 * 60 * 1000;
|
|
50
|
+
/** The most failing-test ids a held set keeps (the files are what is used; ids are for the record). */
|
|
51
|
+
export const HELD_FAILING_TEST_IDS_MAX = 200;
|
|
52
|
+
/** The repo-relative test file an id names in a log run under `root`, or null. Pure. */
|
|
53
|
+
function repoFileOf(id, root, workspace) {
|
|
54
|
+
const prefix = (file) => (root ? `${root}/${file}` : file);
|
|
55
|
+
const relative = testFileOfId(id, []);
|
|
56
|
+
if (relative !== null && !id.trimStart().startsWith('/'))
|
|
57
|
+
return prefix(relative);
|
|
58
|
+
if (workspace === null)
|
|
59
|
+
return null;
|
|
60
|
+
const absRoot = root ? `${workspace.replace(/\/+$/, '')}/${root}` : workspace;
|
|
61
|
+
const underRoot = testFileOfId(id, [absRoot]);
|
|
62
|
+
if (underRoot !== null)
|
|
63
|
+
return prefix(underRoot);
|
|
64
|
+
return testFileOfId(id, [workspace]);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Merge a run's records into one failing set; null when there is no record.
|
|
68
|
+
* A log whose step exited non-zero (its record's `exitCode`) but which yields
|
|
69
|
+
* no failing-test id is unparseable red, so the set is incomplete -- never a
|
|
70
|
+
* complete empty one. Pure (the read time is passed in).
|
|
71
|
+
*/
|
|
72
|
+
export function failuresFromRecords(sha, run, records, readAt) {
|
|
73
|
+
if (records.length === 0)
|
|
74
|
+
return null;
|
|
75
|
+
const files = new Set();
|
|
76
|
+
const tests = new Set();
|
|
77
|
+
let complete = true;
|
|
78
|
+
for (const record of records) {
|
|
79
|
+
for (const logEntry of record.logs) {
|
|
80
|
+
if (logEntry.text === null || logEntry.truncated)
|
|
81
|
+
complete = false;
|
|
82
|
+
if (logEntry.text === null)
|
|
83
|
+
continue;
|
|
84
|
+
const ids = [...parseFailingTests(logEntry.text)];
|
|
85
|
+
let named = 0;
|
|
86
|
+
for (const id of ids) {
|
|
87
|
+
const file = repoFileOf(id, logEntry.root, record.workspace);
|
|
88
|
+
if (file === null) {
|
|
89
|
+
tests.add(id);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
named += 1;
|
|
93
|
+
files.add(file);
|
|
94
|
+
tests.add([file, ...id.split(' > ').slice(1)].join(' > '));
|
|
95
|
+
}
|
|
96
|
+
const reported = reportedFailureCount(logEntry.text);
|
|
97
|
+
if ((ids.length > 0 && named === 0) || (ids.length === 0 && reported !== null && reported > 0))
|
|
98
|
+
complete = false;
|
|
99
|
+
const stepFailed = typeof logEntry.exitCode === 'number' && logEntry.exitCode !== 0;
|
|
100
|
+
if (ids.length === 0 && stepFailed)
|
|
101
|
+
complete = false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
sha,
|
|
106
|
+
run,
|
|
107
|
+
jobs: [...new Set(records.map((r) => r.job))].sort(),
|
|
108
|
+
failingFiles: [...files].sort(),
|
|
109
|
+
failingTests: [...tests].sort().slice(0, HELD_FAILING_TEST_IDS_MAX),
|
|
110
|
+
complete,
|
|
111
|
+
readAt,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** Whether a held set was read from exactly the records the run has published now. Pure. */
|
|
115
|
+
function sameJobs(heldJobs, published) {
|
|
116
|
+
const now = [...new Set(published.map((p) => p.job))].sort();
|
|
117
|
+
return now.length === heldJobs.length && now.every((job, i) => job === heldJobs[i]);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The failing test files of the red candidate `sha`: the held set when it was
|
|
121
|
+
* read from the run that decided red AND from every record that run has
|
|
122
|
+
* published now -- a job whose record lands after the set was held (another
|
|
123
|
+
* shard, the e2e job) makes it read again -- else read now (and held). Null when the
|
|
124
|
+
* deciding run published no record -- a set held from ANOTHER run of the same
|
|
125
|
+
* commit is never answered for it, since its files did not fail in this run --
|
|
126
|
+
* or on any failure. Never throws.
|
|
127
|
+
*/
|
|
128
|
+
export function readCandidateCiFailures(sha, deps) {
|
|
129
|
+
try {
|
|
130
|
+
const run = decidingRedRun(deps.listCiStatusRefs(sha));
|
|
131
|
+
const published = recordsOfRun(deps.listRecords(sha), run);
|
|
132
|
+
const held = deps.readHeld(sha);
|
|
133
|
+
if (held !== null && run !== null && held.run === run && sameJobs(held.jobs, published))
|
|
134
|
+
return held;
|
|
135
|
+
const records = published.map((p) => deps.readRecord(p)).filter((r) => r !== null);
|
|
136
|
+
const failures = failuresFromRecords(sha, run ?? published[0]?.run ?? null, records, deps.now());
|
|
137
|
+
if (failures === null)
|
|
138
|
+
return null;
|
|
139
|
+
// A record that was listed but could not be read is part of the run that is missing.
|
|
140
|
+
const read = records.length === published.length ? failures : { ...failures, complete: false };
|
|
141
|
+
deps.hold(read);
|
|
142
|
+
return read;
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
log.warn(`[completion-merge] the CI failure record of candidate ${sha.slice(0, 9)} could not be read: ${err.message}`);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
// The hold: one file per (product, focus, candidate sha), written atomically.
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
function heldDir() {
|
|
153
|
+
return resolve(resolveGlobalStateDir(), 'candidate-ci-failures');
|
|
154
|
+
}
|
|
155
|
+
/** The held file for a candidate; `dir` defaults to the global state dir. Exported for tests. */
|
|
156
|
+
export function candidateCiFailuresPath(productId, focusId, sha, dir = heldDir()) {
|
|
157
|
+
return resolve(dir, `${productId}-${focusId}-${sha}.json`.replace(/[^a-zA-Z0-9._-]/g, '_'));
|
|
158
|
+
}
|
|
159
|
+
const isStrings = (v) => Array.isArray(v) && v.every((s) => typeof s === 'string');
|
|
160
|
+
/** Parse a held file; null when it is not a well-formed set. Pure. */
|
|
161
|
+
export function parseHeldCandidateCiFailures(text) {
|
|
162
|
+
let raw;
|
|
163
|
+
try {
|
|
164
|
+
raw = JSON.parse(text);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
if (typeof raw !== 'object' || raw === null)
|
|
170
|
+
return null;
|
|
171
|
+
const r = raw;
|
|
172
|
+
if (typeof r.sha !== 'string' || !(r.run === null || (typeof r.run === 'number' && Number.isSafeInteger(r.run))))
|
|
173
|
+
return null;
|
|
174
|
+
if (!isStrings(r.jobs) || !isStrings(r.failingFiles) || !isStrings(r.failingTests))
|
|
175
|
+
return null;
|
|
176
|
+
if (typeof r.complete !== 'boolean' || typeof r.readAt !== 'string')
|
|
177
|
+
return null;
|
|
178
|
+
return { sha: r.sha, run: r.run, jobs: r.jobs, failingFiles: r.failingFiles, failingTests: r.failingTests, complete: r.complete, readAt: r.readAt };
|
|
179
|
+
}
|
|
180
|
+
/** The set held for a candidate; null when none is, or it is unreadable. */
|
|
181
|
+
export function readHeldCandidateCiFailures(productId, focusId, sha, dir = heldDir()) {
|
|
182
|
+
try {
|
|
183
|
+
return parseHeldCandidateCiFailures(readFileSync(candidateCiFailuresPath(productId, focusId, sha, dir), 'utf8'));
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** Hold a candidate's set (temp + rename). A failed write is logged, never thrown. */
|
|
190
|
+
export function holdCandidateCiFailures(productId, focusId, failures, dir = heldDir()) {
|
|
191
|
+
const path = candidateCiFailuresPath(productId, focusId, failures.sha, dir);
|
|
192
|
+
try {
|
|
193
|
+
mkdirSync(dir, { recursive: true });
|
|
194
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
195
|
+
writeFileSync(tmp, JSON.stringify(failures, null, 2));
|
|
196
|
+
renameSync(tmp, path);
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
log.warn(`[completion-merge] could not hold the CI failures of candidate ${failures.sha.slice(0, 9)}: ${err.message}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
// The wait for a late record (module doc).
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
/** When this process first saw each (product, focus, candidate) red with no record. */
|
|
206
|
+
const firstSeenWithoutRecord = new Map();
|
|
207
|
+
/** Reset the wait's memory -- tests start from a clean slate. */
|
|
208
|
+
export function __resetFailureRecordWaitForTests() {
|
|
209
|
+
firstSeenWithoutRecord.clear();
|
|
210
|
+
}
|
|
211
|
+
/** Whether this host has ever held a CI failure set for the product: its CI publishes records. */
|
|
212
|
+
export function productPublishesFailureRecords(productId, dir = heldDir()) {
|
|
213
|
+
const prefix = `${productId}-`.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
214
|
+
try {
|
|
215
|
+
return readdirSync(dir).some((name) => name.startsWith(prefix) && name.endsWith('.json'));
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Whether the red candidate `sha`, which has no failure record yet, should wait
|
|
223
|
+
* for one this tick rather than have its rework routed without files: only when
|
|
224
|
+
* the product publishes records, and only within FAILURE_RECORD_WAIT_MS of this
|
|
225
|
+
* process's first sighting. Never throws.
|
|
226
|
+
*/
|
|
227
|
+
export function awaitsFailureRecord(subject, sha, now, publishes) {
|
|
228
|
+
const key = `${subject.productId}:${subject.focusId}:${sha}`;
|
|
229
|
+
const since = firstSeenWithoutRecord.get(key) ?? now;
|
|
230
|
+
firstSeenWithoutRecord.set(key, since);
|
|
231
|
+
if (now - since >= FAILURE_RECORD_WAIT_MS)
|
|
232
|
+
return false;
|
|
233
|
+
try {
|
|
234
|
+
return publishes(subject.productId);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=candidate-ci-failures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candidate-ci-failures.js","sourceRoot":"","sources":["../../src/merge/candidate-ci-failures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type CandidateCiRedRequest, type CandidateCiRedResult, type CandidateRedGateOutcome } from '../queries/candidate-ci-reds/candidate-ci-reds.js';
|
|
2
|
+
import type { CandidateCiFailures } from './candidate-ci-failures.js';
|
|
3
|
+
/** The focus a red candidate belongs to. */
|
|
4
|
+
export interface CandidateRedSubject {
|
|
5
|
+
productId: string;
|
|
6
|
+
focusId: string;
|
|
7
|
+
focusName: string;
|
|
8
|
+
}
|
|
9
|
+
/** The newest gate verdict recorded at a commit, as the record reads it. */
|
|
10
|
+
export interface CandidateRedVerdict {
|
|
11
|
+
outcome: 'passed' | 'failed';
|
|
12
|
+
/** ci/gate-ref.ts gateRunKey of the gate the verdict was rendered under. */
|
|
13
|
+
gateKey: string;
|
|
14
|
+
recordedAt: string;
|
|
15
|
+
}
|
|
16
|
+
/** The reads and the write, bound at the composition root (composition/execution-merge-context.ts). */
|
|
17
|
+
export interface CandidateRedRecordDeps {
|
|
18
|
+
/** The newest verdict recorded for the commit under any gate; null when none is. */
|
|
19
|
+
readVerdict: (productId: string, focusId: string, sha: string) => CandidateRedVerdict | null;
|
|
20
|
+
/** The shas carrying a recorded review auto-approval. */
|
|
21
|
+
listAutoApprovalShas: (productId: string, focusId: string) => string[];
|
|
22
|
+
/**
|
|
23
|
+
* The CI run that decided the candidate red, from its refs/ci-status refs
|
|
24
|
+
* (ci/candidate-failure-record.ts decidingRedRun) -- so a red recorded before
|
|
25
|
+
* its failure record exists is keyed by the same run as one recorded after.
|
|
26
|
+
*/
|
|
27
|
+
readRedRun: (candidateSha: string) => number | null;
|
|
28
|
+
record: (request: CandidateCiRedRequest) => Promise<CandidateCiRedResult>;
|
|
29
|
+
}
|
|
30
|
+
/** Reset the recorded keys -- tests start from a clean slate. */
|
|
31
|
+
export declare function __resetCandidateRedRecordForTests(): void;
|
|
32
|
+
/** The gate's outcome at the approved head, with the verdict that gives it its key (module doc). Pure. */
|
|
33
|
+
export declare function gateAtApprovedHead(verdict: CandidateRedVerdict | null, autoApproved: boolean): {
|
|
34
|
+
gateOutcome: CandidateRedGateOutcome;
|
|
35
|
+
verdict: CandidateRedVerdict | null;
|
|
36
|
+
};
|
|
37
|
+
/** The record of a red candidate. Pure apart from the gate reads in `deps`; throws when one does. */
|
|
38
|
+
export declare function buildCandidateRedRequest(subject: CandidateRedSubject, candidateSha: string, approvedSha: string | undefined, failures: CandidateCiFailures | null, deps: Pick<CandidateRedRecordDeps, 'readVerdict' | 'listAutoApprovalShas' | 'readRedRun'>): CandidateCiRedRequest;
|
|
39
|
+
/**
|
|
40
|
+
* Record the red candidate `candidateSha` of the subject's focus (module doc).
|
|
41
|
+
* Never throws; a failed read or write is logged and retried on a later tick.
|
|
42
|
+
*/
|
|
43
|
+
export declare function recordCandidateRed(subject: CandidateRedSubject, candidateSha: string, approvedSha: string | undefined, failures: CandidateCiFailures | null, deps: CandidateRedRecordDeps): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=candidate-red-record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candidate-red-record.d.ts","sourceRoot":"","sources":["../../src/merge/candidate-red-record.ts"],"names":[],"mappings":"AAoCA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC7B,MAAM,mDAAmD,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKtE,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,uGAAuG;AACvG,MAAM,WAAW,sBAAsB;IACrC,oFAAoF;IACpF,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,mBAAmB,GAAG,IAAI,CAAC;IAC7F,yDAAyD;IACzD,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACvE;;;;OAIG;IACH,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACpD,MAAM,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC3E;AAUD,iEAAiE;AACjE,wBAAgB,iCAAiC,IAAI,IAAI,CAExD;AAED,0GAA0G;AAC1G,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,GAAG,IAAI,EACnC,YAAY,EAAE,OAAO,GACpB;IAAE,WAAW,EAAE,uBAAuB,CAAC;IAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAE,CAG/E;AAED,qGAAqG;AACrG,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EACpC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,aAAa,GAAG,sBAAsB,GAAG,YAAY,CAAC,GACxF,qBAAqB,CAoBvB;AASD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EACpC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/merge/candidate-red-record.test.ts
|
|
3
|
+
// PINNED-BY-END
|
|
4
|
+
/**
|
|
5
|
+
* The record of a red integration candidate beside the gate verdict of the head
|
|
6
|
+
* it was built from -- and so of a GATE ESCAPE: the focus's deterministic gate
|
|
7
|
+
* passed the approved head, and CI found the candidate built from it red.
|
|
8
|
+
*
|
|
9
|
+
* The completion merge driver (merge/completion-merge-driver.ts) calls this in
|
|
10
|
+
* its `rework` step, before the re-work is routed, with the approved head the
|
|
11
|
+
* gate's hold names (merge/completion-merge-gate.ts) and the failing test files
|
|
12
|
+
* CI's failure record holds (merge/candidate-ci-failures.ts). The gate outcome
|
|
13
|
+
* at the approved head is:
|
|
14
|
+
* - 'passed' when the newest verdict recorded for that commit under any gate
|
|
15
|
+
* (verify/gate-verdicts/commit-verdict-record.ts) passed, or the commit
|
|
16
|
+
* carries a recorded review auto-approval
|
|
17
|
+
* (merge/review-auto-approval-record.ts), which is written only after a
|
|
18
|
+
* passing verdict gate;
|
|
19
|
+
* - 'failed' when that newest verdict failed;
|
|
20
|
+
* - 'none' when no verdict is recorded there, or no approved head was named.
|
|
21
|
+
* The gate's key and recordedAt are sent only from a verdict whose outcome is
|
|
22
|
+
* the one reported. The record goes to product-api
|
|
23
|
+
* (queries/candidate-ci-reds/candidate-ci-reds.ts), which upserts it.
|
|
24
|
+
*
|
|
25
|
+
* NEVER THROWS and never blocks the re-work: a failed read or write is logged
|
|
26
|
+
* and swallowed. A (focus, candidate, run) this process recorded is posted
|
|
27
|
+
* again only when what it says of the failing files changed -- a failure record
|
|
28
|
+
* that arrived after the red was first recorded is posted as a refresh, which
|
|
29
|
+
* product-api applies to the existing row -- and one whose post failed is
|
|
30
|
+
* retried on a later tick.
|
|
31
|
+
*
|
|
32
|
+
* @module merge/candidate-red-record
|
|
33
|
+
*/
|
|
34
|
+
import { sameCommit } from '../queries/focus-review/focus-review-approval.js';
|
|
35
|
+
import { CANDIDATE_CI_RED_MAX_FILES, } from '../queries/candidate-ci-reds/candidate-ci-reds.js';
|
|
36
|
+
import { createLogger } from '../log/daemon-log.js';
|
|
37
|
+
const log = createLogger({ module: 'completion-merge' });
|
|
38
|
+
/** The (focus, candidate, run) keys this process recorded, each with what its post said of the failing files. */
|
|
39
|
+
const recorded = new Map();
|
|
40
|
+
/** What a request says of the failing files: none held, or the held set and whether it is complete. Pure. */
|
|
41
|
+
function filesSignature(request) {
|
|
42
|
+
return request.failingFilesComplete === null ? 'no-record' : `${request.failingFilesComplete}:${request.failingTestFiles.join('\n')}`;
|
|
43
|
+
}
|
|
44
|
+
/** Reset the recorded keys -- tests start from a clean slate. */
|
|
45
|
+
export function __resetCandidateRedRecordForTests() {
|
|
46
|
+
recorded.clear();
|
|
47
|
+
}
|
|
48
|
+
/** The gate's outcome at the approved head, with the verdict that gives it its key (module doc). Pure. */
|
|
49
|
+
export function gateAtApprovedHead(verdict, autoApproved) {
|
|
50
|
+
const gateOutcome = autoApproved ? 'passed' : verdict?.outcome ?? 'none';
|
|
51
|
+
return { gateOutcome, verdict: verdict !== null && verdict.outcome === gateOutcome ? verdict : null };
|
|
52
|
+
}
|
|
53
|
+
/** The record of a red candidate. Pure apart from the gate reads in `deps`; throws when one does. */
|
|
54
|
+
export function buildCandidateRedRequest(subject, candidateSha, approvedSha, failures, deps) {
|
|
55
|
+
const { productId, focusId } = subject;
|
|
56
|
+
const gate = approvedSha === undefined
|
|
57
|
+
? { gateOutcome: 'none', verdict: null }
|
|
58
|
+
: gateAtApprovedHead(deps.readVerdict(productId, focusId, approvedSha), deps.listAutoApprovalShas(productId, focusId).some((s) => sameCommit(s, approvedSha)));
|
|
59
|
+
return {
|
|
60
|
+
productId,
|
|
61
|
+
focusId,
|
|
62
|
+
candidateSha,
|
|
63
|
+
ciRun: failures?.run ?? deps.readRedRun(candidateSha),
|
|
64
|
+
approvedHeadSha: approvedSha ?? null,
|
|
65
|
+
gateOutcome: gate.gateOutcome,
|
|
66
|
+
gateKey: gate.verdict?.gateKey ?? null,
|
|
67
|
+
gateRecordedAt: gate.verdict?.recordedAt ?? null,
|
|
68
|
+
failingTestFiles: (failures?.failingFiles ?? []).slice(0, CANDIDATE_CI_RED_MAX_FILES),
|
|
69
|
+
failingFilesComplete: failures === null ? null : failures.complete,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function describeEscape(request) {
|
|
73
|
+
const head = request.approvedHeadSha?.slice(0, 9) ?? 'unknown';
|
|
74
|
+
const run = request.ciRun === null ? 'an unknown run' : `run ${request.ciRun}`;
|
|
75
|
+
const files = `${request.failingTestFiles.length} failing file(s)${request.failingFilesComplete === false ? ' (incomplete)' : ''}`;
|
|
76
|
+
return `gate escape: gate passed ${head}, candidate ${request.candidateSha.slice(0, 9)} red in CI ${run}, ${files}`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Record the red candidate `candidateSha` of the subject's focus (module doc).
|
|
80
|
+
* Never throws; a failed read or write is logged and retried on a later tick.
|
|
81
|
+
*/
|
|
82
|
+
export async function recordCandidateRed(subject, candidateSha, approvedSha, failures, deps) {
|
|
83
|
+
try {
|
|
84
|
+
const request = buildCandidateRedRequest(subject, candidateSha, approvedSha, failures, deps);
|
|
85
|
+
const key = `${subject.productId}:${subject.focusId}:${candidateSha}:${request.ciRun ?? 'none'}`;
|
|
86
|
+
const signature = filesSignature(request);
|
|
87
|
+
if (recorded.get(key) === signature)
|
|
88
|
+
return;
|
|
89
|
+
const result = await deps.record(request);
|
|
90
|
+
recorded.set(key, signature);
|
|
91
|
+
if (result.isGateEscape)
|
|
92
|
+
log.info(`[completion-merge] "${subject.focusName}": ${describeEscape(request)}`);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
log.warn(`[completion-merge] "${subject.focusName}": the red candidate ${candidateSha.slice(0, 9)} could not be recorded (retried next tick): ${err.message}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=candidate-red-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candidate-red-record.js","sourceRoot":"","sources":["../../src/merge/candidate-red-record.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,9 +35,10 @@ export interface CandidateReworkDeps {
|
|
|
35
35
|
export declare function candidateReworkTitle(sha: string, cause: CandidateReworkCause): string;
|
|
36
36
|
/**
|
|
37
37
|
* The Bug's description, within ISSUE_DESCRIPTION_BUDGET whatever its lists and
|
|
38
|
-
* fields hold. Pure. A red candidate's names the
|
|
39
|
-
*
|
|
40
|
-
* never the reader's
|
|
38
|
+
* fields hold. Pure. A red candidate's names the test files that failed when
|
|
39
|
+
* the daemon holds them, and the CI-log read for THIS product's repo (`ciRepo`,
|
|
40
|
+
* from its origin remote) at the candidate commit -- never the reader's
|
|
41
|
+
* syntelyos/telora default.
|
|
41
42
|
*/
|
|
42
43
|
export declare function candidateReworkDescription(subject: CompletionMergeSubject, sha: string, cause: CandidateReworkCause, detail: CandidateReworkDetail | null, ciRepo: ProductCiRepo): string;
|
|
43
44
|
/** Which done delivery owns the re-work. Pure. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-rework.d.ts","sourceRoot":"","sources":["../../src/merge/candidate-rework.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"candidate-rework.d.ts","sourceRoot":"","sources":["../../src/merge/candidate-rework.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
-
// Pinned by: packages/daemon/src/ci/
|
|
2
|
+
// Pinned by: packages/daemon/src/ci/candidate-failure-contract.test.ts,
|
|
3
|
+
// packages/daemon/src/ci/ci-log-instruction-bindings.test.ts,
|
|
3
4
|
// packages/daemon/src/integration/commits-after-approval-review-regression.test.ts,
|
|
4
5
|
// packages/daemon/src/integration/same-run-rerun-candidate-merge-regression.test.ts,
|
|
6
|
+
// packages/daemon/src/merge/candidate-ci-failures.test.ts,
|
|
5
7
|
// packages/daemon/src/merge/candidate-rework.test.ts,
|
|
6
8
|
// packages/daemon/src/merge/completion-conflict-rework.test.ts,
|
|
7
9
|
// packages/daemon/src/merge/completion-rework-armed.test.ts
|
|
@@ -113,6 +115,44 @@ function isLocalFailure(detail) {
|
|
|
113
115
|
function isUnreviewedCommits(detail) {
|
|
114
116
|
return detail !== null && 'approvedSha' in detail;
|
|
115
117
|
}
|
|
118
|
+
function isCiFailures(detail) {
|
|
119
|
+
return detail !== null && 'failingFiles' in detail;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* A red candidate's Bug: the failing test files CI's failure record named (when
|
|
123
|
+
* the daemon holds them), then the CI-log read for THIS product's repo at the
|
|
124
|
+
* candidate commit -- kept either way, since the files say where, not why.
|
|
125
|
+
*/
|
|
126
|
+
function redCandidateDescription(subject, sha, failures, ciRepo) {
|
|
127
|
+
const intro = [
|
|
128
|
+
`CI's full suite FAILED on the focus's integration candidate ${field(sha)} (the focus branch merged with the integration tip).`,
|
|
129
|
+
'',
|
|
130
|
+
];
|
|
131
|
+
const outro = [
|
|
132
|
+
'',
|
|
133
|
+
`Integration does not move until a candidate is green. Read the failing run first (its ref is ` +
|
|
134
|
+
`refs/heads/${field(candidateBranchForFocus(subject.focusId))}). ` +
|
|
135
|
+
// Only a pathological origin URL makes the CI-log instruction long; it is clipped like any other field.
|
|
136
|
+
clipText(ciLogInstructionText(ciLogInstruction(ciRepo, sha), sha), 3 * ISSUE_DESCRIPTION_FIELD_CAP),
|
|
137
|
+
'',
|
|
138
|
+
`Then fix it on ${field(subject.branchName)} and commit; the next review and candidate run judge the fix.`,
|
|
139
|
+
];
|
|
140
|
+
if (failures === null || failures.failingFiles.length === 0) {
|
|
141
|
+
if (failures !== null) {
|
|
142
|
+
intro.push('CI published a failure record for the run, but no test file could be read from it -- the log names why.', '');
|
|
143
|
+
}
|
|
144
|
+
return [...intro, ...outro];
|
|
145
|
+
}
|
|
146
|
+
const run = failures.run === null ? 'its CI run' : `CI run ${failures.run}`;
|
|
147
|
+
const caveat = failures.complete
|
|
148
|
+
? []
|
|
149
|
+
: ['', 'The record is INCOMPLETE (a log was cut, unreadable, or a failure named no file): other tests may have failed too.'];
|
|
150
|
+
const files = { title: `Test files that failed in ${run}`, items: failures.failingFiles, empty: 'none read' };
|
|
151
|
+
// One list: it takes all the room the fixed text leaves (its heading priced at its widest).
|
|
152
|
+
const room = ISSUE_DESCRIPTION_BUDGET - linesCost([...intro, ...caveat, ...outro, listHeading(files, files.items.length)]);
|
|
153
|
+
const list = renderBudgetedList(files.items.map((f) => field(f)), room);
|
|
154
|
+
return [...intro, listHeading(files, list.omitted), ...list.lines, ...caveat, ...outro];
|
|
155
|
+
}
|
|
116
156
|
function unreviewedCommitsDescription(subject, sha, detail) {
|
|
117
157
|
const approved = detail ? field(detail.approvedSha) : null;
|
|
118
158
|
return [
|
|
@@ -139,9 +179,10 @@ function localFailureDescription(subject, sha, failure) {
|
|
|
139
179
|
}
|
|
140
180
|
/**
|
|
141
181
|
* The Bug's description, within ISSUE_DESCRIPTION_BUDGET whatever its lists and
|
|
142
|
-
* fields hold. Pure. A red candidate's names the
|
|
143
|
-
*
|
|
144
|
-
* never the reader's
|
|
182
|
+
* fields hold. Pure. A red candidate's names the test files that failed when
|
|
183
|
+
* the daemon holds them, and the CI-log read for THIS product's repo (`ciRepo`,
|
|
184
|
+
* from its origin remote) at the candidate commit -- never the reader's
|
|
185
|
+
* syntelyos/telora default.
|
|
145
186
|
*/
|
|
146
187
|
export function candidateReworkDescription(subject, sha, cause, detail, ciRepo) {
|
|
147
188
|
if (cause === 'conflict')
|
|
@@ -159,16 +200,7 @@ export function candidateReworkDescription(subject, sha, cause, detail, ciRepo)
|
|
|
159
200
|
'review before the completion merge is tried again.',
|
|
160
201
|
].join('\n');
|
|
161
202
|
}
|
|
162
|
-
return
|
|
163
|
-
`CI's full suite FAILED on the focus's integration candidate ${field(sha)} (the focus branch merged with the integration tip).`,
|
|
164
|
-
'',
|
|
165
|
-
`Integration does not move until a candidate is green. Read the failing run first (its ref is ` +
|
|
166
|
-
`refs/heads/${field(candidateBranchForFocus(subject.focusId))}). ` +
|
|
167
|
-
// Only a pathological origin URL makes the CI-log instruction long; it is clipped like any other field.
|
|
168
|
-
clipText(ciLogInstructionText(ciLogInstruction(ciRepo, sha), sha), 3 * ISSUE_DESCRIPTION_FIELD_CAP),
|
|
169
|
-
'',
|
|
170
|
-
`Then fix it on ${field(subject.branchName)} and commit; the next review and candidate run judge the fix.`,
|
|
171
|
-
].join('\n');
|
|
203
|
+
return redCandidateDescription(subject, sha, isCiFailures(detail) ? detail : null, ciRepo).join('\n');
|
|
172
204
|
}
|
|
173
205
|
/** Which done delivery owns the re-work. Pure. */
|
|
174
206
|
export function chooseReworkOwner(deliveries, trailers) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-rework.js","sourceRoot":"","sources":["../../src/merge/candidate-rework.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"candidate-rework.js","sourceRoot":"","sources":["../../src/merge/candidate-rework.ts"],"names":[],"mappings":"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"}
|