bilhej/scripts/check-flyway-migrations.sh
Joakim Mörling 3532e4d486
All checks were successful
CI / Lint, type check, unit tests, coverage (pull_request) Successful in 2m9s
CI / E2E browser tests (pull_request) Successful in 1m55s
Add account settings dropdown and verified email change flow.
Replace the header "Byt lösenord" link with an Inställningar menu for
changing email or password. Email changes are two-step: request with
password, confirmation link to the new address, then password again on
confirm so a wrong inbox cannot take over the account.

- Backend: EmailChangeService, V10 email_change_tokens, confirm API
- Frontend: ChangeEmailPage, ConfirmEmailChangePage, header dropdown
- E2E: account-settings round-trips, Mailpit verification, wrong-password guard
- Flyway: V9 restore for dev DBs, CI migration checks, V10 for email tokens

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 14:33:06 +02:00

86 lines
2.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# Validates Flyway schema migrations under db/migration/.
# - No duplicate version numbers in the repo
# - Migrations already on the base branch are immutable
# - New migrations must use a version number greater than the highest on the base branch
#
# Usage: scripts/check-flyway-migrations.sh [base-ref]
# Default base ref: origin/master (override with FLYWAY_BASE_REF)
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
MIGRATION_DIR="backend/src/main/resources/db/migration"
BASE_REF="${1:-${FLYWAY_BASE_REF:-origin/master}}"
cd "$ROOT"
if [[ ! -d "$MIGRATION_DIR" ]]; then
echo "Missing migration directory: $MIGRATION_DIR" >&2
exit 1
fi
declare -A seen_versions=()
max_local=0
for file in "$MIGRATION_DIR"/V*.sql; do
[[ -e "$file" ]] || continue
name="$(basename "$file")"
if [[ ! "$name" =~ ^V([0-9]+)__.+\.sql$ ]]; then
echo "ERROR: Invalid migration filename (expected V<number>__description.sql): $name" >&2
exit 1
fi
version="${BASH_REMATCH[1]}"
version=$((10#$version))
if [[ -n "${seen_versions[$version]:-}" ]]; then
echo "ERROR: Duplicate Flyway version V${version}:" >&2
echo " ${seen_versions[$version]}" >&2
echo " $name" >&2
exit 1
fi
seen_versions[$version]="$name"
if (( version > max_local )); then
max_local=$version
fi
done
if ! git rev-parse --verify "$BASE_REF" >/dev/null 2>&1; then
echo "Flyway check: unique versions OK (max V${max_local}). Skipping base-branch rules (${BASE_REF} not found)."
exit 0
fi
max_base=0
while IFS= read -r path; do
[[ -z "$path" ]] && continue
name="$(basename "$path")"
if [[ "$name" =~ ^V([0-9]+)__.+\.sql$ ]]; then
version="${BASH_REMATCH[1]}"
version=$((10#$version))
if (( version > max_base )); then
max_base=$version
fi
fi
done < <(git ls-tree -r --name-only "$BASE_REF" -- "$MIGRATION_DIR" 2>/dev/null | grep -E '/V[0-9]+__.*\.sql$' || true)
while IFS= read -r file; do
[[ -z "$file" ]] && continue
if git cat-file -e "$BASE_REF:$file" 2>/dev/null; then
if ! git diff --quiet "$BASE_REF" -- "$file"; then
echo "ERROR: Modified existing migration (immutable after merge): $file" >&2
echo "Create a new V$((max_base + 1))__... migration instead of editing $file." >&2
exit 1
fi
else
name="$(basename "$file")"
version="${name#V}"
version="${version%%__*}"
version=$((10#$version))
if (( version <= max_base )); then
echo "ERROR: New migration $name uses V${version}, but ${BASE_REF} already has migrations up to V${max_base}." >&2
echo "Use V$((max_base + 1))__your_description.sql or rebase and renumber." >&2
exit 1
fi
fi
done < <(git ls-files "$MIGRATION_DIR"/V*.sql)
echo "Flyway check OK (local max V${max_local}, ${BASE_REF} max V${max_base})."