Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build: automatically close stale issues that have not responded an info for request #5297

Merged
merged 10 commits into from
May 31, 2024
55 changes: 55 additions & 0 deletions .github/scripts/close-unresponse.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
function labeledEvent(data) {
return data.event === "labeled" && data.label.name === "needs more info";
}

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.`;

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,
});
danielbankhead marked this conversation as resolved.
Show resolved Hide resolved
}
}
};
19 changes: 19 additions & 0 deletions .github/scripts/remove-response-label.js
Original file line number Diff line number Diff line change
@@ -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({
danielbankhead marked this conversation as resolved.
Show resolved Hide resolved
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
name: "needs more info",
});
}
};
35 changes: 35 additions & 0 deletions .github/workflows/response.yml
Original file line number Diff line number Diff line change
@@ -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})
Loading