57 lines
1.6 KiB
Bash
57 lines
1.6 KiB
Bash
#!/bin/bash
|
|
# Commit message validation hook
|
|
# Validates conventional commit format
|
|
# Install: ./scripts/setup-hooks.sh
|
|
|
|
set -e
|
|
|
|
COMMIT_MSG_FILE="$1"
|
|
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
NC='\033[0m'
|
|
|
|
# Conventional commit pattern:
|
|
# type(scope): description
|
|
# Types: feat, fix, docs, style, refactor, test, chore, perf, ci, build, revert
|
|
PATTERN='^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert)(\([a-z0-9-]+\))?: .{1,100}$'
|
|
|
|
# Also allow merge commits and WIP commits
|
|
if echo "$COMMIT_MSG" | grep -qE "^(Merge|WIP|fixup!|squash!)"; then
|
|
exit 0
|
|
fi
|
|
|
|
# Check first line of commit message
|
|
FIRST_LINE=$(echo "$COMMIT_MSG" | head -n1)
|
|
|
|
if ! echo "$FIRST_LINE" | grep -qE "$PATTERN"; then
|
|
echo -e "${RED}ERROR: Invalid commit message format${NC}"
|
|
echo ""
|
|
echo "Expected format: type(scope): description"
|
|
echo ""
|
|
echo "Valid types:"
|
|
echo " feat - A new feature"
|
|
echo " fix - A bug fix"
|
|
echo " docs - Documentation changes"
|
|
echo " style - Code style changes (formatting, etc.)"
|
|
echo " refactor - Code refactoring"
|
|
echo " test - Adding or updating tests"
|
|
echo " chore - Maintenance tasks"
|
|
echo " perf - Performance improvements"
|
|
echo " ci - CI/CD changes"
|
|
echo " build - Build system changes"
|
|
echo " revert - Reverting changes"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " feat(auth): add JWT authentication"
|
|
echo " fix(api): handle null response"
|
|
echo " docs: update README"
|
|
echo ""
|
|
echo "Your message: $FIRST_LINE"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}Commit message format is valid${NC}"
|
|
exit 0
|