41 lines
951 B
Bash
Executable file
41 lines
951 B
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
# Validate conventional commit messages in git history
|
|
# Usage: gc-check [number_of_commits]
|
|
|
|
set -o errexit
|
|
set -o nounset
|
|
|
|
# Full conventional commit regex:
|
|
# type(optional-scope)optional-!: description
|
|
COMMIT_REGEX='^(feat|fix|docs|style|refactor|test|chore|perf|ci|build)(\([^)]+\))?!?: .+'
|
|
|
|
count=${1:-10}
|
|
errors=0
|
|
|
|
echo "Checking last $count commits..."
|
|
echo ""
|
|
|
|
while IFS= read -r line; do
|
|
hash=$(echo "$line" | cut -d' ' -f1)
|
|
msg=$(echo "$line" | cut -d' ' -f2-)
|
|
|
|
if echo "$msg" | grep -qE "$COMMIT_REGEX"; then
|
|
if echo "$msg" | grep -qE '^[^:]+!:'; then
|
|
echo "✓ $hash $msg (BREAKING)"
|
|
else
|
|
echo "✓ $hash $msg"
|
|
fi
|
|
else
|
|
echo "✗ $hash $msg"
|
|
errors=$((errors + 1))
|
|
fi
|
|
done < <(git log --oneline -n "$count")
|
|
|
|
echo ""
|
|
if [ $errors -gt 0 ]; then
|
|
echo "$errors invalid commit(s) found"
|
|
exit 1
|
|
else
|
|
echo "All commits valid"
|
|
fi
|