|
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}} |
|
|
|
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 |
|
|
|
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 |
|
continue; |
|
} |
|
core.info(`Closing |
|
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' |
|
|