xref: /src/sys/contrib/openzfs/scripts/commitcheck.sh (revision 546d3d08e5993cbe2d6141b256e8c2ebad5aa102)
1777b8cccSRyan Moeller#!/bin/sh
2cb524aa2SGiuseppe Di Natale
3cb524aa2SGiuseppe Di NataleREF="HEAD"
4cb524aa2SGiuseppe Di Natale
58dcaf243SGiuseppe Di Natale# test commit body for length
6a584ef26SBrian Behlendorf# lines containing urls are exempt for the length limit.
7777b8cccSRyan Moellertest_commit_bodylength()
88dcaf243SGiuseppe Di Natale{
98dcaf243SGiuseppe Di Natale    length="72"
10574d5f33SBrian Behlendorf    body=$(git log --no-show-signature -n 1 --pretty=%b "$REF" |
11574d5f33SBrian Behlendorf        grep -Evi -e "http(s)*://" -e "signed-off-by:" -e "reviewed-by:" |
12574d5f33SBrian Behlendorf        grep -E -m 1 ".{$((length + 1))}")
138dcaf243SGiuseppe Di Natale    if [ -n "$body" ]; then
148dcaf243SGiuseppe Di Natale        echo "error: commit message body contains line over ${length} characters"
158dcaf243SGiuseppe Di Natale        return 1
168dcaf243SGiuseppe Di Natale    fi
178dcaf243SGiuseppe Di Natale
188dcaf243SGiuseppe Di Natale    return 0
198dcaf243SGiuseppe Di Natale}
208dcaf243SGiuseppe Di Natale
21cb524aa2SGiuseppe Di Natale# check for a tagged line
22777b8cccSRyan Moellercheck_tagged_line()
23cb524aa2SGiuseppe Di Natale{
24777b8cccSRyan Moeller    regex='^[[:space:]]*'"$1"':[[:space:]][[:print:]]+[[:space:]]<[[:graph:]]+>$'
2510bcc4daSнаб    foundline=$(git log --no-show-signature -n 1 "$REF" | grep -E -m 1 "$regex")
26cb524aa2SGiuseppe Di Natale    if [ -z "$foundline" ]; then
27cb524aa2SGiuseppe Di Natale        echo "error: missing \"$1\""
28cb524aa2SGiuseppe Di Natale        return 1
29cb524aa2SGiuseppe Di Natale    fi
30cb524aa2SGiuseppe Di Natale
31cb524aa2SGiuseppe Di Natale    return 0
32cb524aa2SGiuseppe Di Natale}
33cb524aa2SGiuseppe Di Natale
34cb524aa2SGiuseppe Di Natale# check commit message for a normal commit
35777b8cccSRyan Moellernew_change_commit()
36cb524aa2SGiuseppe Di Natale{
37cb524aa2SGiuseppe Di Natale    error=0
38cb524aa2SGiuseppe Di Natale
394efb48eeSNeal Gompa (ニール・ゴンパ)    # subject is not longer than 72 characters
4010bcc4daSнаб    long_subject=$(git log --no-show-signature -n 1 --pretty=%s "$REF" | grep -E -m 1 '.{73}')
41cb524aa2SGiuseppe Di Natale    if [ -n "$long_subject" ]; then
424efb48eeSNeal Gompa (ニール・ゴンパ)        echo "error: commit subject over 72 characters"
43cb524aa2SGiuseppe Di Natale        error=1
44cb524aa2SGiuseppe Di Natale    fi
45cb524aa2SGiuseppe Di Natale
46cb524aa2SGiuseppe Di Natale    # need a signed off by
47cb524aa2SGiuseppe Di Natale    if ! check_tagged_line "Signed-off-by" ; then
48cb524aa2SGiuseppe Di Natale        error=1
49cb524aa2SGiuseppe Di Natale    fi
50cb524aa2SGiuseppe Di Natale
51cb524aa2SGiuseppe Di Natale    # ensure that no lines in the body of the commit are over 72 characters
528dcaf243SGiuseppe Di Natale    if ! test_commit_bodylength ; then
53cb524aa2SGiuseppe Di Natale        error=1
54cb524aa2SGiuseppe Di Natale    fi
55cb524aa2SGiuseppe Di Natale
5683613696SDamian Szuberski    return "$error"
57cb524aa2SGiuseppe Di Natale}
58cb524aa2SGiuseppe Di Natale
59777b8cccSRyan Moelleris_coverity_fix()
608dcaf243SGiuseppe Di Natale{
618dcaf243SGiuseppe Di Natale    # subject starts with Fix coverity defects means it's a coverity fix
6210bcc4daSнаб    subject=$(git log --no-show-signature -n 1 --pretty=%s "$REF" | grep -E -m 1 '^Fix coverity defects')
638dcaf243SGiuseppe Di Natale    if [ -n "$subject" ]; then
648dcaf243SGiuseppe Di Natale        return 0
658dcaf243SGiuseppe Di Natale    fi
668dcaf243SGiuseppe Di Natale
678dcaf243SGiuseppe Di Natale    return 1
688dcaf243SGiuseppe Di Natale}
698dcaf243SGiuseppe Di Natale
70777b8cccSRyan Moellercoverity_fix_commit()
718dcaf243SGiuseppe Di Natale{
728dcaf243SGiuseppe Di Natale    error=0
738dcaf243SGiuseppe Di Natale
748dcaf243SGiuseppe Di Natale    # subject starts with Fix coverity defects: CID dddd, dddd...
7510bcc4daSнаб    subject=$(git log --no-show-signature -n 1 --pretty=%s "$REF" |
763da3488eSBrian Behlendorf        grep -E -m 1 'Fix coverity defects: CID [[:digit:]]+(, [[:digit:]]+)*')
778dcaf243SGiuseppe Di Natale    if [ -z "$subject" ]; then
788dcaf243SGiuseppe Di Natale        echo "error: Coverity defect fixes must have a subject line that starts with \"Fix coverity defects: CID dddd\""
798dcaf243SGiuseppe Di Natale        error=1
808dcaf243SGiuseppe Di Natale    fi
818dcaf243SGiuseppe Di Natale
828dcaf243SGiuseppe Di Natale    # need a signed off by
838dcaf243SGiuseppe Di Natale    if ! check_tagged_line "Signed-off-by" ; then
848dcaf243SGiuseppe Di Natale        error=1
858dcaf243SGiuseppe Di Natale    fi
868dcaf243SGiuseppe Di Natale
878dcaf243SGiuseppe Di Natale    # test each summary line for the proper format
888dcaf243SGiuseppe Di Natale    OLDIFS=$IFS
89777b8cccSRyan Moeller    IFS='
90777b8cccSRyan Moeller'
9110bcc4daSнаб    for line in $(git log --no-show-signature -n 1 --pretty=%b "$REF" | grep -E '^CID'); do
922ca77988Sнаб        if ! echo "$line" | grep -qE '^CID [[:digit:]]+: ([[:graph:]]+|[[:space:]])+ \(([[:upper:]]|\_)+\)'; then
938dcaf243SGiuseppe Di Natale            echo "error: commit message has an improperly formatted CID defect line"
948dcaf243SGiuseppe Di Natale            error=1
958dcaf243SGiuseppe Di Natale        fi
968dcaf243SGiuseppe Di Natale    done
978dcaf243SGiuseppe Di Natale    IFS=$OLDIFS
988dcaf243SGiuseppe Di Natale
998dcaf243SGiuseppe Di Natale    # ensure that no lines in the body of the commit are over 72 characters
1008dcaf243SGiuseppe Di Natale    if ! test_commit_bodylength; then
1018dcaf243SGiuseppe Di Natale        error=1
1028dcaf243SGiuseppe Di Natale    fi
1038dcaf243SGiuseppe Di Natale
10483613696SDamian Szuberski    return "$error"
1058dcaf243SGiuseppe Di Natale}
1068dcaf243SGiuseppe Di Natale
107cb524aa2SGiuseppe Di Nataleif [ -n "$1" ]; then
108cb524aa2SGiuseppe Di Natale    REF="$1"
109cb524aa2SGiuseppe Di Natalefi
110cb524aa2SGiuseppe Di Natale
1118dcaf243SGiuseppe Di Natale# if coverity fix, test against that
1128dcaf243SGiuseppe Di Nataleif is_coverity_fix; then
1138dcaf243SGiuseppe Di Natale    if ! coverity_fix_commit; then
1148dcaf243SGiuseppe Di Natale        exit 1
1158dcaf243SGiuseppe Di Natale    else
1168dcaf243SGiuseppe Di Natale        exit 0
1178dcaf243SGiuseppe Di Natale    fi
1188dcaf243SGiuseppe Di Natalefi
1198dcaf243SGiuseppe Di Natale
120cb524aa2SGiuseppe Di Natale# have a normal commit
121cb524aa2SGiuseppe Di Nataleif ! new_change_commit ; then
122cb524aa2SGiuseppe Di Natale    exit 1
123cb524aa2SGiuseppe Di Natalefi
124cb524aa2SGiuseppe Di Natale
125cb524aa2SGiuseppe Di Nataleexit 0
126