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