From: Jakub Palider <jpali...@marvell.com> This change to log checking procedure ensures that all tags are in proper order. The order of tags is as follows: * Coverity issue * Bugzilla ID * Fixes * Cc * <BLANK LINE> * Suggested-by * Reported-by + Signed-off-by * Acked-by * Reviewed-by * Tested-by where: * => 0 or more than one instance possible + => more than once instance possible In order to satisfy the above requirements an extra check is performed for obligatory tags.
Signed-off-by: Jakub Palider <jpali...@marvell.com> Change-Id: I58d94fecddd5f978e0567b04f72bd2dc1c0b8a08 --- devtools/check-git-log.sh | 51 +++++++++++++++++++++++++++++ doc/guides/contributing/patches.rst | 25 ++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/devtools/check-git-log.sh b/devtools/check-git-log.sh index 23c6a7d9bb..0d8fff94ee 100755 --- a/devtools/check-git-log.sh +++ b/devtools/check-git-log.sh @@ -54,6 +54,7 @@ fixes=$(git log --format='%h %s' --reverse $range | grep -i ': *fix' | cut -d' ' stablefixes=$($selfdir/git-log-fixes.sh $range | sed '/(N\/A)$/d' | cut -d' ' -f2) tags=$(git log --format='%b' --reverse $range | grep -i -e 'by *:' -e 'fix.*:') bytag='\(Reported\|Suggested\|Signed-off\|Acked\|Reviewed\|Tested\)-by:' +exttag='Coverity issue:\|Bugzilla ID:\|Fixes:\|Cc:' failure=false @@ -203,6 +204,56 @@ done) [ -z "$bad" ] || { printf "Is it candidate for Cc: sta...@dpdk.org backport?\n$bad\n"\ && failure=true;} +# check tag sequence +bad=$(for commit in $commits; do + body=$(git log --format='%b' -1 $commit) + echo "$body" |\ + grep -o -e "$exttag\|^[[:blank:]]*$\|$bytag" | \ + # retrieve tags only + cut -f1 -d":" |\ + # it is okay to have several tags of the same type but for processing + # we need to squash them + uniq |\ + # make sure the tags are in the proper order as presented in SEQ + awk -v cmt="$commit" 'BEGIN{ + SEQ[0] = "Coverity issue"; + SEQ[1] = "Bugzilla ID"; + SEQ[2] = "Fixes"; + SEQ[3] = "Cc"; + SEQ[4] = "^$"; + SEQ[5] = "Suggested-by"; + SEQ[6] = "Reported-by"; + SEQ[7] = "Signed-off-by"; + SEQ[8] = "Acked-by"; + SEQ[9] = "Reviewed-by"; + SEQ[10] = "Tested-by"; + latest = 0; + } + { + for (seq = 0; seq < length(SEQ); seq++) { + if (match($0, SEQ[seq])) { + if (seq < latest) { + print "\tCommit " cmt " (" $0 ":)"; + break; + } else { + latest = seq; + } + } + } + }' +done) +[ -z "$bad" ] || { printf "Wrong tag order: \n$bad\n"\ + && failure=true;} + +# check required tag +bad=$(for commit in $commits; do + body=$(git log --format='%b' -1 $commit) + echo $body | grep -q "Signed-off-by:" \ + || echo "\tCommit" $commit "(Signed-off-by:)" + done) +[ -z "$bad" ] || { printf "Missing obligatory tag: \n$bad\n"\ + && failure=true;} + total=$(echo "$commits" | wc -l) if $failure ; then printf "\nInvalid patch(es) found - checked $total patch" diff --git a/doc/guides/contributing/patches.rst b/doc/guides/contributing/patches.rst index bebcaf3925..868a9a7bf2 100644 --- a/doc/guides/contributing/patches.rst +++ b/doc/guides/contributing/patches.rst @@ -360,6 +360,31 @@ Where ``NNNNN`` is patchwork ID for patch or series:: --- Depends-on: series-10000 ("Title of the series") +Tag order +~~~~~~~~~ + +There is a pattern indicating how tags should relate to each other. + +Example of proper tag sequence:: + + Coverity issue: + Bugzilla ID: + Fixes: + Cc: + + Suggested-by: + Reported-by: + Signed-off-by: + Acked-by: + Reviewed-by: + Tested-by: + +Between first and second tag section there is and empty line. + +While ``Signed-off-by:`` is an obligatory tag and must exists in each commit, +all other tags are optional. Any tag, as long as it is in proper location +to other adjacent tags (if present), may occur multiple times. + Creating Patches ---------------- -- 2.25.1