#!/bin/bash
# compilar: compila proyectos de Siru y Simusol en otra distribucion, en un
# contenedor (podman), y deja sus paquetes. Pedido del autor, 07/10/2026:
# "hagamos entornos para compilar los paquetes en esos entornos cada vez que
# tengamos estos problemas, asi proveemos paquetes para suse actual, fedora
# actual y arch actual". El problema esta en summapack/PAQUETES.md ("Otras
# distribuciones").
#
#   summapack/distros/compilar DISTRO [PROYECTO...]
#
#   DISTRO     fedora, suse (openSUSE Tumbleweed) o arch: el entorno es
#              summapack/distros/DISTRO/Containerfile
#   PROYECTO   summapack, unidades, slex, exprtk, tabular2, simplot, siru, calcula,
#              puyuspa; sin ninguno, todos, en el orden de la cadena (cada
#              uno usa los anteriores ya compilados para esa distribucion)
#
# Usa el tar.gz de fuentes que dejo hacer-pkg (el de subir.lista: trae el
# debian/ generado del .summa) y compila con el mismo debian/rules. Los
# paquetes llevan la marca de la distribucion, para convivir con los de
# Ubuntu en el servidor:
#   fedora  tabular-2.0-14.fedora.x86_64.rpm
#   suse    tabular-2.0-14.suse.x86_64.rpm
#   arch    tabular_2.0-14+arch_amd64.tgz
# Quedan en summapack/distros/salida/DISTRO/ y se agregan a siru/subir.lista, para
# subirlos con subir-paquetes como los demas.
set -euo pipefail
AQUI=$(cd "$(dirname "$0")" && pwd)
SUMMAPACK=$(cd "$AQUI/.." && pwd)
SIRU=$(cd "$SUMMAPACK/.." && pwd)
CALCULA=$(cd "$SIRU/../calcula" 2>/dev/null && pwd || true)
CADENA="summapack unidades slex exprtk tabular2 simplot siru calcula puyuspa"

case "${1:-}" in
    -h|--help|'') sed -n '2,27s/^# \{0,1\}//p' "$0"; exit 0 ;;
esac
D=$1; shift
[ -f "$AQUI/$D/Containerfile" ] || { echo "compilar: no hay entorno para $D (summapack/distros/$D/Containerfile)" >&2; exit 2; }
proyectos=${*:-$CADENA}
command -v podman >/dev/null || { echo "compilar: hace falta podman" >&2; exit 1; }

echo "==> Entorno siru-$D"
podman build -q -t "siru-$D" "$AQUI/$D" > /dev/null

# la marca es el nombre de la distribucion (pedido del autor, 08/10/2026;
# antes fc44 y tw)
MARCA=$D
SALIDA=$AQUI/salida/$D
mkdir -p "$SALIDA"

# el nombre de un paquete sin la version (para reconocer la anterior)
clave() {
    case "$1" in
        *.rpm) echo "$1" | sed -E 's/^(.+)-[^-]+-[0-9]+(\.[a-z][a-z0-9]*)?\.([^.]+)\.rpm$/\1-V\2.\3.rpm/' ;;
        *)     echo "$1" | sed -E 's/^([^_]+)_[^_+]+(\+[^_]+)?_(.+)$/\1_V\2_\3/' ;;
    esac
}

# el tar.gz de un proyecto: el de subir.lista (lo ultimo que armo hacer-pkg)
fuentes_de() {
    grep -h -E "/$1_[0-9][^/]*\.tar\.gz$" "$SIRU/subir.lista" ${CALCULA:+"$CALCULA/subir.lista"} 2>/dev/null | tail -1
}

for p in $proyectos; do
    tar=$(fuentes_de "$p")
    [ -n "$tar" ] && [ -f "$tar" ] || { echo "compilar: no esta el tar.gz de $p (correr antes su hacer-pkg)" >&2; exit 1; }
    echo "==> $p en $D ($(basename "$tar"), marca $MARCA)"
    antes=$(ls "$SALIDA")
    log=$SALIDA/$p.log
    if ! podman run --rm \
            -v "$(dirname "$tar")":/fuentes:ro,Z \
            -v "$SALIDA":/salida:Z \
            -v "$SUMMAPACK":/summapack:ro,Z \
            -v "$AQUI":/distros:ro,Z \
            "siru-$D" bash /distros/dentro.sh "$D" "$MARCA" "$(basename "$tar")" > "$log" 2>&1; then
        tail -30 "$log"
        echo "compilar: fallo $p en $D (todo en $log)" >&2
        exit 1
    fi
    # lo nuevo, a subir.lista (con el .summa del proyecto, para que
    # subir-paquetes sepa de que proyecto es cada paquete); la version
    # anterior de cada paquete nuevo sale de salida/ y de subir.lista, para
    # que la proxima compilacion no instale dos versiones del mismo
    for f in $(comm -13 <(echo "$antes") <(ls "$SALIDA")); do
        case "$f" in *.rpm|*.tgz|*.deb) ;; *) continue ;; esac
        k=$(clave "$f")
        for viejo in "$SALIDA"/*.rpm "$SALIDA"/*.tgz; do
            [ -f "$viejo" ] || continue
            b=$(basename "$viejo")
            [ "$b" != "$f" ] && [ "$(clave "$b")" = "$k" ] || continue
            rm -f "$viejo" "$viejo.md5"
            grep -vxF "$viejo" "$SIRU/subir.lista" > "$SIRU/subir.lista.nueva" || true
            mv "$SIRU/subir.lista.nueva" "$SIRU/subir.lista"
            echo "   (sale $b)"
        done
        grep -qxF "$SALIDA/$f" "$SIRU/subir.lista" 2>/dev/null || echo "$SALIDA/$f" >> "$SIRU/subir.lista"
        echo "   $f"
    done
done
