##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Des outils de haut niveau pour installer des fichiers de configuration
##@cooked nocomments
##@require base
uprovide install
urequire base

if [ -z "$ULIB_INSTALL_CONFIGURED" ]; then
    # Faut-il afficher le nom des fichiers copié/créés?
    export ULIB_INSTALL_VERBOSE=1
    # Faut-il afficher les destinations avec ppath?
    export ULIB_INSTALL_USES_PPATH=
fi
export ULIB_INSTALL_CONFIGURED=1

function ensure_exists() {
    # créer le fichier vide "$1" s'il n'existe pas déjà. retourner vrai si le
    # fichier a été créé sans erreur
    [ -f "$1" ] || {
        if [ -n "$ULIB_INSTALL_VERBOSE" ]; then
            if [ -n "$ULIB_INSTALL_USES_PPATH" ]; then
                estep "$(ppath "$1")"
            else
                estep "$1"
            fi
        fi
        mkdirof "$1"
        touch "$1"
        return $?
    }
    return 1
}

function __ulib_install_show_args() {
    if [ -z "$ULIB_INSTALL_VERBOSE" ]; then
        :
    elif [ -n "$ULIB_INSTALL_USES_PPATH" ]; then
        estep "$1 --> $(ppath "$2")${3:+/}"
    else
        estep "$1 --> $2${3:+/}"
    fi
}

function copy_replace() {
    # Copier de façon inconditionnelle le fichier $1 vers le fichier $2
    local src="$1" dest="$2"
    local srcname="$(basename -- "$src")"

    [ -d "$dest" ] && dest="$dest/$srcname"
    mkdirof "$dest" || return 1

    if [ -n "$ULIB_INSTALL_VERBOSE" ]; then
        local destarg destname slash
        destarg="$(dirname -- "$dest")"
        destname="$(basename -- "$dest")"
        if [ "$srcname" == "$destname" ]; then
            slash=1
        else
            destarg="$destarg/$destname"
        fi
        __ulib_install_show_args "$srcname" "$destarg" "$slash"
    fi
    cp "$src" "$dest"
}

function copy_new() {
    # copier le fichier "$1" vers le fichier "$2"
    # Ne pas écraser le fichier destination s'il existe déjà
    # Retourner vrai si le fichier a été copié sans erreur
    local src="$1" dest="$2"

    [ -d "$dest" ] && dest="$dest/$(basename -- "$src")"
    mkdirof "$dest" || return 1

    if [ ! -e "$dest" ]; then
        copy_replace "$src" "$dest"
    else
        return 1
    fi
}

function copy_update() {
    # copier le fichier "$1" vers le fichier "$2", si $2 n'existe pas, ou si $1
    # a été modifié par rapport à $2.
    # Retourner vrai si le fichier a été copié sans erreur.
    local src="$1" dest="$2"

    [ -d "$dest" ] && dest="$dest/$(basename -- "$src")"
    mkdirof "$dest" || return 1

    if [ ! -e "$dest" ]; then
        copy_replace "$src" "$dest"
    elif testdiff "$src" "$dest"; then
        copy_replace "$src" "$dest"
    else
        return 1
    fi
}


function copy_update_ask() {
    # Copier ou mettre à jour le fichier $1 vers le fichier $2.
    # Si le fichier existe déjà, la différence est affichée, et une confirmation
    # est demandée pour l'écrasement du fichier.
    # Retourner vrai si le fichier a été copié sans erreur.
    local src="$1" dest="$2"

    [ -d "$dest" ] && dest="$dest/$(basename -- "$src")"
    mkdirof "$dest" || return 1

    [ -f "$dest" ] || copy_replace "$src" "$dest"
    if testdiff "$src" "$dest"; then
        diff -u "$dest" "$src"
        if ask_yesno -c "Voulez-vous remplacer $(ppath "$dest") par la nouvelle version?" C; then
            copy_replace "$src" "$dest"
            return $?
        fi
    fi
    return 1
}

function copy_tree() {
    # Copier de façon inconditionnelle l'arborescence $1 dans l'arborescence $2
    local srcdir="$1" destdir="$2"
    mkdir -p "$destdir" || return 1
    cpdirnovcs "$srcdir" "$destdir"
}

function link_new() {
    # Si $2 n'existe pas, créer le lien symbolique $2 pointant vers $1
    [ -e "$2" ] && return 0

    __ulib_install_show_args "$(basename -- "$2")" "$(dirname -- "$1")"
    ln -s "$1" "$2"
}
