86 lines
3.1 KiB
Bash
Executable File
86 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#**************************************************************************
|
|
#* *
|
|
#* OCaml *
|
|
#* *
|
|
#* David Allsopp, MetaStack Solutions Ltd. *
|
|
#* *
|
|
#* Copyright 2017 MetaStack Solutions Ltd. *
|
|
#* *
|
|
#* All rights reserved. This file is distributed under the terms of *
|
|
#* the GNU Lesser General Public License version 2.1, with the *
|
|
#* special exception on linking described in the file LICENSE. *
|
|
#* *
|
|
#**************************************************************************
|
|
|
|
# Bump this on any changes. It's vital that HOOK_VERSION followed by equals
|
|
# appears nowhere else in these sources!
|
|
HOOK_VERSION=4
|
|
|
|
# For what it's worth, allow for empty trees!
|
|
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
|
|
|
|
# Redirect output to stderr.
|
|
exec 1>&2
|
|
|
|
# Check to see if the script's been updated
|
|
if git ls-files --error-unmatch tools/pre-commit-githook >/dev/null 2>&1 ; then
|
|
THEIR_VERSION=$(git cat-file --textconv HEAD:tools/pre-commit-githook \
|
|
| sed -ne 's/^HOOK_VERSION=//p')
|
|
if [[ -n $THEIR_VERSION && $THEIR_VERSION -gt $HOOK_VERSION ]] ; then
|
|
echo "Note: tools/pre-commit-githook is newer than .git/hooks/pre-commit"
|
|
echo " You may wish to update your local githook"
|
|
fi
|
|
fi
|
|
|
|
# Git's built-in mechanism for whitespace is neater than ours, so do it first.
|
|
# The strange construction below creates a list of files which have either
|
|
# white-at-eol or white-at-eof included in ocaml-typo in .gitattributes and by
|
|
# prefixing the names with :! causes git diff-index to skip over them.
|
|
if [[ -n $(git diff-index --cached --name-only $against) ]] ; then
|
|
FILES=$(git diff-index --cached --name-only $against \
|
|
| xargs git check-attr --cached ocaml-typo \
|
|
| sed -ne 's/\(.*\): ocaml-typo:.*[ ,]white-at-eo[fl]\(,\|$\)/:!\1/p')
|
|
if ! git diff-index --check --cached $against -- $FILES ; then
|
|
exit 1
|
|
fi
|
|
else
|
|
exit 0
|
|
fi
|
|
|
|
# Test to see if any part of the directory name has been marked prune
|
|
not_pruned () {
|
|
DIR=$(dirname "$1")
|
|
if [ "$DIR" = "." ] ; then
|
|
return 0
|
|
else
|
|
case ",$(git check-attr typo.prune "$DIR" | sed -e 's/.*: //')," in
|
|
,set,)
|
|
return 1
|
|
;;
|
|
*)
|
|
|
|
not_pruned "$DIR"
|
|
return $?
|
|
esac
|
|
fi
|
|
}
|
|
|
|
# Now run check-typo over all the files in the index
|
|
ERRORS=0
|
|
export OCAML_CT_PREFIX=:
|
|
export OCAML_CT_CAT="git cat-file --textconv"
|
|
export OCAML_CT_CA_FLAG=--cached
|
|
git diff --diff-filter=d --staged --name-only | (while IFS= read -r path
|
|
do
|
|
if not_pruned "$path" && ! tools/check-typo "./$path" ; then
|
|
ERRORS=1
|
|
fi
|
|
done; exit $ERRORS)
|