#!/bin/bash
set -euo pipefail

source /etc/repo-update.conf 2>/dev/null || true
REPO_NAME="${REPO_NAME:-breez}"
REPO_BASE="${REPO_BASE:-/srv/repo/${REPO_NAME}}"
UPLOAD_DIR="${REPO_BASE}/.upload"
INCOMING_DIR="${REPO_BASE}/incoming"
REPO_UPDATE_BIN="${REPO_UPDATE_BIN:-/usr/bin/repo-update}"

fail() {
    echo "repo-upload: $*" >&2
    exit 1
}

mkdir -p "${UPLOAD_DIR}" "${INCOMING_DIR}"
umask 077

read -r action filename extra <<< "${SSH_ORIGINAL_COMMAND:-}"

case "${action:-}" in
    upload)
        [[ -n "${filename:-}" && -z "${extra:-}" ]] || fail "invalid upload command"
        [[ "${filename}" =~ ^[A-Za-z0-9@._+-]+\.pkg\.tar\.(zst|xz|gz)(\.sig)?$ ]] || \
            fail "invalid package filename"

        temporary="$(mktemp "${UPLOAD_DIR}/.upload.XXXXXXXX")"
        trap 'rm -f -- "${temporary}"' EXIT
        cat > "${temporary}"

        if [[ "${filename}" != *.sig ]]; then
            bsdtar -tf "${temporary}" .PKGINFO &>/dev/null || fail "package integrity check failed"
        fi

        chmod 0640 "${temporary}"
        mv -- "${temporary}" "${UPLOAD_DIR}/${filename}"
        trap - EXIT
        echo "staged ${filename}"
        ;;
    publish)
        [[ -z "${filename:-}" && -z "${extra:-}" ]] || fail "publish takes no arguments"

        shopt -s nullglob
        packages=("${UPLOAD_DIR}"/*.pkg.tar.{zst,xz,gz})
        shopt -u nullglob
        [[ ${#packages[@]} -gt 0 ]] || fail "no staged packages"

        for package in "${packages[@]}"; do
            bsdtar -tf "${package}" .PKGINFO &>/dev/null || fail "invalid staged package: $(basename "$package")"
            [[ -f "${package}.sig" ]] && mv -- "${package}.sig" "${INCOMING_DIR}/"
            mv -- "${package}" "${INCOMING_DIR}/"
        done

        exec "${REPO_UPDATE_BIN}"
        ;;
    *)
        fail "command not allowed"
        ;;
esac
