Meta: Add a post-commit commit message linter hook

This should help with getting commit messages tidy before they pass
through CI's commit linter :^)

For this hook to work pre-commit has to be explicitly installed via:
`pre-commit install --hook-type commit-msg`
This commit is contained in:
Idan Horowitz 2021-05-02 14:16:21 +03:00 committed by Andreas Kling
parent effdd76bb2
commit 028dad6e87
Notes: sideshowbarker 2024-07-18 18:46:59 +09:00
2 changed files with 43 additions and 0 deletions

View file

@ -5,6 +5,7 @@ repos:
name: Running Meta/lint-ci.sh to ensure changes will pass linting on CI name: Running Meta/lint-ci.sh to ensure changes will pass linting on CI
entry: bash Meta/lint-ci.sh entry: bash Meta/lint-ci.sh
args: [ --no-ports ] args: [ --no-ports ]
stages: [ commit ]
language: system language: system
- id: meta-lint-ports - id: meta-lint-ports
@ -12,4 +13,11 @@ repos:
entry: Meta/lint-ports.py entry: Meta/lint-ports.py
pass_filenames: false pass_filenames: false
files: ^Ports/ files: ^Ports/
stages: [ commit ]
language: system
- id: meta-lint-commit
name: Lint commit message to ensure it will pass the commit linting on CI
entry: Meta/lint-commit.sh
stages: [ commit-msg ]
language: system language: system

35
Meta/lint-commit.sh Executable file
View file

@ -0,0 +1,35 @@
#!/usr/bin/env bash
# the file containing the commit message is passed as the first argument
commit_file="$1"
commit_message=$(cat "$commit_file")
error() {
echo -e "\033[0;31m$1:\033[0m"
echo "$commit_message"
exit 1
}
# fail if the commit message contains windows style line breaks (carriage returns)
if grep -q -U $'\x0D' "$commit_file"; then
error "Commit message contains CRLF line breaks (only unix-style LF linebreaks are allowed)"
fi
line_number=0
while read -r line; do
# ignore comment lines
[[ "$line" =~ ^#.* ]] && continue
((line_number += 1))
line_length=${#line}
category_pattern="^\S.*?: .+"
if [[ $line_number -eq 1 ]] && (echo "$line" | grep -P -v -q "$category_pattern"); then
error "Missing category in commit title (if this is a fix up of a previous commit, it should be squashed)"
fi
if [[ $line_length -gt 72 ]]; then
error "Commit message lines are too long (maximum allowed is 72 characters)"
fi
done <"$commit_file"
exit 0