1*22ce4affSfengbojiang#!/bin/sh 2*22ce4affSfengbojiang 3*22ce4affSfengbojiangREF="HEAD" 4*22ce4affSfengbojiang 5*22ce4affSfengbojiang# test commit body for length 6*22ce4affSfengbojiang# lines containing urls are exempt for the length limit. 7*22ce4affSfengbojiangtest_commit_bodylength() 8*22ce4affSfengbojiang{ 9*22ce4affSfengbojiang length="72" 10*22ce4affSfengbojiang body=$(git log -n 1 --pretty=%b "$REF" | grep -Ev "http(s)*://" | grep -E -m 1 ".{$((length + 1))}") 11*22ce4affSfengbojiang if [ -n "$body" ]; then 12*22ce4affSfengbojiang echo "error: commit message body contains line over ${length} characters" 13*22ce4affSfengbojiang return 1 14*22ce4affSfengbojiang fi 15*22ce4affSfengbojiang 16*22ce4affSfengbojiang return 0 17*22ce4affSfengbojiang} 18*22ce4affSfengbojiang 19*22ce4affSfengbojiang# check for a tagged line 20*22ce4affSfengbojiangcheck_tagged_line() 21*22ce4affSfengbojiang{ 22*22ce4affSfengbojiang regex='^[[:space:]]*'"$1"':[[:space:]][[:print:]]+[[:space:]]<[[:graph:]]+>$' 23*22ce4affSfengbojiang foundline=$(git log -n 1 "$REF" | grep -E -m 1 "$regex") 24*22ce4affSfengbojiang if [ -z "$foundline" ]; then 25*22ce4affSfengbojiang echo "error: missing \"$1\"" 26*22ce4affSfengbojiang return 1 27*22ce4affSfengbojiang fi 28*22ce4affSfengbojiang 29*22ce4affSfengbojiang return 0 30*22ce4affSfengbojiang} 31*22ce4affSfengbojiang 32*22ce4affSfengbojiang# check commit message for a normal commit 33*22ce4affSfengbojiangnew_change_commit() 34*22ce4affSfengbojiang{ 35*22ce4affSfengbojiang error=0 36*22ce4affSfengbojiang 37*22ce4affSfengbojiang # subject is not longer than 72 characters 38*22ce4affSfengbojiang long_subject=$(git log -n 1 --pretty=%s "$REF" | grep -E -m 1 '.{73}') 39*22ce4affSfengbojiang if [ -n "$long_subject" ]; then 40*22ce4affSfengbojiang echo "error: commit subject over 72 characters" 41*22ce4affSfengbojiang error=1 42*22ce4affSfengbojiang fi 43*22ce4affSfengbojiang 44*22ce4affSfengbojiang # need a signed off by 45*22ce4affSfengbojiang if ! check_tagged_line "Signed-off-by" ; then 46*22ce4affSfengbojiang error=1 47*22ce4affSfengbojiang fi 48*22ce4affSfengbojiang 49*22ce4affSfengbojiang # ensure that no lines in the body of the commit are over 72 characters 50*22ce4affSfengbojiang if ! test_commit_bodylength ; then 51*22ce4affSfengbojiang error=1 52*22ce4affSfengbojiang fi 53*22ce4affSfengbojiang 54*22ce4affSfengbojiang return $error 55*22ce4affSfengbojiang} 56*22ce4affSfengbojiang 57*22ce4affSfengbojiangis_coverity_fix() 58*22ce4affSfengbojiang{ 59*22ce4affSfengbojiang # subject starts with Fix coverity defects means it's a coverity fix 60*22ce4affSfengbojiang subject=$(git log -n 1 --pretty=%s "$REF" | grep -E -m 1 '^Fix coverity defects') 61*22ce4affSfengbojiang if [ -n "$subject" ]; then 62*22ce4affSfengbojiang return 0 63*22ce4affSfengbojiang fi 64*22ce4affSfengbojiang 65*22ce4affSfengbojiang return 1 66*22ce4affSfengbojiang} 67*22ce4affSfengbojiang 68*22ce4affSfengbojiangcoverity_fix_commit() 69*22ce4affSfengbojiang{ 70*22ce4affSfengbojiang error=0 71*22ce4affSfengbojiang 72*22ce4affSfengbojiang # subject starts with Fix coverity defects: CID dddd, dddd... 73*22ce4affSfengbojiang subject=$(git log -n 1 --pretty=%s "$REF" | 74*22ce4affSfengbojiang grep -E -m 1 'Fix coverity defects: CID [[:digit:]]+(, [[:digit:]]+)*') 75*22ce4affSfengbojiang if [ -z "$subject" ]; then 76*22ce4affSfengbojiang echo "error: Coverity defect fixes must have a subject line that starts with \"Fix coverity defects: CID dddd\"" 77*22ce4affSfengbojiang error=1 78*22ce4affSfengbojiang fi 79*22ce4affSfengbojiang 80*22ce4affSfengbojiang # need a signed off by 81*22ce4affSfengbojiang if ! check_tagged_line "Signed-off-by" ; then 82*22ce4affSfengbojiang error=1 83*22ce4affSfengbojiang fi 84*22ce4affSfengbojiang 85*22ce4affSfengbojiang # test each summary line for the proper format 86*22ce4affSfengbojiang OLDIFS=$IFS 87*22ce4affSfengbojiang IFS=' 88*22ce4affSfengbojiang' 89*22ce4affSfengbojiang for line in $(git log -n 1 --pretty=%b "$REF" | grep -E '^CID'); do 90*22ce4affSfengbojiang echo "$line" | grep -E '^CID [[:digit:]]+: ([[:graph:]]+|[[:space:]])+ \(([[:upper:]]|\_)+\)' > /dev/null 91*22ce4affSfengbojiang # shellcheck disable=SC2181 92*22ce4affSfengbojiang if [ $? -ne 0 ]; then 93*22ce4affSfengbojiang echo "error: commit message has an improperly formatted CID defect line" 94*22ce4affSfengbojiang error=1 95*22ce4affSfengbojiang fi 96*22ce4affSfengbojiang done 97*22ce4affSfengbojiang IFS=$OLDIFS 98*22ce4affSfengbojiang 99*22ce4affSfengbojiang # ensure that no lines in the body of the commit are over 72 characters 100*22ce4affSfengbojiang if ! test_commit_bodylength; then 101*22ce4affSfengbojiang error=1 102*22ce4affSfengbojiang fi 103*22ce4affSfengbojiang 104*22ce4affSfengbojiang return $error 105*22ce4affSfengbojiang} 106*22ce4affSfengbojiang 107*22ce4affSfengbojiangif [ -n "$1" ]; then 108*22ce4affSfengbojiang REF="$1" 109*22ce4affSfengbojiangfi 110*22ce4affSfengbojiang 111*22ce4affSfengbojiang# if coverity fix, test against that 112*22ce4affSfengbojiangif is_coverity_fix; then 113*22ce4affSfengbojiang if ! coverity_fix_commit; then 114*22ce4affSfengbojiang exit 1 115*22ce4affSfengbojiang else 116*22ce4affSfengbojiang exit 0 117*22ce4affSfengbojiang fi 118*22ce4affSfengbojiangfi 119*22ce4affSfengbojiang 120*22ce4affSfengbojiang# have a normal commit 121*22ce4affSfengbojiangif ! new_change_commit ; then 122*22ce4affSfengbojiang exit 1 123*22ce4affSfengbojiangfi 124*22ce4affSfengbojiang 125*22ce4affSfengbojiangexit 0 126