From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f49.google.com (mail-wm0-f49.google.com [74.125.82.49]) by dpdk.org (Postfix) with ESMTP id 3E74A2C46 for ; Tue, 29 Mar 2016 23:31:48 +0200 (CEST) Received: by mail-wm0-f49.google.com with SMTP id p65so157598165wmp.1 for ; Tue, 29 Mar 2016 14:31:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id; bh=lx6bmqRRqhryScjA3YdekbwdwcJRvP0h+kBH5Pu646s=; b=YZKlL8BvmIngJWNPhUGJvBgJZKrnzDCwAQGB1Dfasp3b4MPcKAtUt4rX71kITc9cAM KCqBGqac95Brf6JX+ufSexqXCAg2+AJArQtmk0WJYzWYjgJvZ5D7va28uszCrcLxdJeq 7khaK1ZPlin+iHGXtTK0sgzQwUMvHnuQcN9f1TX4nNtf/S88SypF2OuDdHAX/WFhdxIY qsUjgKab/xMuzfnFYL1jyg1CSthofswQxSei10vVYuePvmaDgxrqoaemo4wjahVnT9fU vsdWbicn0eUyVW8jsLpUHJb7hwJrE3VTKgN8BcDk8cUKLL6QkF20fsBcO5MQSqW5t+UC MVqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id; bh=lx6bmqRRqhryScjA3YdekbwdwcJRvP0h+kBH5Pu646s=; b=CZykSpay9fJIIGT9w7GHROlKQPpeXSZyxTgGPKYP2rlqk/q1VPAIL4oCMGGZMT0WXL iIOFhQdDUywsJYLxKomoOsNdf7Mum/Jrb0idl7rnxBhPPBPOOMmj+Fxlq49Qgf4bIwQI O2W5QzHUk4Q+DVnJtJvw37D+DZRGPnPGeZ1viizp7W48QETKXi3cE+SijLy+tstQ2ALx tTlS3z+CzQhNcZhO2caj1bM6fcFYQ5vyjxI0W3GcEi0L34IqCPGBelMDQluyVWHTC6tc 7Y4zu9NjO5Kq3+tA95ch7pvYOzH5KZiv2pxOxsudrz/1rG0WNA3jNTH/jIURKZ5Ztr0d yHJQ== X-Gm-Message-State: AD7BkJIAjcn/RWST75MT5gVL4n/LmN7GAf6afoKY4h8LUSKcZCo2abTi9jzqBlEp9M20mb1y X-Received: by 10.28.222.67 with SMTP id v64mr19738495wmg.14.1459287107994; Tue, 29 Mar 2016 14:31:47 -0700 (PDT) Received: from XPS13.localdomain (108.204.154.77.rev.sfr.net. [77.154.204.108]) by smtp.gmail.com with ESMTPSA id b8sm617290wjf.9.2016.03.29.14.31.46 for (version=TLSv1/SSLv3 cipher=OTHER); Tue, 29 Mar 2016 14:31:47 -0700 (PDT) From: Thomas Monjalon To: dev@dpdk.org Date: Tue, 29 Mar 2016 23:29:46 +0200 Message-Id: <1459286986-31148-1-git-send-email-thomas.monjalon@6wind.com> X-Mailer: git-send-email 2.7.0 Subject: [dpdk-dev] [PATCH] scripts: check commit formatting X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Mar 2016 21:31:48 -0000 The git messages have three parts: 1/ the headline 2/ the explanations 3/ the footer tags The headline helps to quickly browse an history or catch instantly the purpose of a commit. Making it short with some consistent wording allows to easily parse it or match some patterns. The explanations must give some keys like the reason of the change. Nothing can be automatically checked for this part. The footer contains some tags to find the origin of a bug or who was working on it. This script is doing some basic checks on parts 1 and 3. Signed-off-by: Thomas Monjalon --- scripts/check-git-log.sh | 119 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100755 scripts/check-git-log.sh diff --git a/scripts/check-git-log.sh b/scripts/check-git-log.sh new file mode 100755 index 0000000..483abcb --- /dev/null +++ b/scripts/check-git-log.sh @@ -0,0 +1,119 @@ +#! /bin/sh + +# BSD LICENSE +# +# Copyright 2016 6WIND S.A. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of 6WIND S.A. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Check commit logs (headlines and references) +# +# If any doubt about the formatting, please check in the most recent history: +# git log --format='%>|(15)%cr %s' --reverse | grep -i + +range=${1:-origin/master..} + +headlines=$(git log --format='%s' $range) +tags=$(git log --format='%b' $range | grep -i -e 'by *:' -e 'fix.*:') +fixes=$(git log --format='%h %s' $range | grep -i ': *fix' | cut -d' ' -f1) + +# check headline format (spacing, no punctuation, no code) +bad=$(echo "$headlines" | grep \ + -e ' ' \ + -e '^ ' \ + -e ' $' \ + -e '\.$' \ + -e '[,;!?&|]' \ + -e ':.*_' \ + -e '^[^:]*$' \ + -e ':[^ ]' \ + -e ' :' \ + | sed 's,^,\t,') +[ -z "$bad" ] || printf "Wrong headline format:\n$bad\n" + +# check headline label for common typos +bad=$(echo "$headlines" | grep \ + -e '^example[:/]' \ + -e '^apps/' \ + -e '^testpmd' \ + -e 'test-pmd' \ + -e '^bond:' \ + | sed 's,^,\t,') +[ -z "$bad" ] || printf "Wrong headline label:\n$bad\n" + +# check headline lowercase for first words +bad=$(echo "$headlines" | grep \ + -e '^.*[A-Z].*:' \ + -e ': *[A-Z]' \ + | sed 's,^,\t,') +[ -z "$bad" ] || printf "Wrong headline uppercase:\n$bad\n" + +# check headline uppercase (Rx/Tx, VF, L2, MAC, Linux, ARM...) +bad=$(echo "$headlines" | grep \ + -e 'rx\|tx\|RX\|TX' \ + -e '\<[pv]f\>' \ + -e '\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + -e ':.*\' \ + | sed 's,^,\t,') +[ -z "$bad" ] || printf "Wrong headline lowercase:\n$bad\n" + +# check tags spelling +bad=$(echo "$tags" | + grep -v '^\(Reported\|Suggested\|Signed-off\|Acked\|Reviewed\|Tested\)-by: [^,]* <.*@.*>$' | + grep -v '^Fixes: [0-9a-f]\{12\} (".*")$' | + sed 's,^.,\t&,') +[ -z "$bad" ] || printf "Wrong tag:\n$bad\n" + +# check missing Fixes: tag +bad=$(for fix in $fixes ; do + git log --format='%b' -1 $fix | grep -q '^Fixes: ' || + git log --format='\t%s' -1 $fix +done) +[ -z "$bad" ] || printf "Missing 'Fixes' tag:\n$bad\n" + +# check Fixes: reference +IFS=' +' +fixtags=$(echo "$tags" | grep '^Fixes: ') +bad=$(for fixtag in $fixtags ; do + good=$(git log --abbrev=12 --format='Fixes: %h ("%s")' -1 \ + $(echo "$fixtag" | sed 's,^Fixes: \([0-9a-f]*\).*,\1,') 2>&-) + printf "$fixtag" | grep -v "^$good$" +done | sed 's,^,\t,') +[ -z "$bad" ] || printf "Wrong 'Fixes' reference:\n$bad\n" -- 2.7.0