89 lines
3.2 KiB
Bash
Executable File
89 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
umask 077
|
|
|
|
ROOT=$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)
|
|
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."
|