| #!/bin/sh |
| # |
| # This pre-commit hook checks if any versions of clang-format |
| # are installed, and if so, uses the installed version to format |
| # the staged changes. |
| # |
| # To install, copy this script to `.git/hooks/pre-commit`: |
| # cd .git/hooks && ln -s ../../tools/clang-format_precommit_hook pre-commit |
| # and make sure that `clang-format` is installed on your system |
| |
| maj_min=1 |
| maj_max=8 |
| |
| 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 |
| |
| if git rev-parse --verify HEAD >/dev/null 2>&1 |
| then |
| against=HEAD |
| else |
| # Initial commit: diff against an empty tree object |
| against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 |
| fi |
| |
| # do the formatting |
| for file in `git diff-index --cached --name-only $against` |
| do |
| case "$file" in |
| *.h | *.hpp | *.c | *.cpp ) |
| "$format" -i "$file" |
| ;; |
| *) |
| # do nothing with file |
| ;; |
| esac |
| done |