89 lines
2.4 KiB
Bash
89 lines
2.4 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ROOT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
|
|
load_database_url_from_env_file() {
|
|
local env_file="$1"
|
|
local line value
|
|
while IFS= read -r line || [[ -n "${line}" ]]; do
|
|
line="${line#"${line%%[![:space:]]*}"}"
|
|
[[ -z "${line}" || "${line}" == \#* ]] && continue
|
|
line="${line#export }"
|
|
if [[ "${line}" == DATABASE_URL=* ]]; then
|
|
value="${line#DATABASE_URL=}"
|
|
value="${value%$'\r'}"
|
|
value="${value%\"}"
|
|
value="${value#\"}"
|
|
value="${value%\'}"
|
|
value="${value#\'}"
|
|
printf '%s' "${value}"
|
|
return 0
|
|
fi
|
|
done < "${env_file}"
|
|
return 1
|
|
}
|
|
|
|
DATABASE_URL="${DATABASE_URL:-}"
|
|
if [[ -z "${DATABASE_URL}" && -f "${ROOT_DIR}/.env" ]]; then
|
|
DATABASE_URL="$(load_database_url_from_env_file "${ROOT_DIR}/.env" || true)"
|
|
fi
|
|
if [[ -z "${DATABASE_URL}" ]]; then
|
|
echo "DATABASE_URL is required (export it, or set it in ${ROOT_DIR}/.env)"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v psql >/dev/null 2>&1; then
|
|
echo "psql not found in PATH"
|
|
exit 127
|
|
fi
|
|
|
|
if ! psql "${DATABASE_URL}" -v ON_ERROR_STOP=1 -c "SELECT 1 FROM iam_schema_migrations LIMIT 1" >/dev/null 2>&1; then
|
|
echo "iam_schema_migrations not found"
|
|
echo "Run migrations first: ./scripts/db/migrate.sh"
|
|
exit 1
|
|
fi
|
|
|
|
STRICT="${STRICT:-1}"
|
|
verify_dir="${SCRIPT_DIR}/verify"
|
|
if [[ ! -d "${verify_dir}" ]]; then
|
|
echo "Missing verify directory: ${verify_dir}"
|
|
exit 1
|
|
fi
|
|
|
|
applied_versions=()
|
|
while IFS= read -r v; do
|
|
[[ -n "${v}" ]] && applied_versions+=( "${v}" )
|
|
done < <(psql "${DATABASE_URL}" -At -c "SELECT version FROM iam_schema_migrations ORDER BY version ASC")
|
|
|
|
declare -A verify_by_version=()
|
|
shopt -s nullglob
|
|
for f in "${verify_dir}/"*.sql; do
|
|
base="$(basename "${f}")"
|
|
version="${base%%_*}"
|
|
version="${version%%.*}"
|
|
verify_by_version["${version}"]="${f}"
|
|
done
|
|
|
|
if [[ "${STRICT}" == "1" ]]; then
|
|
for v in "${applied_versions[@]}"; do
|
|
if [[ -z "${verify_by_version[${v}]:-}" ]]; then
|
|
echo "Missing verify script for applied migration version: ${v}"
|
|
echo "Expected: ${verify_dir}/${v}_*.sql"
|
|
exit 1
|
|
fi
|
|
done
|
|
fi
|
|
|
|
for v in "${applied_versions[@]}"; do
|
|
f="${verify_by_version[${v}]:-}"
|
|
if [[ -z "${f}" ]]; then
|
|
continue
|
|
fi
|
|
echo "Verifying ${v} ($(basename "${f}"))"
|
|
psql "${DATABASE_URL}" -v ON_ERROR_STOP=1 -f "${f}"
|
|
done
|
|
|
|
echo "Verify completed"
|