diff options
Diffstat (limited to 'utils/hooks')
-rwxr-xr-x | utils/hooks/post-commit | 2 | ||||
-rwxr-xr-x | utils/hooks/pre-commit | 2 | ||||
-rwxr-xr-x | utils/hooks/pre-push | 119 |
3 files changed, 123 insertions, 0 deletions
diff --git a/utils/hooks/post-commit b/utils/hooks/post-commit index c8b1739a..f28cbd8d 100755 --- a/utils/hooks/post-commit +++ b/utils/hooks/post-commit @@ -1,5 +1,7 @@ #!/bin/sh +# SPDX-License-Identifier: GPL-2.0-or-later + # Execute the checkstyle script after committing any code. This allows the # commit to succeed, but ensures that the developer is aware of any potential # issues immediately, and can resolve them and fix rapidly with: diff --git a/utils/hooks/pre-commit b/utils/hooks/pre-commit index 47fcbc81..7a4cb625 100755 --- a/utils/hooks/pre-commit +++ b/utils/hooks/pre-commit @@ -1,5 +1,7 @@ #!/bin/sh +# SPDX-License-Identifier: GPL-2.0-or-later + # Execute the checkstyle script before committing any code. This will fail the # commit in case of style issues, ensuring that the developer will notice them. # The pre-commit hook can be bypassed with git commit -n to ignore selective diff --git a/utils/hooks/pre-push b/utils/hooks/pre-push new file mode 100755 index 00000000..68dcbd0c --- /dev/null +++ b/utils/hooks/pre-push @@ -0,0 +1,119 @@ +#!/bin/bash + +# SPDX-License-Identifier: GPL-2.0-or-later + +# A hook script to prevent pushing unsuitable commits to the master or +# integration branches. Criteria to determine unsuitable commits are listed +# below. +# +# 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 + +remote_name="$1" +remote_url="$2" + +while read -r local_ref local_sha remote_ref remote_sha +do + case "$remote_ref" in + refs/heads/master) + ;; + refs/heads/integration/*) + ;; + *) + continue + esac + + # If the remote branch gets deleted, there's nothing to check. + if [ "$local_sha" = $z40 ] + then + continue + fi + + # Check if we are creating a new branch or updating an existing one. + if [ "$remote_sha" = $z40 ] + then + if [ "$remote_ref" = "refs/heads/master" ] + then + # There are known invalid commits in the full history, + # skip the checks if we are pushing the master branch + # (for instance to an empty repository). + continue + else + # We're pushing a new integration branch, check all + # commits on top of the master branch. + range="remotes/$remote_name/master..$local_sha" + fi + else + # Update to existing branch, examine new commits only. + 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 -E "$msg" | grep -q '^--- *$' + then + echo >&2 "Found local changelog in commit $commit" + errors=$((errors+1)) + fi + + # 2. The commit message shall have Signed-off-by lines + # corresponding the committer, author, and all co-developers. + committer=$(echo "$msg" | grep '^committer ' | head -1 | \ + cut -d ' ' -f 2- | rev | cut -d ' ' -f 3- | rev) + if ! echo -E "$msg" | grep -F -q "Signed-off-by: ${committer}" + then + echo >&2 "Missing committer Signed-off-by in commit $commit" + errors=$((errors+1)) + fi + + author=$(echo "$msg" | grep '^author ' | head -1 | \ + cut -d ' ' -f 2- | rev | cut -d ' ' -f 3- | rev) + if ! echo -E "$msg" | grep -F -q "Signed-off-by: ${author}" + then + echo >&2 "Missing author Signed-off-by in commit $commit" + errors=$((errors+1)) + fi + + while read -r codev + do + if ! echo -E "$msg" | grep -F -q "Signed-off-by: ${codev}" + then + echo >&2 "Missing co-developer '${codev}' Signed-off-by in commit $commit" + errors=$((errors+1)) + fi + done < <(echo "$msg" | grep '^Co-developed-by: ' | cut -d ' ' -f 2-) + + # 3. A Reviewed-by or Acked-by is required. + if ! echo -E "$msg" | grep -q '^\(Reviewed\|Acked\)-by: ' + then + echo >&2 "No Reviewed-by or Acked-by in commit $commit" + errors=$((errors+1)) + fi + + # 4. The commit message shall not contain a Change-Id. + if echo -E "$msg" | grep -q '^Change-Id:' + then + echo >&2 "Found Change-Id 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 |