diff --git a/.github/workflows/semantic-pull-request.yml b/.github/workflows/semantic-pull-request.yml index 1cb02b17..901c6917 100644 --- a/.github/workflows/semantic-pull-request.yml +++ b/.github/workflows/semantic-pull-request.yml @@ -1,4 +1,4 @@ -name: "Lint PR" +name: 'Lint PR' on: pull_request: @@ -9,10 +9,10 @@ on: - reopened permissions: - pull-requests: read + pull-requests: write jobs: - main: + lint: name: Validate PR title runs-on: ubuntu-latest steps: @@ -39,4 +39,70 @@ jobs: resourcetype version client - requireScope: false \ No newline at end of file + requireScope: false + + label: + name: Manage labels + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MINOR_LABEL: 'minor' + MINOR_LABEL_COLOR: '#FBCA04' + MAJOR_LABEL: 'major' + MAJOR_LABEL_COLOR: '#D93F0B' + PATCH_LABEL: 'patch' + PATCH_LABEL_COLOR: '#C5DEF5' + steps: + - name: Check out the repository + uses: actions/checkout@v4 + - name: Create labels if they do not exist + run: | + EXISTING_LABELS=$(gh label list --json name --jq '.[].name') + + if ! echo "$EXISTING_LABELS" | grep -q "$MINOR_LABEL"; then + gh label create "$MINOR_LABEL" --color "$MINOR_LABEL_COLOR" + fi + + if ! echo "$EXISTING_LABELS" | grep -q "$MAJOR_LABEL"; then + gh label create "$MAJOR_LABEL" --color "$MAJOR_LABEL_COLOR" + fi + + if ! echo "$EXISTING_LABELS" | grep -q "$PATCH_LABEL"; then + gh label create "$PATCH_LABEL" --color "$PATCH_LABEL_COLOR" + fi + - name: Manage labels based on PR title + run: | + TITLE=$(jq -r '.pull_request.title' < "$GITHUB_EVENT_PATH") + PR_NUMBER=${{ github.event.pull_request.number }} + + LABELS=$(gh pr view $PR_NUMBER --json labels --jq '.labels[].name') + + HAS_MINOR_LABEL=$(echo "$LABELS" | grep -q "$MINOR_LABEL" && echo "true" || echo "false") + HAS_MAJOR_LABEL=$(echo "$LABELS" | grep -q "$MAJOR_LABEL" && echo "true" || echo "false") + HAS_PATCH_LABEL=$(echo "$LABELS" | grep -q "$PATCH_LABEL" && echo "true" || echo "false") + + if [ "$HAS_MAJOR_LABEL" == "true" ]; then + if [ "$HAS_PATCH_LABEL" == "true" ];then + gh pr edit $PR_NUMBER --remove-label "$PATCH_LABEL" + fi + if [ "$HAS_MINOR_LABEL" == "true" ];then + gh pr edit $PR_NUMBER --remove-label "$MINOR_LABEL" + fi + exit 0 + fi + + if [[ $TITLE =~ ^feat.* ]]; then + if [ "$HAS_MINOR_LABEL" == "false" ];then + gh pr edit $PR_NUMBER --add-label "$MINOR_LABEL" + fi + if [ "$HAS_PATCH_LABEL" == "true" ];then + gh pr edit $PR_NUMBER --remove-label "$PATCH_LABEL" + fi + else + if [ "$HAS_PATCH_LABEL" == "false" ];then + gh pr edit $PR_NUMBER --add-label "$PATCH_LABEL" + fi + if [ "$HAS_MINOR_LABEL" == "true" ];then + gh pr edit $PR_NUMBER --remove-label "$MINOR_LABEL" + fi + fi