41 lines
1.3 KiB
Bash
Executable File
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
|