#!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # git-request-pull wrapper with sanity checks # baserev= headrev= parse_options() { # The code below if borrowed from git-request-pull # Skip all options while [[ $# != 0 ]] ; do case "$1" in -p) ;; --) shift break ;; -*) return ;; *) break ;; esac shift done local base=$1 local head= baserev=$(git rev-parse --verify --quiet "$base"^0) if [[ -z "$baserev" ]] ; then return fi local=${3%:*} local=${local:-HEAD} head=$(git symbolic-ref -q "$local") head=${head:-$(git show-ref --heads --tags "$local" | cut -d' ' -f2)} head=${head:-$(git rev-parse --quiet --verify "$local")} if [[ -z "$head" ]] ; then return fi headrev=$(git rev-parse --verify --quiet "$head"^0) } check_commits() { if [[ -z "$baserev" || -z "$headrev" ]] ; then # git request-pull will catch this issue return fi local author local commit local committer local errors=0 local sob for commit in $(git rev-list ^$baserev $headrev) ; do local msg=$(git cat-file commit "$commit") local summary=$(git show --pretty='format:%h ("%s")' -s $commit) # 1. The commit message shall have Signed-off-by lines # corresponding the committer and the author. local committer=$(echo "$msg" | grep '^committer ' | head -1 | \ cut -d ' ' -f 2- | rev | cut -d ' ' -f 3- | rev) if ! echo -E "$msg" | grep -Fqx "Signed-off-by: ${committer}" then echo "Commit $summary is not signed off by committer" errors=$((errors+1)) fi local author=$(echo "$msg" | grep '^author ' | head -1 | \ cut -d ' ' -f 2- | rev | cut -d ' ' -f 3- | rev) if ! echo -E "$msg" | grep -Fqx "Signed-off-by: ${author}" then echo "Commit $summary is not signed off by author" errors=$((errors+1)) fi # 2. Fixes: tags shall reference an ancestor commit. local fixes=$(echo "$msg" | grep '^Fixes: ') if [ -n "$fixes" ] ; then fixes=$(echo "$fixes" | sed 's/^Fixes: \([0-9a-f]\+\) (.*)$/\1/') git merge-base --is-ancestor $fixes $baserev >/dev/null 2>&1 || { echo "Commit $summary contains a Fixes: tag referencing $fixes not present in history" errors=$((errors+1)) } fi done if [[ $errors != 0 ]] ; then echo "$errors errors found, please fix" exit 1 fi } parse_options $* check_commits git request-pull $*