common: add basic commit lint

Warn if:
* subject is longer than 50 characters

Error if:
* any lines are longer than 80 characters except it's footnotes
* second line is not blank
This commit is contained in:
Đoàn Trần Công Danh 2021-05-17 22:10:52 +07:00 committed by Đoàn Trần Công Danh
parent f507c73f32
commit 1f07584a66
2 changed files with 53 additions and 0 deletions

View file

@ -21,6 +21,8 @@ jobs:
- run: common/travis/changed_templates.sh
- run: common/travis/fetch-xtools.sh
- run: common/travis/xlint.sh
# GitHub Action create a merge commit, ignore it
- run: common/scripts/lint-commits FETCH_HEAD HEAD^2
# Build changed packages.
build:

51
common/scripts/lint-commits Executable file
View file

@ -0,0 +1,51 @@
#!/bin/sh
die() {
printf '%s\n' "$*" >&2
exit 1
}
GIT_CMD=$(command -v chroot-git 2>/dev/null) ||
GIT_CMD=$(command -v git 2>/dev/null) ||
die "neither chroot-git nor git could be found!"
rev_parse() {
if [ -n "$1" ]; then
"$GIT_CMD" rev-parse --verify "$1"
else
shift
while test "$#" != 0
do
"$GIT_CMD" rev-parse --verify "$1" 2>/dev/null && return
shift
done
return 1
fi
}
base=$(rev_parse "$1" FETCH_HEAD ORIG_HEAD) || die "base commit not found"
tip=$(rev_parse "$2" HEAD) || die "tip commit not found"
status=0
for cmt in $("$GIT_CMD" rev-list --abbrev-commit $base..$tip)
do
"$GIT_CMD" cat-file commit "$cmt" |
awk -vC="$cmt" '
# skip header
/^$/ && !msg { msg = 1; next }
!msg { next }
# 3: long-line-is-banned-except-footnote-like-this-for-url
(NF > 2) && (length > 80) { print C ": long line: " $0; exit 1 }
!subject {
if (length > 50) { print C ": subject is a bit long" }
# Below check is too noisy?
# if (!($0 ~ "^New package:" || $0 ~ ".*: update to")) {
# print C ": not new package/update/removal?"
# }
subject = 1; next
}
/^$/ { body = 1; next }
!body { print C ": second line must be blank"; exit 1 }
' || status=1
done
exit $status