darkrc/githooks/pre-commit
DarkWiiPlayer 71e8ebbed5 Add WORK_DIR variable to pre-commit hook
This is necessary to allow validations &c. to easily run uncommitted
or ignored scripts from the working directory.
2022-08-10 08:52:07 +02:00

86 lines
1.7 KiB
Bash
Executable file

#!/bin/sh
filter=$(git config hooks.filter)
validate=$(git config hooks.validate)
indentation=$(git config hooks.indentation)
temp=$(mktemp -p /dev/shm -d -t git-hook.XXXX)
export SRC_DIR=$(pwd)
export WORK_DIR=$(git rev-parse --show-toplevel)
new() {
git status --porcelain | grep -E '^AM|^M|^A' | sed 's/^[^ ]* *//'
}
check() {
file=$2
luajit -e "
for line in assert(io.open('$file')):lines() do
if not line:match('^%s*'):match('^$1*$') then
print('File \x1b[31m$file\x1b[00m is incorrectly indented!')
os.exit(1)
end
end"
}
git checkout-index --prefix="$temp/index/" --all
cd $temp/index/
if [ -n "$filter" ]; then
ln -s $WORK_DIR/.git/ .git
sh -c "$filter"
git add --all
rm .git
fi
if [ -n "$validate" ]; then
/bin/echo -e "\x1b[33mValidating commit\x1b[0m"
/bin/echo -e "\x1b[2mλ $validate\x1b[0m"
if sh -c "$validate"
then
/bin/echo -e "\x1b[32mValidation Passed!\x1b[0m"
else
error=1
/bin/echo -e "\x1b[1;31mValidation Failed!\x1b[0m"
fi
fi
case $indentation in
tab|tabs)
/bin/echo -e "\x1b[2mChecking tab indentation"
for file in $(new); do
check '\t' $file || error=1
done
;;
space|spaces)
/bin/echo -e "\x1b[2mChecking space indentation"
for file in $(new); do
check ' ' $file || error=1
done
;;
""|off)
echo "Skipping indentation check"
;;
*)
echo "Cannot check for indentation type \033[31m'$indentation'\033[00m"
exit 1
;;
esac
if [ -n "$error" ]
then exit 1
fi
cd $WORK_DIR/.git
rm -rf $temp
hook=$(basename $0)
if [ -f "$WORK_DIR/.git/hooks/$hook" ]
then
echo Running project-level hook: $WORK_DIR/.git/hooks/$hook
$WORK_DIR/.git/hooks/$hook
error=$?
if [ -n "$error" ]
then exit $error
fi
fi