From c50cdd62706ed00a2bb9e1201ac8aac1b71e9a16 Mon Sep 17 00:00:00 2001 From: dundargoc <33953936+dundargoc@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:07:44 +0200 Subject: ci: replace stale bot with custom implementation The stale action has a bug where it won't close an issue/PR if it has comments after the stale label. --- .github/scripts/close_unresponsive.js | 50 ++++++++++++++++++++++++++++++++ .github/scripts/remove_response_label.js | 19 ++++++++++++ .github/scripts/unstale.js | 19 ------------ 3 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 .github/scripts/close_unresponsive.js create mode 100644 .github/scripts/remove_response_label.js delete mode 100644 .github/scripts/unstale.js (limited to '.github/scripts') diff --git a/.github/scripts/close_unresponsive.js b/.github/scripts/close_unresponsive.js new file mode 100644 index 0000000000..b7a92207ba --- /dev/null +++ b/.github/scripts/close_unresponsive.js @@ -0,0 +1,50 @@ +function labeledEvent(data) { + return data.event === "labeled" && data.label.name === "needs:response"; +} + +const numberOfDaysLimit = 30; +const close_message = `This has been closed since a request for information has \ +not been answered for ${numberOfDaysLimit} days. It can be reopened when the \ +requested information is provided.`; + +module.exports = async ({ github, context }) => { + const owner = context.repo.owner; + const repo = context.repo.repo; + + const issues = await github.rest.issues.listForRepo({ + owner: owner, + repo: repo, + labels: "needs:response", + }); + const numbers = issues.data.map((e) => e.number); + + for (const number of numbers) { + const timeline = await github.rest.issues.listEventsForTimeline({ + owner: owner, + repo: repo, + issue_number: number, + }); + const data = timeline.data.filter(labeledEvent); + const latest_response_label = data[data.length - 1]; + const created_at = new Date(latest_response_label.created_at); + const now = new Date(); + const diff = now - created_at; + const diffDays = diff / (1000 * 60 * 60 * 24); + + if (diffDays > numberOfDaysLimit) { + github.rest.issues.update({ + owner: owner, + repo: repo, + issue_number: number, + state: "closed", + }); + + github.rest.issues.createComment({ + owner: owner, + repo: repo, + issue_number: number, + body: close_message, + }); + } + } +}; diff --git a/.github/scripts/remove_response_label.js b/.github/scripts/remove_response_label.js new file mode 100644 index 0000000000..f645fca5cb --- /dev/null +++ b/.github/scripts/remove_response_label.js @@ -0,0 +1,19 @@ +module.exports = async ({ github, context }) => { + const commenter = context.actor; + const issue = await github.rest.issues.get({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + const author = issue.data.user.login; + const labels = issue.data.labels.map((e) => e.name); + + if (author === commenter && labels.includes("needs:response")) { + github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + name: "needs:response", + }); + } +}; diff --git a/.github/scripts/unstale.js b/.github/scripts/unstale.js deleted file mode 100644 index f645fca5cb..0000000000 --- a/.github/scripts/unstale.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = async ({ github, context }) => { - const commenter = context.actor; - const issue = await github.rest.issues.get({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - }); - const author = issue.data.user.login; - const labels = issue.data.labels.map((e) => e.name); - - if (author === commenter && labels.includes("needs:response")) { - github.rest.issues.removeLabel({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - name: "needs:response", - }); - } -}; -- cgit