Moved the git hooks into shell scripts and placed them into the pre-commit configuration. Also extended robustness of the hooks. ref: N25B-241
78 lines
2.4 KiB
Bash
Executable File
78 lines
2.4 KiB
Bash
Executable File
#!/bin/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: <type>/<short-description>
|
|
# 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)
|
|
|
|
# --- 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: <type>/<description>
|
|
if ! [[ "$BRANCH_NAME" =~ ^[a-z]+/.+$ ]]; then
|
|
error_exit "Branch name must be in the format: <type>/<short-description>\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>
|
|
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 <short-description>
|
|
# 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
|