#!/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-commithash 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=0if["$1"="install"];thenif["$hg" -eq 1];thenhgrc="$(hg root)"/.hg/hgrcif ! grep -q '^pretxncommit.clang-format'"$hgrc";thenecho'[hooks]' >> "$hgrc"echo'pretxncommit.clang-format = [ ! -x ./coreconf/precommit.clang-format.sh ] || ./coreconf/precommit.clang-format.sh' >> "$hgrc"echo"Installed mercurial pretxncommit hook"exitfifiif["$git" -eq 1];thenhook="$(git rev-parse --show-toplevel)"/.git/hooks/pre-commitif[ ! -e "$hook"];then ln -s ../../coreconf/precommit.clang-format.sh "$hook"echo"Installed git pre-commit hook"exitfifiecho"Hook already installed, or not in NSS repo"exit 2fierr=0files=()if["$hg" -eq 1];thenfiles=($(hg status -m -a --rev tip^:tip | cut -f 2 -d ' ' -))fiif["$git" -eq 1];thenfiles=($(git status --porcelain | sed '/^[MACU]/{s/..//;p;};/^R/{s/^.* -> //;p;};d'))fitmp=$(mktemp)trap'rm -f "$tmp"' ERR EXITfor f in "${files[@]}";doext="${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>&2echo" $f" 1>&2err=1fifidoneexit"$err"