Spaces:
Running
on
Zero
Running
on
Zero
name: Close/Lock issues after inactivity | |
on: | |
schedule: | |
- cron: "0 0 * * *" | |
jobs: | |
close-issues-needs-more-info: | |
runs-on: ubuntu-latest | |
if: ${{ github.repository_owner == 'facebookresearch' }} | |
steps: | |
- name: Close old issues that need reply | |
uses: actions/github-script@v3 | |
with: | |
github-token: ${{secrets.GITHUB_TOKEN}} | |
# Modified from https://github.com/dwieeb/needs-reply | |
script: | | |
// Arguments available: | |
// - github: A pre-authenticated octokit/rest.js client | |
// - context: An object containing the context of the workflow run | |
// - core: A reference to the @actions/core package | |
// - io: A reference to the @actions/io package | |
const kLabelToCheck = "needs-more-info"; | |
const kInvalidLabel = "invalid/unrelated"; | |
const kDaysBeforeClose = 7; | |
const kMessage = "Requested information was not provided in 7 days, so we're closing this issue.\n\nPlease open new issue if information becomes available. Otherwise, use [github discussions](https://github.com/facebookresearch/detectron2/discussions) for free-form discussions." | |
issues = await github.issues.listForRepo({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
state: 'open', | |
labels: kLabelToCheck, | |
sort: 'updated', | |
direction: 'asc', | |
per_page: 30, | |
page: 1, | |
}); | |
issues = issues.data; | |
if (issues.length === 0) { | |
core.info('No more issues found to process. Exiting.'); | |
return; | |
} | |
for (const issue of issues) { | |
if (!!issue.pull_request) | |
continue; | |
core.info(`Processing issue #${issue.number}`); | |
let updatedAt = new Date(issue.updated_at).getTime(); | |
const numComments = issue.comments; | |
const comments = await github.issues.listComments({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: issue.number, | |
per_page: 30, | |
page: Math.floor((numComments - 1) / 30) + 1, // the last page | |
}); | |
const lastComments = comments.data | |
.map(l => new Date(l.created_at).getTime()) | |
.sort(); | |
if (lastComments.length > 0) { | |
updatedAt = lastComments[lastComments.length - 1]; | |
} | |
const now = new Date().getTime(); | |
const daysSinceUpdated = (now - updatedAt) / 1000 / 60 / 60 / 24; | |
if (daysSinceUpdated < kDaysBeforeClose) { | |
core.info(`Skipping #${issue.number} because it has been updated in the last ${daysSinceUpdated} days`); | |
continue; | |
} | |
core.info(`Closing #${issue.number} because it has not been updated in the last ${daysSinceUpdated} days`); | |
await github.issues.createComment({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: issue.number, | |
body: kMessage, | |
}); | |
const newLabels = numComments <= 2 ? [kInvalidLabel, kLabelToCheck] : issue.labels; | |
await github.issues.update({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: issue.number, | |
labels: newLabels, | |
state: 'closed', | |
}); | |
} | |
lock-issues-after-closed: | |
runs-on: ubuntu-latest | |
if: ${{ github.repository_owner == 'facebookresearch' }} | |
steps: | |
- name: Lock closed issues that have no activity for a while | |
uses: dessant/lock-threads@v2 | |
with: | |
github-token: ${{ github.token }} | |
issue-lock-inactive-days: '300' | |
process-only: 'issues' | |
issue-exclude-labels: 'enhancement,bug,documentation' | |