#!/usr/bin/env bash # This script checks if the current branch name follows the specified format. # It's designed to be used as a 'pre-commit' git hook. # Format: / # Example: feat/add-user-login # --- Configuration --- # An array of allowed commit types ALLOWED_TYPES=(feat fix refactor perf style test docs build chore revert) # An array of branches to ignore IGNORED_BRANCHES=(main dev demo) # --- Colors for Output --- RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # --- Helper Functions --- error_exit() { echo -e "${RED}ERROR: $1${NC}" >&2 echo -e "${YELLOW}Branch name format is incorrect. Aborting commit.${NC}" >&2 exit 1 } # --- Main Logic --- # 1. Get the current branch name BRANCH_NAME=$(git symbolic-ref --short HEAD) # 2. Check if the current branch is in the ignored list for ignored_branch in "${IGNORED_BRANCHES[@]}"; do if [ "$BRANCH_NAME" == "$ignored_branch" ]; then echo -e "${GREEN}Branch check skipped for default branch: $BRANCH_NAME${NC}" exit 0 fi done # 3. Validate the overall structure: / if ! [[ "$BRANCH_NAME" =~ ^[a-z]+/.+$ ]]; then error_exit "Branch name must be in the format: /\nExample: feat/add-user-login" fi # 4. Extract the type and description TYPE=$(echo "$BRANCH_NAME" | cut -d'/' -f1) DESCRIPTION=$(echo "$BRANCH_NAME" | cut -d'/' -f2-) # 5. Validate the type_valid=false for allowed_type in "${ALLOWED_TYPES[@]}"; do if [ "$TYPE" == "$allowed_type" ]; then type_valid=true break fi done if [ "$type_valid" == false ]; then error_exit "Invalid type '$TYPE'.\nAllowed types are: ${ALLOWED_TYPES[*]}" fi # 6. Validate the # Regex breakdown: # ^[a-z0-9]+ - Starts with one or more lowercase letters/numbers (the first word). # (-[a-z0-9]+){0,5} - Followed by a group of (dash + word) 0 to 5 times. # $ - End of the string. # This entire pattern enforces 1 to 6 words total, separated by dashes. DESCRIPTION_REGEX="^[a-z0-9]+(-[a-z0-9]+){0,5}$" if ! [[ "$DESCRIPTION" =~ $DESCRIPTION_REGEX ]]; then error_exit "Invalid short description '$DESCRIPTION'.\nIt must be a maximum of 6 words, all lowercase, separated by dashes.\nExample: add-new-user-authentication-feature" fi # If all checks pass, exit successfully echo -e "${GREEN}Branch name '$BRANCH_NAME' is valid.${NC}" exit 0