[gnome-chess] Add a pre-commit hook to check coding guidelines



commit 8be49c2b4d1b2be921071753cb7697fcfaa77653
Author: Sahil Sareen <sahil sareen hotmail com>
Date:   Tue Mar 10 22:36:02 2015 +0530

    Add a pre-commit hook to check coding guidelines
    
    Add scripts/pre-commit
    Modify autogen.sh

 autogen.sh         |    3 +
 scripts/pre-commit |  134 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 137 insertions(+), 0 deletions(-)
---
diff --git a/autogen.sh b/autogen.sh
index 5fe9c50..7d6633b 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -11,4 +11,7 @@ REQUIRED_YELP_TOOLS_VERSION=3.1.1
 REQUIRED_GETTEXT_VERSION=0.12
 REQUIRED_INTLTOOL_VERSION=0.40.4
 
+cp ./scripts/pre-commit ./.git/hooks/
+chmod +x ./.git/hooks/pre-commit
+
 . gnome-autogen.sh
diff --git a/scripts/pre-commit b/scripts/pre-commit
new file mode 100755
index 0000000..44e1788
--- /dev/null
+++ b/scripts/pre-commit
@@ -0,0 +1,134 @@
+#!/usr/bin/env python
+
+# script to check if any GNOME coding guidelines are violated
+# Copyright (C) 2015 Sahil Sareen (ssareen [ AT ] gnome [ DOT ] org)
+
+import sys
+import re
+import os
+
+def find( s, ch ):
+    return [ i for i, ltr in enumerate( s ) if ltr == ch ]
+
+
+def main():
+    print "Validating the diff ..."
+
+    p = os.popen( 'git diff --unified=0', "r" )
+
+    # Read the diff
+    lines = []
+    lineNum = 0
+    fileName = ''
+    nIssues = 0
+
+    while True:
+        line = p.readline()
+
+        if not line: break
+        if line.startswith( '@@' ):
+            lineNumSearch = re.search( r'.* .* \+(\d+).*', line )
+            lineNum = int( lineNumSearch.groups()[ 0 ] )
+        elif line.startswith( '+' ):
+            if line.startswith( '+++' ):
+                pos = line.rfind( '/' )
+                fileName = line[ pos + 1 : -1 ]
+            elif fileName.endswith( 'vala' ):
+                lines += [ ( fileName, lineNum, line[ 1 : ] ) ]
+                lineNum += 1
+
+    def getLineFileName( line ):
+        return line[ 0 ]
+
+    def getLineNum( line ):
+        return line[ 1 ]
+
+    def getLineData( line, pos = -1 ):
+        if pos == -1:
+            return line[ 2 ]
+        else:
+            return line[ 2 ][ pos ]
+
+    def getLineWidth( line ):
+        return len( getLineData( line ) )
+
+    def printIssue( line, msg ):
+        print getLineFileName( line ), " => Line ", getLineNum( line ), msg
+
+    for lineNum in xrange( 0, len( lines ) ):
+
+        currLine = lines[ lineNum ]
+
+        # Line Width
+        if getLineWidth( currLine ) > 120:
+            printIssue( currLine, "is greater than 120 charecters" )
+            nIssues += 1
+
+        # Lines with trailing white-space or tabs
+        if getLineData( currLine ).endswith( ' \n' ):
+            printIssue( currLine, "has trailing whitespace" )
+            nIssues += 1
+
+        if getLineData( currLine ).endswith( '\t\n' ):
+            printIssue( currLine, "has trailing tabspace" )
+            nIssues += 1
+
+        # Single whitespace before "{"
+        indexes = find( getLineData( currLine ), '{' )
+        for index in indexes:
+            if index > 1:
+                if getLineData( currLine, index - 1 ) not in [ ' ', '_' ]:
+                    printIssue( currLine, "missing whitespace before {" )
+                    nIssues += 1
+                elif getLineData( currLine, index - 2 ) == ' ' \
+                        and getLineData( currLine, index - 1 ) != '_' \
+                        and not ( re.findall( "\s*{", getLineData( currLine ) ) != [] \
+                                      and getLineData( currLine, 0 ) in [ '\t', ' ' ] ):
+                    printIssue( currLine, "multiple whitespace before {" )
+                    nIssues += 1
+
+        # Single whitespace before "("
+        indexes = find( getLineData( currLine ), '(' )
+        for index in indexes:
+            if index > 1:
+                if getLineData( currLine, index - 1 ) != ' ' \
+                        and getLineData( currLine, index - 1 ) not in [ '_', '(', '&', '*', '-', '(', 
'!','\t' ]:
+                    printIssue( currLine, "missing whitespace before (" )
+                    nIssues += 1
+                elif getLineData( currLine, index - 2 ) == ' ' \
+                        and getLineData( currLine, index - 1 ) not in [ '_', '(' ] \
+                        and not ( getLineData( currLine ).startswith( " *" ) \
+                                      or getLineData( currLine ).startswith("#") \
+                                      or ( re.findall( "\s*\(", getLineData( currLine ) != [] \
+                                                           and getLineData( currLine, 0 ) in [ '\t', ' ' ] ) 
) ):
+                    printIssue( currLine, "multiple whitespace before (" )
+                    nIssues += 1
+
+        # No whitespce between round brackets "(xyz)"
+        indexes = find( getLineData( currLine ), '(' )
+        for index in indexes:
+            if index > 1:
+                if getLineData( currLine, index + 1 ) == ' ':
+                    printIssue( currLine, "has whitespace after (" )
+                    nIssues += 1
+
+        indexes = find( getLineData( currLine ), ')' )
+        for index in indexes:
+            if index > 1:
+                if getLineData( currLine, index - 1 ) == ' ':
+                    printIssue( currLine, "has whitespace before )" )
+                    nIssues += 1
+
+    if nIssues != 0:
+        if nIssues == 1:
+            print "Guideline checker found", nIssues, "issue..."
+        else:
+            print "Guideline checker found", nIssues, "issues..."
+
+        print "We strongly reccomend you to fix these, to ignore use `git commit --no-verify`"
+        return -1
+
+    return 0
+
+if __name__ == "__main__":
+    sys.exit( main() )


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]