diff --git a/.github/workflows/close-issue.yml b/.github/workflows/close-issue.yml index 67717d4..2250c98 100644 --- a/.github/workflows/close-issue.yml +++ b/.github/workflows/close-issue.yml @@ -17,26 +17,49 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, state: 'open', + per_page: 100, }); const now = new Date().getTime(); const inactivePeriod = 7 * 24 * 60 * 60 * 1000; // 7 days for (const issue of issues) { - const lastUpdated = new Date(issue.updated_at).getTime(); - - // if the issue hasn't been updated in the past week, close it - if (now - lastUpdated > inactivePeriod && issue.labels.length === 0) { - console.log(`Closing inactive issue: ${issue.number} (No labels)`); + // skip pull requests (they are also returned by listForRepo) + if (issue.pull_request) continue; + + // skip labeled issues + if (issue.labels.length > 0) { + console.log(`Skipping issue #${issue.number} (Has labels).`); + continue; + } + + // fetch comments for this issue + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + per_page: 100, + }); + + // determine the "last activity" time + let lastActivityTime; + if (comments.length > 0) { + const lastComment = comments[comments.length - 1]; + lastActivityTime = new Date(lastComment.updated_at).getTime(); + } else { + lastActivityTime = new Date(issue.created_at).getTime(); + } + + // check inactivity + if (now - lastActivityTime > inactivePeriod) { + console.log(`Closing inactive issue: #${issue.number} (No recent replies for 7 days)`); await github.rest.issues.update({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, state: 'closed', }); - } else if (issue.labels.length === 0) { - console.log(`Skipping issue ${issue.number} (No labels) as it has been recently updated.`); } else { - console.log(`Skipping issue ${issue.number} (Has labels).`); + console.log(`Skipping issue #${issue.number} (Active within 7 days).`); } }