check-style.sh revision 11986:c12e4625ab56
1#!/bin/bash
2# 
3# Script to check include/test code for common pybind11 code style errors.
4# 
5# This script currently checks for
6#
7# 1. use of tabs instead of spaces
8# 2. MSDOS-style CRLF endings
9# 3. trailing spaces
10# 4. missing space between keyword and parenthesis, e.g.: for(, if(, while(
11# 5. Missing space between right parenthesis and brace, e.g. 'for (...){'
12# 6. opening brace on its own line. It should always be on the same line as the
13#    if/while/for/do statment.
14# 
15# Invoke as: tools/check-style.sh
16#
17
18errors=0
19IFS=$'\n'
20found=
21# The mt=41 sets a red background for matched tabs:
22exec 3< <(GREP_COLORS='mt=41' grep $'\t' include/ tests/*.{cpp,py,h} docs/*.rst -rn --color=always)
23while read -u 3 f; do
24    if [ -z "$found" ]; then
25        echo -e '\e[31m\e[01mError: found tabs instead of spaces in the following files:\e[0m'
26        found=1
27        errors=1
28    fi
29
30    echo "    $f"
31done
32
33found=
34# The mt=41 sets a red background for matched MS-DOS CRLF line endings
35exec 3< <(GREP_COLORS='mt=41' grep -IUlr $'\r' include/ tests/*.{cpp,py,h} docs/*.rst --color=always)
36while read -u 3 f; do
37    if [ -z "$found" ]; then
38        echo -e '\e[31m\e[01mError: found CRLF characters in the following files:\e[0m'
39        found=1
40        errors=1
41    fi
42
43    echo "    $f"
44done
45
46found=
47# The mt=41 sets a red background for matched trailing spaces
48exec 3< <(GREP_COLORS='mt=41' grep '\s\+$' include/ tests/*.{cpp,py,h} docs/*.rst -rn --color=always)
49while read -u 3 f; do
50    if [ -z "$found" ]; then
51        echo -e '\e[31m\e[01mError: found trailing spaces in the following files:\e[0m'
52        found=1
53        errors=1
54    fi
55
56    echo "    $f"
57done
58
59found=
60exec 3< <(grep '\<\(if\|for\|while\|catch\)(\|){' include/ tests/*.{cpp,py,h} -rn --color=always)
61while read -u 3 line; do
62    if [ -z "$found" ]; then
63        echo -e '\e[31m\e[01mError: found the following coding style problems:\e[0m'
64        found=1
65        errors=1
66    fi
67
68    echo "    $line"
69done
70
71found=
72exec 3< <(GREP_COLORS='mt=41' grep '^\s*{\s*$' include/ docs/*.rst -rn --color=always)
73while read -u 3 f; do
74    if [ -z "$found" ]; then
75        echo -e '\e[31m\e[01mError: braces should occur on the same line as the if/while/.. statement. Found issues in the following files: \e[0m'
76        found=1
77        errors=1
78    fi
79
80    echo "    $f"
81done
82
83exit $errors
84