fix(server): wake PR watches when remaining CI checks finish#23904

merged7
main
fix/issue-23712
opened1d agobyJJulius Marminge
View on GitHubTwo-way sync enabledPR last imported 1d ago
0 / 6 viewed6 files changedLine totals unavailable

apps/server/src/orchestration-v2/pullRequestWatch.ts · Earlier revision c762335d · right 87

Original diff
@@ -65,11 +65,26 @@ export function evaluatePullRequestWatch(
     // A required job created and finished between two passes is never seen pending. Without
     // required checks, any check counts, and advisory bots keep adding passed ones: no wake.
     const gateGrew = required.length > 0 && gateNames.some((name) => !told.includes(name));
+    // Other checks still pending when required ones passed are owed one wake when all settle.
+    // They are kept with the told names until then, so later advisory churn never wakes.
+    const owed =
+      required.length > 0
+        ? detail.checks.filter((check) => check.required !== true && told.includes(check.name))
+        : [];
+    const settled =
+      failed.length === 0 && detail.checks.every((check) => check.status !== "pending");
+    let owedNow = passedNow && passed ? owed : [];
     if (passedNow && (!passed || gateGrew)) {
       changes.push({ kind: "checks-passed", count: gate.length, required: required.length > 0 });
+      owedNow = detail.checks.filter(
+        (check) => check.required !== true && check.status === "pending",
+      );
+    } else if (settled && owedNow.length > 0) {
+      changes.push({ kind: "checks-passed", count: detail.checks.length, required: false });
+      owedNow = [];
     }
     passed = passedNow;
-    passedChecks = passedNow ? gateNames : [];
+    passedChecks = passedNow ? [...gateNames, ...owedNow.map((check) => check.name)] : [];