#!/usr/bin/env bash set -euo pipefail umask 077 ROOT=$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd) mkdir -p "$ROOT/output" fixture=$(mktemp -d "$ROOT/output/migration-policy-drill.XXXXXX") cleanup() { trap - EXIT HUP INT TERM find "$fixture" -xdev -depth -delete 2>/dev/null || true } trap cleanup EXIT HUP INT TERM git -C "$fixture" init --quiet git -C "$fixture" config user.name "Who Need Help release drill" git -C "$fixture" config user.email "release-drill@example.invalid" install -d -m 700 "$fixture/priv/repo/migrations" install -m 600 /dev/null \ "$fixture/priv/repo/migration_application_compatibility.tsv" git -C "$fixture" add . git -C "$fixture" commit --quiet -m baseline baseline=$(git -C "$fixture" rev-parse HEAD) printf '%s\n' 'defmodule SafeMigration do end' \ >"$fixture/priv/repo/migrations/20260101000000_safe_migration.exs" printf '%s\t%s\t%s\n' \ 20260101000000 application_safe "additive test index" \ >>"$fixture/priv/repo/migration_application_compatibility.tsv" git -C "$fixture" add . git -C "$fixture" commit --quiet -m safe safe=$(git -C "$fixture" rev-parse HEAD) safe_output=$( "$ROOT/scripts/release-migration-policy.sh" "$baseline" "$safe" "$fixture" ) grep -Fx 'migration_policy=application_safe' <<<"$safe_output" >/dev/null grep -Fx 'migration_versions=20260101000000:application_safe' \ <<<"$safe_output" >/dev/null printf '%s\n' 'defmodule ForwardMigration do end' \ >"$fixture/priv/repo/migrations/20260102000000_forward_migration.exs" printf '%s\t%s\t%s\n' \ 20260102000000 forward_only "old fixture cannot read the new representation" \ >>"$fixture/priv/repo/migration_application_compatibility.tsv" git -C "$fixture" add . git -C "$fixture" commit --quiet -m forward forward=$(git -C "$fixture" rev-parse HEAD) forward_output=$( "$ROOT/scripts/release-migration-policy.sh" "$baseline" "$forward" "$fixture" ) grep -Fx 'migration_policy=forward_only' <<<"$forward_output" >/dev/null grep -Fx \ 'migration_versions=20260101000000:application_safe,20260102000000:forward_only' \ <<<"$forward_output" >/dev/null printf '%s\n' 'defmodule SafeMigrationChanged do end' \ >"$fixture/priv/repo/migrations/20260101000000_safe_migration.exs" git -C "$fixture" add . git -C "$fixture" commit --quiet -m modified modified=$(git -C "$fixture" rev-parse HEAD) if "$ROOT/scripts/release-migration-policy.sh" \ "$safe" "$modified" "$fixture" >/dev/null 2>&1; then echo "Migration policy accepted an edited migration file." >&2 exit 1 fi git -C "$fixture" checkout --quiet -b unknown "$safe" printf '%s\n' 'defmodule UnknownMigration do end' \ >"$fixture/priv/repo/migrations/20260103000000_unknown_migration.exs" git -C "$fixture" add . git -C "$fixture" commit --quiet -m unknown unknown=$(git -C "$fixture" rev-parse HEAD) if "$ROOT/scripts/release-migration-policy.sh" \ "$safe" "$unknown" "$fixture" >/dev/null 2>&1; then echo "Migration policy accepted an unreviewed migration." >&2 exit 1 fi no_change_output=$( "$ROOT/scripts/release-migration-policy.sh" "$safe" "$safe" "$fixture" ) grep -Fx 'migration_policy=application_safe' <<<"$no_change_output" >/dev/null grep -Fx 'migration_count=0' <<<"$no_change_output" >/dev/null echo "Isolated release migration policy drill passed."