Last active
July 24, 2017 09:27
-
-
Save matthew-d-jones/d00b884f4b1f440516af6cdb09635db3 to your computer and use it in GitHub Desktop.
A git pre-commit hook to reject changes which would result in non clang-formatted files
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/sh | |
| # | |
| # This pre-commit hook checks if any versions of clang-format | |
| # are installed, and if so, uses the installed version to reject | |
| # un-clang-formatted commits | |
| maj_min=1 | |
| maj_max=3 | |
| base=clang-format | |
| format="" | |
| # Redirect output to stderr. | |
| exec 1>&2 | |
| # check if clang-format is installed | |
| type "$base" >/dev/null 2>&1 && format="$base" | |
| # if not, check all possible versions | |
| # (i.e. clang-format-<$maj_min-$maj_max>-<0-9>) | |
| if [ -z "$format" ] | |
| then | |
| for j in `seq $maj_max -1 $maj_min` | |
| do | |
| for i in `seq 0 9` | |
| do | |
| type "$base-$j.$i" >/dev/null 2>&1 && format="$base-$j.$i" && break | |
| done | |
| [ -z "$format" ] || break | |
| done | |
| fi | |
| # no versions of clang-format are installed | |
| if [ -z "$format" ] | |
| then | |
| echo "$base is not installed. Pre-commit hook will not be executed." | |
| exit 0 | |
| fi | |
| git diff --cached --name-only --diff-filter=ACMRT | grep -E "\.h$|\.cpp$|\.tcc$|\.tpp$|\.hpp$" | xargs -n1 clang-format -style=file -output-replacements-xml | grep "<replacement " >/dev/null | |
| if [ $? -ne 1 ] | |
| then | |
| echo "Commit did not match clang-format" | |
| exit 1; | |
| fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment