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 ! [[ "$commit_message" =~ ^([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 Commit Message Type and Format run: | echo "Checking commit message type and format..." commit_message=$(git log -1 --pretty=%B) if ! [[ "$commit_message" =~ ^(feat|fix|chore|docs|style|refactor|test|perf): ]]; then echo "Error: Commit message does not follow the required format: : " exit 1 fi echo "Commit message type and format 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 [[ "$commit_subject" =~ \.$ ]]; 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" && ! "$commit_body" =~ ^$ ]]; then echo "Error: There must be an empty line between the title and description." exit 1 fi echo "Empty line check passed."