diff --git a/.github/workflows/needs-more-info-timer.yml b/.github/workflows/needs-more-info-timer.yml index 65ee532e..c53cdd5c 100644 --- a/.github/workflows/needs-more-info-timer.yml +++ b/.github/workflows/needs-more-info-timer.yml @@ -8,24 +8,91 @@ on: workflow_dispatch: jobs: - manage-needs-more-info: + # When a non-bot user comments on a needs-more-info issue, remove the label. + remove-label-on-response: if: >- github.repository == 'juanfont/headscale' && - (github.event_name != 'issue_comment' || github.event.comment.user.type != 'Bot') + github.event_name == 'issue_comment' && + github.event.comment.user.type != 'Bot' && + contains(github.event.issue.labels.*.name, 'needs-more-info') runs-on: ubuntu-latest permissions: issues: write steps: - - name: Manage needs-more-info issues - uses: tiangolo/issue-manager@2fb3484ec9279485df8659e8ec73de262431737d # v0.6.0 + - name: Remove needs-more-info label + run: gh issue edit "$NUMBER" --remove-label needs-more-info + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.issue.number }} + + # On schedule, close issues that have had no human response for 3 days. + close-stale: + if: >- + github.repository == 'juanfont/headscale' && + github.event_name != 'issue_comment' + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - uses: hustcer/setup-nu@920172d92eb04671776f3ba69d605d3b09351c30 # v3.22 with: - token: ${{ secrets.GITHUB_TOKEN }} - config: > - { - "needs-more-info": { - "delay": "P3D", - "message": "This issue has been automatically closed because no additional information was provided within 3 days.\n\nIf you now have the requested information, please feel free to reopen this issue and provide the details. We're happy to help once we have enough context to investigate.\n\nThank you for your understanding.", - "remove_label_on_comment": true, - "remove_label_on_close": true - } + version: "*" + + - name: Close stale needs-more-info issues + shell: nu {0} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + run: | + let issues = (gh issue list + --repo $env.GH_REPO + --label "needs-more-info" + --state open + --json number + | from json) + + for issue in $issues { + let number = $issue.number + print $"Checking issue #($number)" + + # Find when needs-more-info was last added + let events = (gh api $"repos/($env.GH_REPO)/issues/($number)/events" + --paginate | from json | flatten) + let label_event = ($events + | where event == "labeled" and label.name == "needs-more-info" + | last) + let label_added_at = ($label_event.created_at | into datetime) + + # Check for non-bot comments after the label was added + let comments = (gh api $"repos/($env.GH_REPO)/issues/($number)/comments" + --paginate | from json | flatten) + let human_responses = ($comments + | where user.type != "Bot" + | where { ($in.created_at | into datetime) > $label_added_at }) + + if ($human_responses | length) > 0 { + print $" Human responded, removing label" + gh issue edit $number --repo $env.GH_REPO --remove-label needs-more-info + continue } + + # Check if 3 days have passed + let elapsed = (date now) - $label_added_at + if $elapsed < 3day { + print $" Only ($elapsed | format duration day) elapsed, skipping" + continue + } + + print $" No response for ($elapsed | format duration day), closing" + let message = [ + "This issue has been automatically closed because no additional information was provided within 3 days." + "" + "If you have the requested information, please open a new issue and include the debug information requested above." + "" + "Thank you for your understanding." + ] | str join "\n" + gh issue comment $number --repo $env.GH_REPO --body $message + gh issue close $number --repo $env.GH_REPO --reason "not planned" + gh issue edit $number --repo $env.GH_REPO --remove-label needs-more-info + }