From 8776997739196e368fcb1148d399e9e582882b0d Mon Sep 17 00:00:00 2001 From: Sofia Leon Date: Tue, 30 Apr 2024 13:03:41 -0400 Subject: [PATCH 1/5] build: automatically close stale issues that have not responded an info for request --- .github/scripts/close-unresponse.js | 55 ++++++++++++++++++++++++ .github/scripts/remove-response-label.js | 19 ++++++++ .github/workflows/response.yml | 35 +++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 .github/scripts/close-unresponse.js create mode 100644 .github/scripts/remove-response-label.js create mode 100644 .github/workflows/response.yml diff --git a/.github/scripts/close-unresponse.js b/.github/scripts/close-unresponse.js new file mode 100644 index 00000000000..6e1205ff52d --- /dev/null +++ b/.github/scripts/close-unresponse.js @@ -0,0 +1,55 @@ +function labeledEvent(data) { + return data.event === "labeled" && data.label.name === "needs more info"; + } + + 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 more info", + }); + const numbers = issues.data.map((e) => e.number); + + for (const number of numbers) { + const events = await github.paginate( + github.rest.issues.listEventsForTimeline, + { + owner: owner, + repo: repo, + issue_number: number, + }, + (response) => response.data.filter(labeledEvent) + ); + + const latest_response_label = events[events.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, + }); + } + } + }; \ No newline at end of file diff --git a/.github/scripts/remove-response-label.js b/.github/scripts/remove-response-label.js new file mode 100644 index 00000000000..f6b877cc82a --- /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 more info")) { + github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + name: "needs more info", + }); + } + }; \ No newline at end of file diff --git a/.github/workflows/response.yml b/.github/workflows/response.yml new file mode 100644 index 00000000000..7f4e3141d62 --- /dev/null +++ b/.github/workflows/response.yml @@ -0,0 +1,35 @@ +name: no_response +on: + schedule: + - cron: '30 1 * * *' # Run every day at 01:30 + workflow_dispatch: + issue_comment: + +jobs: + close: + if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + - uses: actions/github-script@v7 + with: + script: | + const script = require('./.github/scripts/close-unresponsive.js') + await script({github, context}) + + remove_label: + if: github.event_name == 'issue_comment' + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + - uses: actions/github-script@v7 + with: + script: | + const script = require('./.github/scripts/remove-response-label.js') + await script({github, context}) \ No newline at end of file From ed795773d59d18152fa93ecd2191b5912befea91 Mon Sep 17 00:00:00 2001 From: sofisl <55454395+sofisl@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:16:15 -0400 Subject: [PATCH 2/5] Update close-unresponse.js --- .github/scripts/close-unresponse.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/scripts/close-unresponse.js b/.github/scripts/close-unresponse.js index 6e1205ff52d..2235bcc88c4 100644 --- a/.github/scripts/close-unresponse.js +++ b/.github/scripts/close-unresponse.js @@ -2,7 +2,7 @@ function labeledEvent(data) { return data.event === "labeled" && data.label.name === "needs more info"; } - const numberOfDaysLimit = 30; + const numberOfDaysLimit = 15; 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.`; @@ -52,4 +52,4 @@ function labeledEvent(data) { }); } } - }; \ No newline at end of file + }; From 4a519db66be20f67aed6da85acbb8493cb6bd460 Mon Sep 17 00:00:00 2001 From: Sofia Leon Date: Thu, 30 May 2024 16:16:47 -0700 Subject: [PATCH 3/5] chore: add await --- .github/scripts/close-unresponse.js | 4 ++-- .github/scripts/remove-response-label.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/scripts/close-unresponse.js b/.github/scripts/close-unresponse.js index 6e1205ff52d..d724a8122a5 100644 --- a/.github/scripts/close-unresponse.js +++ b/.github/scripts/close-unresponse.js @@ -37,14 +37,14 @@ function labeledEvent(data) { const diffDays = diff / (1000 * 60 * 60 * 24); if (diffDays > numberOfDaysLimit) { - github.rest.issues.update({ + await github.rest.issues.update({ owner: owner, repo: repo, issue_number: number, state: "closed", }); - github.rest.issues.createComment({ + await github.rest.issues.createComment({ owner: owner, repo: repo, issue_number: number, diff --git a/.github/scripts/remove-response-label.js b/.github/scripts/remove-response-label.js index f6b877cc82a..e1402a626fe 100644 --- a/.github/scripts/remove-response-label.js +++ b/.github/scripts/remove-response-label.js @@ -9,7 +9,7 @@ module.exports = async ({ github, context }) => { const labels = issue.data.labels.map((e) => e.name); if (author === commenter && labels.includes("needs more info")) { - github.rest.issues.removeLabel({ + await github.rest.issues.removeLabel({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, From 0214f714b29f2f43fbcaf8cf4cf3dd79b195475b Mon Sep 17 00:00:00 2001 From: sofisl <55454395+sofisl@users.noreply.github.com> Date: Thu, 30 May 2024 18:48:48 -0700 Subject: [PATCH 4/5] Update close-unresponse.js --- .github/scripts/close-unresponse.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/scripts/close-unresponse.js b/.github/scripts/close-unresponse.js index cda7c6f812a..d972763346e 100644 --- a/.github/scripts/close-unresponse.js +++ b/.github/scripts/close-unresponse.js @@ -1,3 +1,17 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + function labeledEvent(data) { return data.event === "labeled" && data.label.name === "needs more info"; } From 7716d16ca5691fa6511f991ad5b784f746d1f029 Mon Sep 17 00:00:00 2001 From: sofisl <55454395+sofisl@users.noreply.github.com> Date: Thu, 30 May 2024 18:49:06 -0700 Subject: [PATCH 5/5] Update remove-response-label.js --- .github/scripts/remove-response-label.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/scripts/remove-response-label.js b/.github/scripts/remove-response-label.js index e1402a626fe..b501cc89d5f 100644 --- a/.github/scripts/remove-response-label.js +++ b/.github/scripts/remove-response-label.js @@ -1,3 +1,17 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + module.exports = async ({ github, context }) => { const commenter = context.actor; const issue = await github.rest.issues.get({ @@ -16,4 +30,4 @@ module.exports = async ({ github, context }) => { name: "needs more info", }); } - }; \ No newline at end of file + };