cockpit/tools/git-hook-post-commit

41 lines
1.3 KiB
Bash
Executable File

#!/bin/sh
set -eu
# if being run directly, add a dash of red
if [ -t 1 ]; then
trap 'printf "\e[0m"' EXIT
printf "\e[1;31m"
fi
# resolve to a sha, ensure validity
readonly commit="$(git rev-parse --verify "${1:-HEAD}^{commit}")"
tmpdir="tmp/pre-push/${commit}"
rm -rf "tmp/pre-push/${commit}"
# unpack all of the changed files, plus the test/static-code from that commit
changed_files="$(git diff-tree --no-commit-id --no-renames --diff-filter=d --name-only -r "${commit}" --)"
required_files="$(git cat-file -p "${commit}":test/static-code | sed -n 's/^# requires: //p') test/static-code"
git archive --prefix="${tmpdir}/" "${commit}" -- ${changed_files} ${required_files} | tar x
# check that node_modules always gets updated with package.json
if [ -e "${tmpdir}/package.json" -a ! -e "${tmpdir}/node_modules" ]; then
echo 'not ok 0 /node-modules/update'
echo '# package.json changed, but node_modules not updated'
fi
# if any of the following commands fail, the function
# will abort, leaving the temp directory in place
(
unset -- $(env | sed -n '/^GIT_/{s/=.*//p}')
cd "${tmpdir}"
git init -qb main .
git add .
WITH_PARTIAL_TREE=1 test/static-code
)
# paranoia: make sure we delete what we think we will
rm -rf "tmp/pre-push/${commit}"
rmdir --ignore-fail-on-non-empty tmp/pre-push tmp