who_need_help/scripts/release-migration-policy-drill.sh

90 lines
3.2 KiB
Bash
Executable File

#!/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."