diff --git a/.github/workflows/autoassign.yml b/.github/workflows/autoassign.yml index 96ccaae2a01..44749d997e0 100644 --- a/.github/workflows/autoassign.yml +++ b/.github/workflows/autoassign.yml @@ -45,9 +45,11 @@ jobs: // Simple "least recent then fewest in lookback" picker function initMap(arr){ const m=new Map(); for(const a of arr) m.set(a,0); return m; } const issueCounts = initMap(issuePool); - const prCounts = initMap(reviewPool); + const prAssigneeCounts = initMap(reviewPool); + const prReviewerCounts = initMap(reviewPool); const lastIssueAssign = new Map(); - const lastPrAssign = new Map(); + const lastPrAssignee = new Map(); + const lastPrReviewer = new Map(); function pick(countsMap, lastMap, exclude=new Set()){ const cands = [...countsMap.keys()].filter(x => !exclude.has(x)); @@ -91,20 +93,22 @@ jobs: for (const pr of page.data){ const ts = new Date(pr.created_at); if (ts < new Date(sinceISO)) continue; - if (pr.assignee){ - const l = pr.assignee.login.toLowerCase(); + // Count all assignees (plural) + for (const a of (pr.assignees||[])){ + const l = a.login.toLowerCase(); if (reviewPool.has(l)){ - prCounts.set(l,(prCounts.get(l)||0)+1); - const lastTs = lastPrAssign.get(l); - if (!lastTs || ts > lastTs) lastPrAssign.set(l, ts); + prAssigneeCounts.set(l,(prAssigneeCounts.get(l)||0)+1); + const lastTs = lastPrAssignee.get(l); + if (!lastTs || ts > lastTs) lastPrAssignee.set(l, ts); } } + // Count all reviewers separately for (const r of (pr.requested_reviewers||[])){ const l=r.login.toLowerCase(); if (reviewPool.has(l)){ - prCounts.set(l,(prCounts.get(l)||0)+1); - const lastTs = lastPrAssign.get(l); - if (!lastTs || ts > lastTs) lastPrAssign.set(l, ts); + prReviewerCounts.set(l,(prReviewerCounts.get(l)||0)+1); + const lastTs = lastPrReviewer.get(l); + if (!lastTs || ts > lastTs) lastPrReviewer.set(l, ts); } } } @@ -134,10 +138,10 @@ jobs: const author = (pr.user?.login||"").toLowerCase(); const assignee = pr.assignee?.login?.toLowerCase(); - // Ensure one assignee + // Ensure one assignee (use assignee counts only) let finalAssignee = assignee; if (!finalAssignee) { - const a = pick(prCounts, lastPrAssign, new Set([author])); + const a = pick(prAssigneeCounts, lastPrAssignee, new Set([author])); if (a) { await github.rest.issues.addAssignees({ owner: ORG, repo: REPO, issue_number: prNum, assignees: [a] @@ -146,11 +150,11 @@ jobs: } } - // One reviewer, not the author, not the assignee + // One reviewer, not the author, not the assignee (use reviewer counts only) const already = new Set((pr.requested_reviewers||[]).map(x=>x.login.toLowerCase())); if (already.size === 0 && !pr.draft) { const exclude = new Set([author, finalAssignee].filter(Boolean)); - const reviewer = pick(prCounts, lastPrAssign, exclude); + const reviewer = pick(prReviewerCounts, lastPrReviewer, exclude); if (reviewer) { await github.rest.pulls.requestReviewers({ owner: ORG, repo: REPO, pull_number: prNum, reviewers: [reviewer]