84 lines
2.3 KiB
Plaintext
84 lines
2.3 KiB
Plaintext
|
|
#!/bin/sh
|
||
|
|
#
|
||
|
|
# Run the cheap local gates before a branch is pushed. CI remains the hard gate;
|
||
|
|
# this hook makes common failures cheap to find in clones that enable it.
|
||
|
|
#
|
||
|
|
# Install (once per clone):
|
||
|
|
# git config core.hooksPath scripts/hooks
|
||
|
|
#
|
||
|
|
# Opt in to the slow gates:
|
||
|
|
# AKGL_HOOK_MEMCHECK=1 git push
|
||
|
|
# AKGL_HOOK_MUTATION=1 git push
|
||
|
|
#
|
||
|
|
# Bypass everything (Git's escape hatch):
|
||
|
|
# git push --no-verify
|
||
|
|
|
||
|
|
set -eu
|
||
|
|
|
||
|
|
ZERO_SHA=0000000000000000000000000000000000000000
|
||
|
|
has_updates=0
|
||
|
|
while read -r _local_ref local_sha _remote_ref _remote_sha; do
|
||
|
|
if [ "$local_sha" != "$ZERO_SHA" ]; then
|
||
|
|
has_updates=1
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ "$has_updates" -eq 0 ]; then
|
||
|
|
exit 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
root=$(git rev-parse --show-toplevel) || exit 1
|
||
|
|
cd "$root" || exit 1
|
||
|
|
|
||
|
|
builddir=${AKGL_HOOK_BUILD_DIR:-$(git rev-parse --git-dir)/akgl-prepush}
|
||
|
|
mkdir -p "$builddir" || exit 1
|
||
|
|
logfile="$builddir/last.log"
|
||
|
|
|
||
|
|
run() {
|
||
|
|
if ! "$@" >"$logfile" 2>&1; then
|
||
|
|
echo >&2
|
||
|
|
echo "pre-push: FAILED: $*" >&2
|
||
|
|
echo "---------------------------------------------------------------" >&2
|
||
|
|
cat "$logfile" >&2
|
||
|
|
echo "---------------------------------------------------------------" >&2
|
||
|
|
echo "pre-push: push aborted. Use 'git push --no-verify' to override." >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
if [ -x "$root/scripts/cppcheck.sh" ]; then
|
||
|
|
echo "pre-push: cppcheck"
|
||
|
|
run "$root/scripts/cppcheck.sh"
|
||
|
|
else
|
||
|
|
echo "pre-push: scripts/cppcheck.sh not installed, skipping cppcheck"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "pre-push: default build + ctest (excluding performance suites)"
|
||
|
|
run cmake -S . -B "$builddir/default" -DAKGL_WERROR=ON
|
||
|
|
run cmake --build "$builddir/default"
|
||
|
|
run ctest --test-dir "$builddir/default" -LE perf --output-on-failure
|
||
|
|
|
||
|
|
if command -v doxygen >/dev/null 2>&1; then
|
||
|
|
echo "pre-push: doxygen"
|
||
|
|
run doxygen Doxyfile
|
||
|
|
else
|
||
|
|
echo "pre-push: doxygen not installed, skipping documentation check"
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ "${AKGL_HOOK_MEMCHECK:-0}" = "1" ]; then
|
||
|
|
if [ -x "$root/scripts/memcheck.sh" ]; then
|
||
|
|
echo "pre-push: memcheck"
|
||
|
|
run env AKGL_BUILD_DIR="$builddir/default" "$root/scripts/memcheck.sh"
|
||
|
|
else
|
||
|
|
echo "pre-push: scripts/memcheck.sh not executable, skipping memcheck"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ "${AKGL_HOOK_MUTATION:-0}" = "1" ]; then
|
||
|
|
echo "pre-push: mutation testing (this takes a while)"
|
||
|
|
run cmake --build "$builddir/default" --target mutation
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "pre-push: OK"
|
||
|
|
exit 0
|