halkyon/tool/check.sh
Tizian 「ティツィアーン」 3bbdb9d747
All checks were successful
CI / check (push) Successful in 11m56s
CI / deploy (push) Successful in 19s
chore: the pre-push hook refuses unsigned commits for main, as the deploy does
deploy/redeploy.sh deploys main only if every new commit is signed by a key
in deploy/allowed-signers, and finds out after CI. On 2026-10-09 that held
learn.halkyon.eu at v0.2.2 for two days: 37 commits had reached main
unsigned, and every deploy since refused them. tool/check_signatures.sh
applies the same rule to a push, to the commits it brings to main that the
remote doesn't have yet (the list as the pushed commit has it), and
tool/check.sh runs it first when it runs as the pre-push hook: a second,
where the rest takes minutes. CI runs check.sh under its own name and
skips it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 19:14:15 +02:00

55 lines
1.9 KiB
Shell
Executable file

#!/usr/bin/env bash
# The checks every push has to pass: formatting, static analysis (infos are fatal too), and
# the server's and the app's tests. The pre-push hook runs this script, and so does CI on
# every push (.forgejo/workflows/ci.yaml).
#
# Install the hook in a fresh clone: ln -s ../../tool/check.sh .git/hooks/pre-push
# Skip it for one push: git push --no-verify
#
# It checks the working tree, so uncommitted changes count as well.
set -euo pipefail
cd "$(git rev-parse --show-toplevel)"
# As the pre-push hook, first: commits going to main must be signed as deploying it requires
# (tool/check_signatures.sh), which takes a moment, where the rest takes minutes.
if [ "$(basename "$0")" = pre-push ]; then
tool/check_signatures.sh "$@"
fi
if ! git diff --quiet HEAD; then
echo 'Note: the working tree has uncommitted changes; they are checked too.'
fi
# Our own Dart files. Generated code is left out: the client package as a whole, the
# server's generated sources and test tools, and the app's localizations (gen-l10n). (A
# loop instead of mapfile: macOS ships bash 3.)
own=()
while IFS= read -r file; do own+=("$file"); done < <(
git ls-files '*.dart' |
grep -v -E '^halkyon_learn_client/|/lib/src/generated/|/serverpod_test_tools\.dart$|/lib/l10n/app_localizations'
)
echo '▸ Formatting'
if [ ${#own[@]} -gt 0 ]; then
dart format --output=none --set-exit-if-changed "${own[@]}"
fi
echo '▸ Analysis'
dart analyze --fatal-infos
echo '▸ Server tests'
if git ls-files 'halkyon_learn_server/test/*_test.dart' | grep -q .; then
(cd halkyon_learn_server && dart test)
else
echo 'No server tests yet.'
fi
echo '▸ Curator tests'
(cd halkyon_learn_curator && dart test)
echo '▸ App tests'
# The sync tests need `serverpod start` running; run them by hand with
# `flutter test -t requires-server` in the app package.
(cd halkyon_learn_flutter && flutter test -x requires-server)
echo '✓ All checks passed.'