d661fb49b8
The labeler only listened for issues.opened, so it judged a title exactly once. Reporters who omit the prefix are asked by the triage bot to add one, and the title they then fix is never looked at again, leaving a genuine bug report unlabelled until somebody notices it by hand. It now also runs on issues.edited. Body only edits return immediately, so the extra runs are limited to titles actually changing, and a bug label a maintainer has already removed is not restored: on an edit the issue events are checked for a previous removal first. The opened path is unchanged and makes no additional API call. The title pattern also required a delimiter after the bracket, so the bracketed form the comment advertises, "[Bug] something is broken", never matched unless it happened to be written "[Bug]: something is broken". Both forms match now, while "[bug/perf]" keeps matching and titles that merely mention the word, such as "[UI Bug]" or "fixed a typo", still do not.
70 lines
2.2 KiB
YAML
70 lines
2.2 KiB
YAML
name: Issue Labeler
|
|
|
|
on:
|
|
issues:
|
|
types: [opened, edited]
|
|
|
|
permissions:
|
|
issues: write
|
|
|
|
jobs:
|
|
label-bug-reports:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Add "bug" label to unlabeled bug reports
|
|
uses: actions/github-script@v7
|
|
with:
|
|
script: |
|
|
const issue = context.payload.issue;
|
|
|
|
// Web-form submissions already carry the label from the issue template
|
|
if (issue.labels.some((label) => label.name === 'bug')) {
|
|
return;
|
|
}
|
|
|
|
const isEdit = context.payload.action === 'edited';
|
|
const titleWasEdited = Boolean(context.payload.changes?.title);
|
|
|
|
if (isEdit && !titleWasEdited) {
|
|
return;
|
|
}
|
|
|
|
const title = issue.title ?? '';
|
|
const body = issue.body ?? '';
|
|
|
|
// Freeform bug reports: "issue: ...", "bug: ...", "fix: ...", "[Bug] ...", "issue/UX: ..."
|
|
const bugLikeTitle = /^\s*(\[\s*(bug|issue|fix)\b[^\]]*\]|(bug|issue|fix)\s*[:/\-])/i.test(title);
|
|
|
|
// API/CLI-created issues that reproduce the bug report form structure.
|
|
// Only headings distinctive to the bug form (both are required fields there) —
|
|
// generic headings like "Expected Behavior" also appear in freeform feature requests.
|
|
const bugFormBody = /###\s*(Installation Method|Open WebUI Version)/i.test(body);
|
|
|
|
if (!bugLikeTitle && !bugFormBody) {
|
|
return;
|
|
}
|
|
|
|
if (isEdit) {
|
|
const events = await github.paginate(github.rest.issues.listEvents, {
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number: issue.number,
|
|
per_page: 100
|
|
});
|
|
|
|
const bugLabelWasRemoved = events.some(
|
|
(event) => event.event === 'unlabeled' && event.label?.name === 'bug'
|
|
);
|
|
|
|
if (bugLabelWasRemoved) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
await github.rest.issues.addLabels({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number: issue.number,
|
|
labels: ['bug']
|
|
});
|