# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8

# ewaitcmd devait remplacer ewait, mais l'implémentation souffre de problèmes de
# synchronisation entre l'affichage et l'exécution de la commande. Le code est
# stocké dans ce fichier, en attendant de trouver une solution...

function __utools_eplus_file() {
    # Afficher le nom d'un fichier à utiliser pour __utools_eplus()
    local file="$TMPDIR/utools.$$.${utools_eplus_count_:=0}"
    while [ -f "$file" ]; do
        utools_eplus_count_=$(($utools_eplus_count_ + 1))
        file="$TMPDIR/utools.$$.$utools_eplus_count_"
    done
    >"$file"
    echo "$file"
}

function __utools_eplus() {
    # Après un délai de 2 secondes, afficher un caractère "+" toutes les
    # secondes, et ce tant que le fichier $1 existe
    [ -f "$1" ] || return
    sleep 2

    while true; do
        [ -f "$1" ] || break
        echo_ "+"
        sleep 1
    done
}

function ewaitcmd() {
    # Une étape d'une opération commencée par ebegin, matérialisée par des "+"
    # qui s'affichent tant que le processus correspondant à la ligne de commande
    # tourne.
    # XXX problèmes: problèmes de synchronisme...
    local eplus_file exitcode

    if [ -n "$utools_edot_first_" ]; then
        # au premier dot, afficher un espace d'abord
        echo_ " "
        utools_edot_first_=
    fi

    # commencer à afficher les "+"
    eplus_file="$(__utools_eplus_file)"
    __utools_eplus "$eplus_file" &

    # lancer la commande
    "$@"
    exitcode=$?

    # arrêter l'affichage des "+"
    /bin/rm -f "$eplus_file"

    if [ $exitcode -ne 0 ]; then
        [ "$utools_ESTATUS_" -eq 0 ] && utools_ESTATUS_=$exitcode
        echo_ "${COULEUR_ROUGE}x${COULEUR_NORMALE}"
    else
        echo_ "."
    fi

    return $exitcode
}