;dev: bin: commitlint: also work a git commit-msg hook

This commit is contained in:
Simon Michael 2021-07-06 15:33:18 -10:00
parent 215e90ad78
commit 103813f116

View File

@ -1,21 +1,23 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# shellcheck disable=SC2059
# #
# Check git commits for compliance with hledger's conventions, # commitlint [GITRANGE|FILE]
# described at https://hledger.org/CONTRIBUTING.html#commit-messages.
# # Check unpushed commits, or commits in the specified range, or a
# Usage: # commit message in FILE, for compliance with hledger's conventions
# commitlint [GITREV|GITRANGE] # (https://hledger.org/CONTRIBUTING.html#commit-messages). If the
# Checks unpushed commits, or the specified commit or range. # argument contains - or .. or ^! it's a range, otherwise a file
# If the argument contains - or .. it's a range, otherwise a single commit. # containing a proposed commit message.
# Run interactively, or symlink as .git/hooks/commit-msg to check
# your messages before commit.
# #
# Examples: # Examples:
# commitlint # unpushed commits # commitlint foo # commit message in ./foo
# commitlint HEAD # last commit # commitlint HEAD^! # last commit
# commitlint d5d19f841 # this commit # commitlint d5d19f841^! # this commit
# commitlint -20 # last 20 commits # commitlint -20 # last 20 commits
# commitlint master.. # commits in this branch # commitlint master.. # commits in this branch
# commitlint 1.21..1.22 | grep -F [FAIL] # bad commits in 1.22 release cycle # commitlint 1.21..1.22 | grep -F [FAIL] # bad commits in 1.22 release cycle
# commitlint # unpushed commits
if [[ -n ${NO_COLOR+set} ]] if [[ -n ${NO_COLOR+set} ]]
then then
@ -32,39 +34,54 @@ fi
function checkcommit() function checkcommit()
{ {
HASH=${1} HASH=${1}
SUMMARY=$(git log -1 "$HASH" --pretty=format:"%s") MSG=$(git log -1 "$HASH" --pretty=format:"%s%n%b")
checkmsg "$MSG"
}
# checkmsg MSG [GITHASH] - check this commit message and print result
function checkmsg()
{
MSG=${1}
HASH=${2}
if [[ -n $HASH ]]
then
HASH="$HASH "
fi
SUMMARY=$(echo "$MSG" | head -1)
FMT="%s%-60s %b${NRM}\n"
# Does the summary have a type: prefix ? # Does the summary have a type: prefix ?
# Can begin with ; and/or end with !, some spaces are tolerated. # Can begin with ; and/or end with !, some spaces are tolerated.
FMT="%s %-60s %b${NRM}\n"
if ! echo "$SUMMARY" | grep -qE '^(; *)?\w+:[ \w]+!?' if ! echo "$SUMMARY" | grep -qE '^(; *)?\w+:[ \w]+!?'
then then
# shellcheck disable=SC2059
printf "$FMT" "$HASH" "$SUMMARY" "${RED}[FAIL]" printf "$FMT" "$HASH" "$SUMMARY" "${RED}[FAIL]"
STATUS=1 STATUS=1
else else
# shellcheck disable=SC2059
printf "$FMT" "$HASH" "$SUMMARY" "${GRN}[ok]" printf "$FMT" "$HASH" "$SUMMARY" "${GRN}[ok]"
fi fi
} }
STATUS=
RANGE=${*:-"@{u}.."} # @{u} = upstream RANGE=${*:-"@{u}.."} # @{u} = upstream
if [[ ! $RANGE =~ (-|\.\.) ]] if [[ $RANGE =~ (-|\.\.|\^!) ]]
then then
RANGE=$RANGE^! # assume range is a single commit HASHES=$(git log --abbrev-commit --pretty=format:%h "$RANGE")
for HASH in $HASHES; do checkcommit "$HASH"; done
else
MSG=$(cat "$1")
checkmsg "$MSG"
fi fi
HASHES=$(git log --abbrev-commit --pretty=format:%h "$RANGE")
STATUS=
for HASH in $HASHES; do
checkcommit "$HASH"
done
if [[ -z $STATUS ]] if [[ -z $STATUS ]]
then then
printf "" # "${GRN}Ok${NRM}\n" printf "" # "${GRN}Ok${NRM}\n"
else else
printf "\n${RED}Some commits are not in preferred style.${NRM}\n" # shellcheck disable=SC2059
printf "\n${RED}Commit(s) not in preferred style.${NRM}\n"
cat <<EOF cat <<EOF
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
Commit messages should follow this format: Commit messages should follow this format:
@ -80,15 +97,16 @@ The subject line should have a type: prefix. Common types:
cha pkg lib - packager/builder/lib-user changes (->changelogs) cha pkg lib - packager/builder/lib-user changes (->changelogs)
dev doc test ci ref cln - developer changes dev doc test ci ref cln - developer changes
It may additionally have a topic prefix such as: It may additionally have a topic(s) prefix such as:
bin examples install cli ui web print reg bal bs balcmds journal csv ...
(see https://hledger.org/CONTRIBUTING.html#open-issues -> COMPONENT) (see https://hledger.org/CONTRIBUTING.html#open-issues -> COMPONENT)
Mention any related issues, usually parenthesised at end of summary: (#1234) Mention any related issues, usually parenthesised at end of summary: (#1234)
! indicates a breaking change. ! indicates a breaking change.
; skips expensive CI tests. ; skips expensive CI tests.
These conventions are evolving. In practice, any type or topic will These conventions are evolving. In practice, any type or topic will do.
do. Use your best judgement and we'll polish during code review. Use your best judgement and we'll polish during code review.
More detail: https://hledger.org/CONTRIBUTING.html#commit-messages More detail: https://hledger.org/CONTRIBUTING.html#commit-messages
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
EOF EOF