#!/usr/bin/env sh # DEP-03: postgres and sqlite migration sets must have matching numbered pairs. set -eu ROOT="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)" PG="$ROOT/migrations/postgres" SQL="$ROOT/migrations/sqlite" list_nums() { dir="$1" ls "$dir" 2>/dev/null | sed -n 's/^\([0-9]\{6\}\)_.*\.up\.sql$/\1/p' | sort -u } migration_only_in() { # Prints numbers present in $1 but not in $2 (space-separated lists). haystack="$2 " for n in $1; do case "$haystack" in *" $n "*) ;; *) echo "$n" ;; esac done } pg_nums="$(list_nums "$PG")" sql_nums="$(list_nums "$SQL")" if [ "$pg_nums" != "$sql_nums" ]; then echo "check-migrations-pair: postgres and sqlite migration numbers differ" >&2 only_pg="$(migration_only_in "$pg_nums" "$sql_nums")" only_sql="$(migration_only_in "$sql_nums" "$pg_nums")" if [ -n "$only_pg" ]; then echo "postgres only:" >&2 for n in $only_pg; do echo " $n" >&2 done fi if [ -n "$only_sql" ]; then echo "sqlite only:" >&2 for n in $only_sql; do echo " $n" >&2 done fi exit 1 fi for n in $pg_nums; do pg_up="" sql_up="" for f in "$PG"/${n}_*.up.sql; do if [ -f "$f" ]; then pg_up="$f" break fi done for f in "$SQL"/${n}_*.up.sql; do if [ -f "$f" ]; then sql_up="$f" break fi done if [ -z "$pg_up" ] || [ -z "$sql_up" ]; then echo "check-migrations-pair: missing .up.sql for $n" >&2 exit 1 fi pg_base="$(basename "$pg_up" .up.sql)" sql_base="$(basename "$sql_up" .up.sql)" if [ "$pg_base" != "$sql_base" ]; then echo "check-migrations-pair: name mismatch for $n: $pg_base vs $sql_base" >&2 exit 1 fi done echo "check-migrations-pair: ok ($PG and $SQL)"