summaryrefslogtreecommitdiff
path: root/nss/coreconf/precommit.clang-format.sh
diff options
context:
space:
mode:
Diffstat (limited to 'nss/coreconf/precommit.clang-format.sh')
-rwxr-xr-xnss/coreconf/precommit.clang-format.sh63
1 files changed, 63 insertions, 0 deletions
diff --git a/nss/coreconf/precommit.clang-format.sh b/nss/coreconf/precommit.clang-format.sh
new file mode 100755
index 0000000..b638b29
--- /dev/null
+++ b/nss/coreconf/precommit.clang-format.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+# This is a pre-commit hook for use with either mercurial or git.
+#
+# Install this by running the script with an argument of "install".
+#
+# All that does is add the following lines to .hg/hgrc:
+#
+# [hook]
+# pretxncommit.clang-format = [ ! -x ./coreconf/precommit.clang-format.sh ] || ./coreconf/precommit.clang-format.sh
+#
+# Or installs a symlink to .git/hooks/precommit:
+# $ ln -s ../../coreconf/precommit.clang-format.sh .git/hooks/pre-commit
+
+hash clang-format || exit 1
+[ "$(hg root 2>/dev/null)" = "$PWD" ] && hg=1 || hg=0
+[ "$(git rev-parse --show-toplevel 2>/dev/null)" = "$PWD" ] && git=1 || git=0
+
+if [ "$1" = "install" ]; then
+ if [ "$hg" -eq 1 ]; then
+ hgrc="$(hg root)"/.hg/hgrc
+ if ! grep -q '^pretxncommit.clang-format' "$hgrc"; then
+ echo '[hooks]' >> "$hgrc"
+ echo 'pretxncommit.clang-format = [ ! -x ./coreconf/precommit.clang-format.sh ] || ./coreconf/precommit.clang-format.sh' >> "$hgrc"
+ echo "Installed mercurial pretxncommit hook"
+ exit
+ fi
+ fi
+ if [ "$git" -eq 1 ]; then
+ hook="$(git rev-parse --show-toplevel)"/.git/hooks/pre-commit
+ if [ ! -e "$hook" ]; then
+ ln -s ../../coreconf/precommit.clang-format.sh "$hook"
+ echo "Installed git pre-commit hook"
+ exit
+ fi
+ fi
+ echo "Hook already installed, or not in NSS repo"
+ exit 2
+fi
+
+err=0
+files=()
+if [ "$hg" -eq 1 ]; then
+ files=($(hg status -m -a --rev tip^:tip | cut -f 2 -d ' ' -))
+fi
+if [ "$git" -eq 1 ]; then
+ files=($(git status --porcelain | sed '/^[MACU]/{s/..//;p;};/^R/{s/^.* -> //;p;};d'))
+fi
+tmp=$(mktemp)
+trap 'rm -f "$tmp"' ERR EXIT
+for f in "${files[@]}"; do
+ ext="${f##*.}"
+ if [ "$ext" = "c" -o "$ext" = "h" -o "$ext" = "cc" ]; then
+ [ "$hg" -eq 1 ] && hg cat -r tip "$f" > "$tmp"
+ [ "$git" -eq 1 ] && git show :"$f" > "$tmp"
+ if ! cat "$tmp" | clang-format -assume-filename="$f" | \
+ diff -q "$tmp" - >/dev/null; then
+ [ "$err" -eq 0 ] && echo "Formatting errors found in:" 1>&2
+ echo " $f" 1>&2
+ err=1
+ fi
+ fi
+done
+exit "$err"