libcamera/utils/hooks/pre-push
Laurent Pinchart fcfbec801b utils: hooks: pre-push: Catch commits without committer's SoB
Improve the pre-push git hook script to reject commits without the
committer's Signed-off-by line.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2020-04-30 00:43:09 +03:00

68 lines
1.8 KiB
Bash
Executable file

#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-or-later
# A hook script to prevent pushing unsuitable commits to the master branch.
# Unsuitable commits are commits that contain a local changelog below a '---'
# line. The criteria may get extended later.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local sha1> <remote ref> <remote sha1>
z40=0000000000000000000000000000000000000000
while read -r local_ref local_sha remote_ref remote_sha
do
if [ "$remote_ref" != refs/heads/master ]
then
continue
fi
# The remote master branch should never get deleted by this push, so we
# can assume that local_sha is not 0's. We may however be creating the
# remote branch, when pushing to a new empty repository for instance.
if [ "$remote_sha" = $z40 ]
then
# New branch, examine all commits
range="$local_sha"
else
# Update to existing branch, examine new commits
range="$remote_sha..$local_sha"
fi
#
# Find invalid commits.
#
errors=0
for commit in $(git rev-list "$range")
do
msg=$(git cat-file commit "$commit")
# 1. The commit message shall not contain a local changelog.
if echo "$msg" | grep -q '^--- *$'
then
echo >&2 "Found local changelog in commit $commit"
errors=$((errors+1))
fi
# 2. The commit message shall have a Signed-off-by line
# corresponding the committer.
committer=$(echo "$msg" | grep '^committer ' | head -1 | \
cut -d ' ' -f 2- | rev | cut -d ' ' -f 3- | rev)
if ! echo "$msg" | grep -F -q "Signed-off-by: ${committer}"
then
echo >&2 "Missing committer Signed-off-by in commit $commit"
errors=$((errors+1))
fi
done
if [ $errors != 0 ]
then
echo >&2 "Found $errors errors in $local_ref, not pushing"
exit 1
fi
done
exit 0