diff --git a/.github/workflows/pr-labels.yaml b/.github/workflows/pr-labels.yaml new file mode 100644 index 0000000000..82f9ac97d1 --- /dev/null +++ b/.github/workflows/pr-labels.yaml @@ -0,0 +1,56 @@ +name: Manage labels based on PR body + +on: + pull_request_target: + types: [opened, edited, reopened, synchronize] + +jobs: + manage-labels: + runs-on: ubuntu-latest + steps: + - name: Analyze PR Body and manage labels + shell: bash + run: | + body=$(jq -r '.pull_request.body' "$GITHUB_EVENT_PATH") + labels_to_add=() + labels_to_remove=() + declare -A label_checks=( + ["New feature"]="enhancement" + ["Bug fix|Hotfix|Security patch"]="bug" + ["Documentation update"]="documentation" + ["Refactoring"]="refactor" + ["UI/UX improvement"]="UI/UX" + ) + for pattern in "${!label_checks[@]}"; do + label="${label_checks[$pattern]}" + if echo "$body" | grep -Eq "\- \[x\] ($pattern)"; then + labels_to_add+=("$label") + else + labels_to_remove+=("$label") + fi + done + + echo "LABELS_TO_ADD=$(IFS=,; echo "${labels_to_add[*]}")" >> $GITHUB_ENV + echo "LABELS_TO_REMOVE=$(IFS=,; echo "${labels_to_remove[*]}")" >> $GITHUB_ENV + + - name: Add labels if necessary + if: env.LABELS_TO_ADD != '' + run: | + IFS=',' read -ra labels <<< "${LABELS_TO_ADD}" + for label in "${labels[@]}"; do + curl -s -X POST \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + -d "{\"labels\": [\"$label\"]}" \ + https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels + done + - name: Remove labels if necessary + if: env.LABELS_TO_REMOVE != '' + run: | + IFS=',' read -ra labels <<< "${LABELS_TO_REMOVE}" + for label in "${labels[@]}"; do + curl -s -X DELETE \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels/$label + done