diff --git a/.github/workflows/pr-closer.yml b/.github/workflows/pr-closer.yml new file mode 100644 index 0000000..7c0cc80 --- /dev/null +++ b/.github/workflows/pr-closer.yml @@ -0,0 +1,31 @@ +name: pr-closer + +on: + schedule: + - cron: "0 0 * * *" # daily at midnight + workflow_dispatch: + +jobs: + close-stale-prs: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Close stale PRs + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr list -R "${{ github.repository }}" --state open --json number,author,labels,updatedAt,statusCheckRollup --limit 100 | \ + jq -r '.[] | select( + (.updatedAt | fromdateiso8601) < (now - 30*24*60*60) and + .author.login != "jdx" and + ([.labels[].name] | index("keep-open") | not) + ) | [.number, (if (.statusCheckRollup | length > 0) and (.statusCheckRollup | any(.conclusion == "FAILURE" or .conclusion == "failure")) then "failing" else "passing" end)] | @tsv' | \ + while read -r pr status; do + echo "Closing PR #$pr (checks: $status)" + if [ "$status" = "failing" ]; then + gh pr close "$pr" -R "${{ github.repository }}" -c "This PR has been open for more than 30 days without activity. Note: CI checks were failing, which may be why it wasn't reviewed. Feel free to reopen or create a new PR if you'd like to continue working on this." + else + gh pr close "$pr" -R "${{ github.repository }}" -c "This PR has been open for more than 30 days without activity. Feel free to reopen or create a new PR if you'd like to continue working on this." + fi + done