levineuwirth.org/tools/refreeze.sh

40 lines
1.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# refreeze.sh — Regenerate cabal.project.freeze after a pacman -Syu updates
# Haskell libraries. Run from anywhere inside the repo.
set -euo pipefail
REPO_ROOT="$(git -C "$(dirname "$0")" rev-parse --show-toplevel)"
FREEZE="$REPO_ROOT/cabal.project.freeze"
cd "$REPO_ROOT"
# Back up the current freeze and restore it if resolution fails, so an
# unsolvable index never leaves the repo with no freeze file at all
# (recoverable via git, but the script shouldn't depend on that).
BACKUP=""
if [ -f "$FREEZE" ]; then
BACKUP="$(mktemp "$FREEZE.bak.XXXXXX")"
cp "$FREEZE" "$BACKUP"
fi
restore_on_failure() {
if [ -n "$BACKUP" ]; then
echo "==> Refreeze failed — restoring previous freeze file." >&2
mv "$BACKUP" "$FREEZE"
fi
}
trap restore_on_failure ERR
echo "==> Removing stale freeze file..."
rm -f "$FREEZE"
echo "==> Resolving dependencies and writing new freeze file..."
cabal freeze
trap - ERR
[ -n "$BACKUP" ] && rm -f "$BACKUP"
echo "==> Verifying build..."
cabal build
echo ""
echo "Done. cabal.project.freeze updated."