#!/bin/bash
# subir-paquetes: publica en el servidor de descargas lo que deja hacer-deb
# (.deb, .rpm, .tgz, .tar.gz, .summa, cada uno con su .md5) y mantiene los
# nombres fijos que apuntan a la ultima version. Pedido del autor, 07/10/2026:
# desde que se arma con hacer-deb no habia como subir, ni el last, ni los md5
# (lo que hacian upload y stable de makefile.lib).
#
#   subir-paquetes [--prueba] [--forzar] ARCHIVO...
#       sube cada archivo con su .md5 y apunta NOMBRE_UNSTABLE... a el.
#       No vuelve a subir un archivo que ya esta, salvo --forzar.
#   subir-paquetes --estable [--prueba] NOMBRE...
#       apunta NOMBRE_last... a lo que hoy es NOMBRE_UNSTABLE... (de NOMBRE,
#       el paquete: calcula, libtabular2-0...)
#   subir-paquetes --lista [NOMBRE...]
#       lo que hay en el servidor
#
# Los nombres fijos cambian la version por UNSTABLE o last, y conservan lo
# demas: calcula_6.0-38_amd64.deb -> calcula_UNSTABLE_amd64.deb,
# calcula_6.0-38.tar.gz -> calcula_UNSTABLE.tar.gz,
# calcula-6.0-38.x86_64.rpm -> calcula-UNSTABLE.x86_64.rpm. Son enlaces
# simbolicos en el servidor, igual que sus .md5.
#
# El servidor, en el entorno o en ~/.config/simusol/subir (VARIABLE=valor):
#   SUBIR_SERVIDOR   simusol.org ('local': un directorio de esta maquina,
#                    para probar)
#   SUBIR_USUARIO    www-data
#   SUBIR_DIR        /var/www/simusol.org/public_html/downloads
#
# Es parte de summapack (siru/summapack/bin); se instala con el.
# Documentacion: siru/summapack/PAQUETES.md.
set -euo pipefail

[ -f "$HOME/.config/simusol/subir" ] && . "$HOME/.config/simusol/subir"
SERVIDOR=${SUBIR_SERVIDOR:-simusol.org}
USUARIO=${SUBIR_USUARIO:-www-data}
DIR=${SUBIR_DIR:-/var/www/simusol.org/public_html/downloads}

prueba=0; forzar=0; modo=subir
while [ $# -gt 0 ]; do
    case "$1" in
        --prueba)  prueba=1 ;;
        --forzar)  forzar=1 ;;
        --estable) modo=estable ;;
        --lista)   modo=lista ;;
        -h|--help) sed -n '2,30s/^# \{0,1\}//p' "$0"; exit 0 ;;
        -*)        echo "subir-paquetes: no conozco $1" >&2; exit 2 ;;
        *)         break ;;
    esac
    shift
done

# una orden en el servidor (o aca, con SUBIR_SERVIDOR=local)
remoto() {
    if [ $prueba = 1 ]; then echo "  [en $SERVIDOR] $1"; return 0; fi
    if [ "$SERVIDOR" = local ]; then bash -c "$1"; else ssh "$USUARIO@$SERVIDOR" "$1"; fi
}
copiar() {
    if [ $prueba = 1 ]; then echo "  [copiar] $* -> $SERVIDOR:$DIR/"; return 0; fi
    if [ "$SERVIDOR" = local ]; then cp "$@" "$DIR/"; else scp -q "$@" "$USUARIO@$SERVIDOR:$DIR/"; fi
}

# el nombre fijo de un archivo: la version por $2 (UNSTABLE o last)
fijo() {
    local f="$1" v="$2"
    case "$f" in
        *.rpm)  echo "$f" | sed -E "s/^(.+)-([^-]+-[^-]+)\.([^.]+)\.rpm$/\1-$v.\3.rpm/" ;;
        *_*_*)  echo "$f" | sed -E "s/^([^_]+)_[^_]+_(.+)$/\1_${v}_\2/" ;;
        *_*)    echo "$f" | sed -E "s/^([^_]+)_[^_]+\.(tar\.gz|summa|tgz)$/\1_${v}.\2/" ;;
        *)      echo "$f" ;;
    esac
}

case $modo in
subir)
    [ $# -gt 0 ] || { echo "uso: subir-paquetes [--prueba] [--forzar] ARCHIVO..." >&2; exit 2; }
    for f in "$@"; do
        [ -f "$f" ] || { echo "no esta $f" >&2; exit 1; }
        case "$f" in *.md5) continue ;; esac
        [ -f "$f.md5" ] || (cd "$(dirname "$f")" && md5sum "$(basename "$f")" > "$(basename "$f").md5")
        b=$(basename "$f")
        u=$(fijo "$b" UNSTABLE)
        [ "$u" != "$b" ] || { echo "no se a que version corresponde $b: no lo subo" >&2; exit 1; }
        if [ $forzar = 0 ] && [ $prueba = 0 ] && remoto "test -e '$DIR/$b'"; then
            echo "ya esta $b en el servidor (--forzar para volver a subirlo)"
            continue
        fi
        copiar "$f" "$f.md5"
        remoto "cd '$DIR' && ln -sfn '$b' '$u' && ln -sfn '$b.md5' '$u.md5'"
        echo "$b  ($u)"
    done
    ;;
estable)
    [ $# -gt 0 ] || { echo "uso: subir-paquetes --estable NOMBRE..." >&2; exit 2; }
    for n in "$@"; do
        remoto "cd '$DIR' && encontrados=0 && for u in ${n}_UNSTABLE* ${n}-UNSTABLE*; do
                  [ -L \"\$u\" ] || continue; encontrados=1
                  case \"\$u\" in *.md5) continue ;; esac
                  l=\$(echo \"\$u\" | sed 's/UNSTABLE/last/'); a=\$(readlink \"\$u\")
                  ln -sfn \"\$a\" \"\$l\" && ln -sfn \"\$a.md5\" \"\$l.md5\" && echo \"\$l -> \$a\"
                done; [ \$encontrados = 1 ] || { echo 'no hay ${n}_UNSTABLE en el servidor' >&2; exit 1; }"
    done
    ;;
lista)
    pat=${*:-*}
    remoto "cd '$DIR' && for n in $pat; do ls -l --time-style=+%Y-%m-%d \${n}_* \${n}-* 2>/dev/null; done | awk '{print \$6, \$7, \$8, \$9}' | sort -u -k2"
    ;;
esac
