Skip to content

Commit 0617474

Browse files
committed
fix(triage): respect manual game/engine labels and skip closed issues (#5097)
The triage bot re-added game and engine labels a maintainer removed by hand, because removing a label triggers the job again and it re-derives them from the issue text. It also ran on closed issues. Only run the label jobs on open issues, and keep a game/engine label as a person last left it (removed or added), like the Linux support label override. The backfill job follows the same rule. (cherry picked from commit abff947)
1 parent 0f1db22 commit 0617474

1 file changed

Lines changed: 65 additions & 6 deletions

File tree

‎.github/workflows/action-issue-triage-automation.yml‎

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ env:
6969

7070
jobs:
7171
issue-regex-labeler:
72-
if: github.repository_owner == 'GameServerManagers' && github.event_name == 'issues' && (github.event.action == 'opened' || github.event.action == 'edited')
72+
if: github.repository_owner == 'GameServerManagers' && github.event_name == 'issues' && github.event.issue.state == 'open' && (github.event.action == 'opened' || github.event.action == 'edited')
7373
runs-on: ubuntu-latest
7474
steps:
7575
- name: Issue Labeler
@@ -82,7 +82,7 @@ jobs:
8282
sync-labels: 0
8383

8484
issue-ai-maintenance:
85-
if: github.repository_owner == 'GameServerManagers' && (github.event_name == 'issues' || github.event_name == 'issue_comment')
85+
if: github.repository_owner == 'GameServerManagers' && (github.event_name == 'issues' || github.event_name == 'issue_comment') && github.event.issue.state == 'open'
8686
runs-on: ubuntu-latest
8787
steps:
8888
- name: Reconcile issue labels and AI triage
@@ -819,8 +819,37 @@ jobs:
819819
}
820820
821821
// Avoid pointless API calls.
822-
const finalAdds = [...labelsToAdd].filter((label) => !existingLabels.has(label));
823-
const finalRemoves = [...labelsToRemove].filter((label) => existingLabels.has(label));
822+
let finalAdds = [...labelsToAdd].filter((label) => !existingLabels.has(label));
823+
let finalRemoves = [...labelsToRemove].filter((label) => existingLabels.has(label));
824+
825+
const isGameOrEngineLabel = (label) => label.startsWith('game: ') || label.startsWith('engine: ');
826+
if ([...finalAdds, ...finalRemoves].some(isGameOrEngineLabel)) {
827+
try {
828+
const issueEvents = await github.paginate(github.rest.issues.listEvents, {
829+
owner,
830+
repo,
831+
issue_number: issueNumber,
832+
per_page: 100,
833+
});
834+
const lastManualLabelEvent = new Map();
835+
for (const e of issueEvents) {
836+
if (!['labeled', 'unlabeled'].includes(e.event) || !e.label?.name) continue;
837+
lastManualLabelEvent.set(e.label.name, e.actor?.type === 'Bot' ? null : e.event);
838+
}
839+
finalAdds = finalAdds.filter((label) => {
840+
if (!isGameOrEngineLabel(label) || lastManualLabelEvent.get(label) !== 'unlabeled') return true;
841+
console.log(`Label "${label}" was removed manually; not adding it back.`);
842+
return false;
843+
});
844+
finalRemoves = finalRemoves.filter((label) => {
845+
if (!isGameOrEngineLabel(label) || lastManualLabelEvent.get(label) !== 'labeled') return true;
846+
console.log(`Label "${label}" was added manually; keeping it.`);
847+
return false;
848+
});
849+
} catch (err) {
850+
console.log(`Could not read issue events: ${err.message}`);
851+
}
852+
}
824853
825854
for (const label of finalRemoves) {
826855
try {
@@ -2199,8 +2228,38 @@ jobs:
21992228
}
22002229
22012230
// Apply changes
2202-
const finalAdds = [...labelsToAdd].filter((label) => !existingLabels.has(label));
2203-
const finalRemoves = [...labelsToRemove].filter((label) => existingLabels.has(label));
2231+
let finalAdds = [...labelsToAdd].filter((label) => !existingLabels.has(label));
2232+
let finalRemoves = [...labelsToRemove].filter((label) => existingLabels.has(label));
2233+
2234+
const isGameOrEngineLabel = (label) => label.startsWith('game: ') || label.startsWith('engine: ');
2235+
if ([...finalAdds, ...finalRemoves].some(isGameOrEngineLabel)) {
2236+
try {
2237+
const issueEvents = await github.paginate(github.rest.issues.listEvents, {
2238+
owner,
2239+
repo,
2240+
issue_number: rawIssue.number,
2241+
per_page: 100,
2242+
});
2243+
const lastManualLabelEvent = new Map();
2244+
for (const e of issueEvents) {
2245+
if (!['labeled', 'unlabeled'].includes(e.event) || !e.label?.name) continue;
2246+
lastManualLabelEvent.set(e.label.name, e.actor?.type === 'Bot' ? null : e.event);
2247+
}
2248+
finalAdds = finalAdds.filter((label) => {
2249+
if (!isGameOrEngineLabel(label) || lastManualLabelEvent.get(label) !== 'unlabeled') return true;
2250+
console.log(`#${rawIssue.number}: "${label}" was removed manually; not adding it back`);
2251+
return false;
2252+
});
2253+
finalRemoves = finalRemoves.filter((label) => {
2254+
if (!isGameOrEngineLabel(label) || lastManualLabelEvent.get(label) !== 'labeled') return true;
2255+
console.log(`#${rawIssue.number}: "${label}" was added manually; keeping it`);
2256+
return false;
2257+
});
2258+
} catch (err) {
2259+
if (isApiRateLimitError(err)) throw err;
2260+
console.log(`#${rawIssue.number}: could not read issue events: ${err.message}`);
2261+
}
2262+
}
22042263
22052264
let labelAdded = 0;
22062265
let labelRemoved = 0;

0 commit comments

Comments
 (0)