name: Check Commit Messages

on:
  pull_request:
  push:
    branches:
      - '!master' 

jobs:
  check-commit-message:
    runs-on: docker 
    container:
      image: node:16-bullseye

    steps:
      - name: Checkout Code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # Fetch the entire history to analyze commit messages

      - name: Check Subject Beginning
        run: |
          echo "Checking if the subject starts correctly..."
          commit_message=$(git log -1 --pretty=%B)
          if ! echo "$commit_message" | grep -Eq "^([A-Z]|\S+:|git subrepo (clone|pull))"; then
            echo "Error: The subject does not start with a capital letter, a tag, or a valid 'git subrepo' command."
            exit 1
          fi
          echo "Subject start check passed."

      - name: Check Subject Length
        run: |
          echo "Checking subject length..."
          commit_subject=$(git log -1 --pretty=%B | head -n 1)
          if [ ${#commit_subject} -gt 72 ]; then
            echo "Error: Commit message subject exceeds 72 characters."
            exit 1
          fi
          echo "Subject length check passed."

      - name: Check Subject Ending
        run: |
          echo "Checking subject ending..."
          commit_subject=$(git log -1 --pretty=%B | head -n 1)
          if echo "$commit_subject" | grep -q "\.$"; then
            echo "Error: Commit message subject should not end with a dot."
            exit 1
          fi
          echo "Subject ending check passed."

      - name: Check Empty Line After Title
        run: |
          echo "Checking for an empty line after the title..."
          commit_body=$(git log -1 --pretty=%B | tail -n +2)
          if [ -n "$commit_body" ] && ! echo "$commit_body" | grep -q "^$"; then
            echo "Error: There must be an empty line between the title and description."
            exit 1
          fi
          echo "Empty line check passed."