Pull Request Labeler #791
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: "Pull Request Labeler" | |
on: | |
pull_request_review: | |
types: [submitted] | |
pull_request_review_comment: | |
types: [created, deleted] | |
pull_request_target: | |
types: [opened, edited, reopened, synchronize] | |
jobs: | |
labeler: | |
permissions: | |
contents: read | |
pull-requests: write | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Labeler | |
uses: actions/labeler@v5 | |
with: | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Fetch all branches | |
run: git fetch --all | |
- name: Determine base and head branches | |
id: branches | |
run: | | |
base_branch=$(jq -r '.pull_request.base.ref' "$GITHUB_EVENT_PATH") | |
head_branch=$(jq -r '.pull_request.head.ref' "$GITHUB_EVENT_PATH") | |
echo $base_branch | |
echo $head_branch | |
echo "base_branch=$base_branch" >> $GITHUB_ENV | |
echo "head_branch=$head_branch" >> $GITHUB_ENV | |
- name: Calculate diff size | |
id: diff | |
env: | |
BASE_BRANCH: ${{ env.base_branch }} | |
HEAD_BRANCH: ${{ env.head_branch }} | |
run: | | |
echo $BASE_BRANCH | |
echo $HEAD_BRANCH | |
git checkout $HEAD_BRANCH | |
git fetch origin $BASE_BRANCH | |
diff_output=$(git diff --shortstat origin/$BASE_BRANCH...$HEAD_BRANCH) | |
echo $diff_output | |
insertions=$(echo $diff_output | awk '{print ($4 == "" ? 0 : $4)}') | |
deletions=$(echo $diff_output | awk '{print ($6 == "" ? 0 : $6)}') | |
changed_lines=$((insertions + deletions)) | |
echo $changed_lines | |
echo "changed_lines=$changed_lines" >> $GITHUB_ENV | |
- name: Determine label | |
env: | |
CHANGED_LINES: ${{ env.changed_lines }} | |
id: label | |
run: | | |
changed_lines=$CHANGED_LINES | |
if [ "$changed_lines" -le 9 ]; then | |
label="size:s" | |
elif [ "$changed_lines" -le 50 ]; then | |
label="size:m" | |
elif [ "$changed_lines" -le 100 ]; then | |
label="size:l" | |
elif [ "$changed_lines" -le 500 ]; then | |
label="size:xl" | |
else | |
label="size:xxl" | |
fi | |
echo "label=$label" >> $GITHUB_ENV | |
- name: Fetch current labels | |
id: fetch_labels | |
uses: actions/github-script@v7 | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
const { data: labels } = await github.rest.issues.listLabelsOnIssue({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: context.issue.number, | |
}); | |
return labels.map(label => label.name); | |
- name: Remove old size labels | |
id: remove_labels | |
uses: actions/github-script@v7 | |
env: | |
NEW_SIZE_LABEL: ${{ env.label }} | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
const sizeLabels = ['size:s', 'size:m', 'size:l', 'size:xl', 'size:xxl']; | |
const newLabel = "${{ env.NEW_SIZE_LABEL }}"; | |
const currentLabels = ${{ steps.fetch_labels.outputs.result }}; | |
const labelsToRemove = currentLabels.filter(label => sizeLabels.includes(label) && label !== newLabel); | |
for (const label of labelsToRemove) { | |
await github.rest.issues.removeLabel({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: context.issue.number, | |
name: label, | |
}); | |
} | |
- name: Add label to PR | |
uses: actions-ecosystem/action-add-labels@v1 | |
with: | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
labels: ${{ env.label }} | |
add_lgtm_label: | |
runs-on: ubuntu-latest | |
if: github.event.review.state == 'APPROVED' | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Add LGTM label | |
uses: actions-ecosystem/action-add-labels@v1 | |
with: | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
labels: lgtm |