Jason Rhinelander | ac42789 | 2016-08-28 13:00:44 -0400 | [diff] [blame] | 1 | #!/bin/bash |
Henry Schreiner | 4312620 | 2017-09-10 06:24:33 -0400 | [diff] [blame] | 2 | # |
Jason Rhinelander | ac42789 | 2016-08-28 13:00:44 -0400 | [diff] [blame] | 3 | # Script to check include/test code for common pybind11 code style errors. |
Henry Schreiner | 4312620 | 2017-09-10 06:24:33 -0400 | [diff] [blame] | 4 | # |
Wenzel Jakob | fe34241 | 2016-09-06 13:02:29 +0900 | [diff] [blame] | 5 | # This script currently checks for |
| 6 | # |
Henry Schreiner | 8b0ccf7 | 2020-07-20 15:07:22 -0400 | [diff] [blame] | 7 | # 1. missing space between keyword and parenthesis, e.g.: for(, if(, while( |
| 8 | # 2. Missing space between right parenthesis and brace, e.g. 'for (...){' |
| 9 | # 3. opening brace on its own line. It should always be on the same line as the |
Unknown | 0b3f44e | 2017-11-01 21:08:06 -0400 | [diff] [blame] | 10 | # if/while/for/do statement. |
Henry Schreiner | 4312620 | 2017-09-10 06:24:33 -0400 | [diff] [blame] | 11 | # |
Henry Schreiner | 8b0ccf7 | 2020-07-20 15:07:22 -0400 | [diff] [blame] | 12 | # Invoke as: tools/check-style.sh <filenames> |
Jason Rhinelander | ac42789 | 2016-08-28 13:00:44 -0400 | [diff] [blame] | 13 | # |
| 14 | |
Henry Schreiner | 4312620 | 2017-09-10 06:24:33 -0400 | [diff] [blame] | 15 | check_style_errors=0 |
Jason Rhinelander | dbc4bf6 | 2016-08-28 14:53:04 -0400 | [diff] [blame] | 16 | IFS=$'\n' |
Jason Rhinelander | ac42789 | 2016-08-28 13:00:44 -0400 | [diff] [blame] | 17 | |
Jason Rhinelander | ac42789 | 2016-08-28 13:00:44 -0400 | [diff] [blame] | 18 | |
Henry Schreiner | 8b0ccf7 | 2020-07-20 15:07:22 -0400 | [diff] [blame] | 19 | found="$(grep '\<\(if\|for\|while\|catch\)(\|){' $@ -rn --color=always)" |
Henry Schreiner | 4312620 | 2017-09-10 06:24:33 -0400 | [diff] [blame] | 20 | if [ -n "$found" ]; then |
| 21 | echo -e '\033[31;01mError: found the following coding style problems:\033[0m' |
| 22 | check_style_errors=1 |
| 23 | echo "$found" | sed -e 's/^/ /' |
| 24 | fi |
Wenzel Jakob | fe34241 | 2016-09-06 13:02:29 +0900 | [diff] [blame] | 25 | |
Henry Schreiner | 4312620 | 2017-09-10 06:24:33 -0400 | [diff] [blame] | 26 | found="$(awk ' |
| 27 | function prefix(filename, lineno) { |
| 28 | return " \033[35m" filename "\033[36m:\033[32m" lineno "\033[36m:\033[0m" |
| 29 | } |
| 30 | function mark(pattern, string) { sub(pattern, "\033[01;31m&\033[0m", string); return string } |
| 31 | last && /^\s*{/ { |
| 32 | print prefix(FILENAME, FNR-1) mark("\\)\\s*$", last) |
| 33 | print prefix(FILENAME, FNR) mark("^\\s*{", $0) |
| 34 | last="" |
| 35 | } |
| 36 | { last = /(if|for|while|catch|switch)\s*\(.*\)\s*$/ ? $0 : "" } |
Henry Schreiner | 8b0ccf7 | 2020-07-20 15:07:22 -0400 | [diff] [blame] | 37 | ' $(find include -type f) $@)" |
Henry Schreiner | 4312620 | 2017-09-10 06:24:33 -0400 | [diff] [blame] | 38 | if [ -n "$found" ]; then |
| 39 | check_style_errors=1 |
| 40 | echo -e '\033[31;01mError: braces should occur on the same line as the if/while/.. statement. Found issues in the following files:\033[0m' |
| 41 | echo "$found" |
| 42 | fi |
Wenzel Jakob | de2c6df | 2016-12-13 00:17:29 +0100 | [diff] [blame] | 43 | |
Henry Schreiner | 4312620 | 2017-09-10 06:24:33 -0400 | [diff] [blame] | 44 | exit $check_style_errors |