#!/bin/bash 

remote="$1"
url="$2"
protected_remote='(kernel.org|microchip-at91)'
protected_branch='(at91-|rtc-).*'
committer='Alexandre Belloni <alexandre.belloni@bootlin.com>'

if [[ ! $remote =~ $protected_remote ]]; then
	exit 0
fi

#   <local ref> <local sha1> <remote ref> <remote sha1>
z40=0000000000000000000000000000000000000000

check_update() {
	remote_ref=$1
	local_sha=$2
	remote_sha=$3

	if [[ ! $remote_ref =~ refs/heads/$protected_branch ]]; then
		return
	fi

	echo Running Signed-off check for $remote $remote_ref
	if [ "$local_sha" = $z40 ]; then
		return
	fi

	if [ "$remote_sha" = $z40 ]; then
		BASE=$(git tag -l|grep rc1|sort -V|tail -n 1)
		range="$BASE..$local_sha"
	else
		range="$remote_sha..$local_sha"
	fi

	for c in $(git rev-list $range); do
		ae=$(git log -1 --format='%ae' "$c")
		aE=$(git log -1 --format='%aE' "$c")
		an=$(git log -1 --format='%an' "$c")
		aN=$(git log -1 --format='%aN' "$c")
		ce=$(git log -1 --format='%ce' "$c")
		cE=$(git log -1 --format='%cE' "$c")
		cn=$(git log -1 --format='%cn' "$c")
		cN=$(git log -1 --format='%cN' "$c")
		sob=$(git log -1 --format='%b' "$c" | grep -i '^[[:space:]]*Signed-off-by:')

		COMMITTER="$cN <$cE>"
		if [ "$COMMITTER" != "$committer" ]; then
			continue
		fi

		am=false
		cm=false
		grep -i -q "<$ae>" <<<"$sob" ||
			grep -i -q "<$aE>" <<<"$sob" ||
			grep -i -q ":[[:space:]]*$an[[:space:]]*<" <<<"$sob" ||
			grep -i -q ":[[:space:]]*$aN[[:space:]]*<" <<<"$sob" ||
			am=true
		grep -i -q "<$ce>" <<<"$sob" ||
			grep -i -q "<$cE>" <<<"$sob" ||
			grep -i -q ":[[:space:]]*$cn[[:space:]]*<" <<<"$sob" ||
			grep -i -q ":[[:space:]]*$cN[[:space:]]*<" <<<"$sob" ||
			cm=true

		if "$am" || "$cm"; then
			printf "Commit %s\n" "$c"
			"$am" && printf "\tauthor SOB missing\n"
			"$cm" && printf "\tcommitter SOB missing\n"
			exit 1
		fi
	done
}

while read local_ref local_sha remote_ref remote_sha
do
	check_update $remote_ref $local_sha $remote_sha
done

exit 0