#!/usr/bin/env bash # The pre-push hook: commits going to main must be signed as deploying it requires # (tool/check_signatures.sh, a moment), then the checks CI runs (tool/check.dart, # minutes), but for a push of release commits alone (below). A push only goes through # when both pass. # # Install it in a fresh clone: ln -s ../../tool/pre-push .git/hooks/pre-push # Skip it for one push: git push --no-verify set -euo pipefail cd "$(git rev-parse --show-toplevel)" # As a hook in a worktree, git hands this its GIT_DIR, an absolute path to the worktree's # folder in the main repository. pub runs git with -C on its git dependencies' caches, which # GIT_DIR overrides, so it judged the workspace's resolution stale, resolved it with dart # alone and failed ("halkyon_learn_flutter requires the Flutter SDK"; 2026-10-16). Nothing # below needs them: git finds the repository from the folder it runs in. unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE GIT_COMMON_DIR GIT_OBJECT_DIRECTORY GIT_PREFIX # git's arguments (the remote) and stdin (the refs pushed) go to the signature check, and # to the question whether the push brings release commits alone: a release's version # commit changes an app's version and its texts of what's new, nothing the checks look at, # so it goes without them (tool/release_push.dart; decided 3 Nov 2026, so that releases in # a row don't run the checks once each). Signed or not is checked all the same. refs=$(cat) printf '%s\n' "$refs" | tool/check_signatures.sh "$@" if printf '%s\n' "$refs" | dart run tool/release_push.dart "$@"; then exit 0 fi exec dart run tool/check.dart