#!/bin/bash # --- Para que siempre se ejecute en el mismo path cd "$(dirname "$0")" # --- Configuración por defecto --- MIGRATIONS_DIR="./migrations" OUTPUT_FILE_PREFIX="esquema_final" DB_NAME="temp_schema_build_$(date +%s)" # --- Función de Ayuda --- usage() { echo "Uso: $0 -v [-e ]" echo " -v Versión semántica objetivo (ej: 1.2.0)" echo " -e (Opcional) Ruta al archivo .env para cargar variables" exit 1 } # --- Procesar Argumentos (Flags) --- # v: obligatorio # e: opcionar while getopts "v:e:" opt; do case $opt in v) TARGET_VERSION="$OPTARG" ;; e) ENV_PATH="$OPTARG" ;; *) usage ;; esac done # Validar que la versión esté presente if [ -z "$TARGET_VERSION" ]; then echo "Error: La versión es obligatoria." usage fi # --- Cargar variables de entorno --- if [ ! -z "$ENV_PATH" ]; then if [ -f "$ENV_PATH" ]; then echo "~> Cargando configuración desde: $ENV_PATH" # Exporta automáticamente las variables definidas en el archivo set -o allexport source "$ENV_PATH" set +o allexport else echo "Error: No se encontró el archivo .env en: $ENV_PATH" exit 1 fi else echo "!> No se especificó archivo .env, usando variables del sistema actual" fi # echo "Debug: Usuario es '$PGUSER'" # echo "Debug: Host es '$PGHOST'" # echo "Debug: Password es '$PGPASSWORD'" # Cuidado con mostrar esto # --- Función de limpieza (Safety Net) --- cleanup() { echo "~> Limpiando: Eliminando base de datos temporal '$DB_NAME'" # Usamos las variables de conexión cargadas (si las hay) dropdb $DB_NAME --if-exists 2>/dev/null } trap cleanup EXIT # --- Inicio del Proceso --- echo "~> Iniciando build para versión: $TARGET_VERSION" # 1. Crear BD temporal # Nota: Si tu .env tiene PGHOST, la BD se creará allí. Si no, en localhost. createdb $DB_NAME # 2. Ejecutar script base (si existe) rm -rf init.sql cat base/*.sql >init.sql if [ -f "init.sql" ]; then echo "~> Ejecutando init.sql..." psql -d $DB_NAME -f init.sql >/dev/null fi # 3. Iterar y filtrar migraciones echo "~> Aplicando migraciones hasta la versión $TARGET_VERSION..." for f in $(ls $MIGRATIONS_DIR/*.sql | sort -V); do FILENAME=$(basename "$f") # Extraer versión (Asume formato V1.0.0_desc.sql o 1.0.0_desc.sql) FILE_VER=$(echo "$FILENAME" | sed -E 's/^V//' | awk -F_ '{print $1}') # Comparación semántica LOWEST=$(echo -e "$FILE_VER\n$TARGET_VERSION" | sort -V | head -n1) if [ "$LOWEST" == "$FILE_VER" ] || [ "$FILE_VER" == "$TARGET_VERSION" ]; then echo "~> Aplicando: $FILENAME ($FILE_VER)" psql -d $DB_NAME -f "$f" >/dev/null else echo "~> Saltando: $FILENAME ($FILE_VER) - Mayor que objetivo" fi done # 4. Generar nombre de archivo de salida OUTPUT_FILE="${OUTPUT_FILE_PREFIX}_v${TARGET_VERSION}.sql" # 5. Extraer el esquema FINAL echo "~> Generando $OUTPUT_FILE ---" pg_dump -d $DB_NAME -s --no-owner --no-privileges >$OUTPUT_FILE echo "o> Esquema guardado en $OUTPUT_FILE"