mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2025-12-24 20:42:43 +00:00
104 lines
3.5 KiB
YAML
104 lines
3.5 KiB
YAML
name: Limit pull requests
|
|
description: >
|
|
Limit the number of open pull requests to the repository created by a user
|
|
author: ZhongRuoyu (from Homebrew repository)
|
|
branding:
|
|
icon: alert-triangle
|
|
color: yellow
|
|
|
|
inputs:
|
|
token:
|
|
description: GitHub token
|
|
required: false
|
|
default: ${{ github.token }}
|
|
except-users:
|
|
description: The users exempted from the limit, one per line
|
|
required: false
|
|
# https://docs.github.com/en/graphql/reference/enums#commentauthorassociation
|
|
except-author-associations:
|
|
description: The author associations exempted from the limit, one per line
|
|
required: false
|
|
comment-limit:
|
|
description: >
|
|
Post the comment when the user's number of open pull requests exceeds this
|
|
number and `comment` is not empty
|
|
required: true
|
|
default: "10"
|
|
comment:
|
|
description: The comment to post when the limit is reached
|
|
required: false
|
|
close-limit:
|
|
description: >
|
|
Close the pull request when the user's number of open pull requests
|
|
exceeds this number and `close` is set to `true`
|
|
required: true
|
|
default: "50"
|
|
close:
|
|
description: Whether to close the pull request when the limit is reached
|
|
required: true
|
|
default: "false"
|
|
|
|
runs:
|
|
using: composite
|
|
steps:
|
|
- name: Check the number of pull requests
|
|
id: count-pull-requests
|
|
run: |
|
|
# If the user is exempted, assume they have no pull requests.
|
|
if grep -Fiqx '${{ github.actor }}' <<<"$EXCEPT_USERS"; then
|
|
echo "::notice::@${{ github.actor }} is exempted from the limit."
|
|
echo "count=0" >>"$GITHUB_OUTPUT"
|
|
exit 0
|
|
fi
|
|
if grep -Fiqx '${{ github.event.pull_request.author_association }}' <<<"$EXCEPT_AUTHOR_ASSOCIATIONS"; then
|
|
echo "::notice::@{{ github.actor }} is a ${{ github.event.pull_request.author_association }} exempted from the limit."
|
|
echo "count=0" >>"$GITHUB_OUTPUT"
|
|
exit 0
|
|
fi
|
|
|
|
count="$(
|
|
gh api \
|
|
--method GET \
|
|
--header 'Accept: application/vnd.github+json' \
|
|
--header 'X-GitHub-Api-Version: 2022-11-28' \
|
|
--field state=open \
|
|
--paginate \
|
|
'/repos/{owner}/{repo}/pulls' |
|
|
jq \
|
|
--raw-output \
|
|
--arg USER '${{ github.actor }}' \
|
|
'map(select(.user.login == $USER)) | length'
|
|
)"
|
|
echo "::notice::@${{ github.actor }} has $count open pull request(s)."
|
|
echo "count=$count" >>"$GITHUB_OUTPUT"
|
|
env:
|
|
GH_REPO: ${{ github.repository }}
|
|
GH_TOKEN: ${{ inputs.token }}
|
|
EXCEPT_USERS: ${{ inputs.except-users }}
|
|
EXCEPT_AUTHOR_ASSOCIATIONS: ${{ inputs.except-author-associations }}
|
|
shell: bash
|
|
|
|
- name: Comment on pull request
|
|
if: >
|
|
fromJSON(steps.count-pull-requests.outputs.count) > fromJSON(inputs.comment-limit) &&
|
|
inputs.comment != ''
|
|
run: |
|
|
gh pr comment '${{ github.event.pull_request.number }}' \
|
|
--body="${COMMENT_BODY}"
|
|
env:
|
|
GH_REPO: ${{ github.repository }}
|
|
GH_TOKEN: ${{ inputs.token }}
|
|
COMMENT_BODY: ${{ inputs.comment }}
|
|
shell: bash
|
|
|
|
- name: Close pull request
|
|
if: >
|
|
fromJSON(steps.count-pull-requests.outputs.count) > fromJSON(inputs.close-limit) &&
|
|
inputs.close == 'true'
|
|
run: |
|
|
gh pr close '${{ github.event.pull_request.number }}'
|
|
env:
|
|
GH_REPO: ${{ github.repository }}
|
|
GH_TOKEN: ${{ inputs.token }}
|
|
shell: bash
|