From 1f07584a663ed110710c80d3c88b23a93bf981a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Mon, 17 May 2021 22:10:52 +0700 Subject: [PATCH] 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 --- .github/workflows/build.yaml | 2 ++ common/scripts/lint-commits | 51 ++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100755 common/scripts/lint-commits diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1ea1da2e488..eb96a151c59 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -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: diff --git a/common/scripts/lint-commits b/common/scripts/lint-commits new file mode 100755 index 00000000000..785bf0ef1d0 --- /dev/null +++ b/common/scripts/lint-commits @@ -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