Skip to content

Commit 2b2cc39

Browse files
committed
improve error messaging
1 parent dc0171b commit 2b2cc39

File tree

1 file changed

+38
-21
lines changed

1 file changed

+38
-21
lines changed

.github/workflows/require-jump-anza.yml

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
uses: actions/github-script@v7
2424
with:
2525
script: |
26-
// globals github, context, core are injected by github-script
26+
// github, context, core are injected by github-script
2727
2828
// ──────────── 1. MANUAL ROSTERS ────────────
2929
const jumpApprovers = ['jacobcreech', 'topointon-jump', '0x0ece'];
@@ -33,7 +33,7 @@ jobs:
3333
const pr = context.payload.pull_request;
3434
if (!pr) { core.setFailed('No pull_request context'); return; }
3535
36-
// 2. fetch every review on this PR
36+
// 2. fetch *all* reviews on this PR
3737
const { data: reviews } = await github.rest.pulls.listReviews({
3838
owner: context.repo.owner,
3939
repo: context.repo.repo,
@@ -46,38 +46,55 @@ jobs:
4646
reviews.forEach(r =>
4747
core.info(`${r.user.login} -> ${r.state} @ ${r.submitted_at}`));
4848
49-
// 3. reduce to effective state per reviewer
50-
const states = {}; // login → {approved, changesRequested}
49+
// 3. determine effective state per reviewer
50+
// We replay events chronologically so DISMISSED or REQUEST_CHANGES
51+
// can override an earlier APPROVED.
52+
reviews.sort((a, b) => new Date(a.submitted_at) - new Date(b.submitted_at));
53+
54+
const status = {}; // login → {approved, blocked}
5155
for (const r of reviews) {
5256
const u = r.user.login;
53-
states[u] = states[u] || { approved: false, changesRequested: false };
54-
if (r.state === 'APPROVED') states[u].approved = true;
55-
if (r.state === 'REQUEST_CHANGES') states[u].changesRequested = true;
57+
status[u] = status[u] || { approved: false, blocked: false };
58+
59+
switch (r.state) {
60+
case 'APPROVED':
61+
status[u].approved = true;
62+
status[u].blocked = false;
63+
break;
64+
case 'REQUEST_CHANGES':
65+
status[u].approved = false;
66+
status[u].blocked = true; // blocks until new approval
67+
break;
68+
case 'DISMISSED':
69+
status[u].approved = false; // previous approval is now void
70+
break;
71+
default:
72+
// COMMENTED etc – ignore
73+
}
5674
}
5775
5876
// DEBUG 2: effective map
5977
core.info('=== Effective state per reviewer ===');
60-
Object.entries(states).forEach(([u, s]) =>
61-
core.info(`${u}: approved=${s.approved}, changesRequested=${s.changesRequested}`));
78+
Object.entries(status).forEach(([u, s]) =>
79+
core.info(`${u}: approved=${s.approved}, blocked=${s.blocked}`));
6280
63-
// 4. build final approved-and-not-blocked set
64-
const approved = Object.entries(states)
65-
.filter(([_, s]) => s.approved && !s.changesRequested)
81+
// 4. final approved list (approved && not blocked)
82+
const approved = Object.entries(status)
83+
.filter(([_, s]) => s.approved && !s.blocked)
6684
.map(([u]) => u);
6785
68-
// DEBUG 3: final list
6986
core.info(`Approved reviewers counted: ${approved.join(', ') || 'none'}`);
7087
7188
// 5. org-level checks
7289
const hasJump = jumpApprovers.some(u => approved.includes(u));
7390
const hasAnza = anzaApprovers.some(u => approved.includes(u));
7491
75-
// prepare helpful failure message
76-
const missing = [];
77-
if (!hasJump) missing.push(
78-
`Jump approval missing. Any of: ${jumpApprovers.join(', ')}`);
79-
if (!hasAnza) missing.push(
80-
`Anza approval missing. Any of: ${anzaApprovers.join(', ')}`);
92+
// helpful failure message
93+
const missingMsgs = [];
94+
if (!hasJump)
95+
missingMsgs.push(`Jump approval missing – need one of: ${jumpApprovers.join(', ')}`);
96+
if (!hasAnza)
97+
missingMsgs.push(`Anza approval missing – need one of: ${anzaApprovers.join(', ')}`);
8198
8299
// PR-check summary
83100
core.summary
@@ -88,8 +105,8 @@ jobs:
88105
])
89106
.write();
90107
91-
if (missing.length) {
92-
core.setFailed(missing.join(' | '));
108+
if (missingMsgs.length) {
109+
core.setFailed(missingMsgs.join(' | '));
93110
} else {
94111
core.notice('All required approvals present; merge allowed.');
95112
}

0 commit comments

Comments
 (0)