#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS runsmod

function display_help() {
    uecho "$scriptname: récupérer des dépôts git à usage de runs

USAGE
    $scriptname [options] [-h host] [modules...]

Tous les dépôts spécifiés dans la configuration sont récupérés. Si des modules
sont spécifiés, les dépôts correspondants sont récupérés aussi. Avec l'option
-h, des dépôts spécifiques à l'hôte peuvent éventuellement être récupérés en
plus.

Il est possible de spécifier le module '*' pour récupérer tous les modules
disponibles. C'est utile sur un poste de développement.

OPTIONS
    -c, --config CONFIG
        Spécifier un fichier de configuration à charger au lieu de la valeur par
        défaut ~/etc/default/runs
    --prod
    --devel
        Forcer un mode de sélection des urls. En mode production, préférer pour
        le clonage les urls de production, qui sont en principe accessibles sans
        authentification et en lecture seule. En mode développement, préférer
        pour le clonage les urls de développement, qui sont en principe
        accessibles par clé ssh et en lecture/écriture
    --no-fetch
        Ne rien récupérer. Utile avec --update-repolist
    -N, --no-host
    -A, --all-hosts
    -H, -h, --host HOST
    -T, --this-host
        Options permettant de spécifier l'hôte pour la récupération de dépôts
        spécifiques.
        --no-host demande explicitement à ce qu'aucun hôte ne soit spécifié
        --all-hosts sélectionne tous les dépôts spécifiques
        --host récupère uniquement les dépôts pour l'hôte spécifié
        --this-host équivaut à --host $MYHOST
        L'option par défaut est --this-host en mode production et --all-hosts en
        mode développement
    --update-repolist
        Forcer la mise à jour de la liste des dépôts. En principe, cette mise à
        jour n'est pas faite plus d'une fois par période de 24 heures.
    --shallow-clone
        Faire un clone avec une profondeur de 1. C'est la valeur par défaut pour
        le mode production.
    -0, --offline
    -n, --no-pull
    -u, --pull
        Spécifier le mode opératoire pour la récupération des dépôts.
        En mode --offline, ni clone ni pull ne sont autorisés. Le module doit
        avoir déjà été cloné.
        En mode --no-pull, seul le clonage est autorisé, e.g. le dépôt est
        cloné si ce n'est pas déjà le cas.
        En mode --pull, cloner le dépôt si ce n'est pas déjà le cas, ou le
        mettre à jour le dépôt avant de l'utiliser s'il avait déjà été cloné.
        Par défaut, utiliser --pull en mode production et --no-pull en mode
        développement.
    -i, --identity IDENTITY_FILE
        Spécifier le fichier depuis lequel lire la clé privée pour les
        connexions par ssh.
    -o, --output OUTPUT
        Spécifier un fichier dans lequel écrire des définitions de variables,
        notamment REPODIRS qui reçoit la liste des chemins des dépôts qui ont
        été récupérés. De plus, les variables RUNSSCRIPTSPATH, RUNSMODULESPATH
        et RUNSHOSTSPATH sont définies.
    -a, --append-output
        Ajouter au fichier OUTPUT au lieu de l'écraser"
}

config=
mode=--NOT-SET--
fetch=1
host_mode=auto
host=
update_repolist=auto
shallow_clone=--NOT-SET--
update=--NOT-SET--
identity=
output=
append_output=
parse_opts "${PRETTYOPTS[@]}" \
    --help '$exit_with display_help' \
    -c:,--config: config= \
    --prod mode=prod \
    --devel mode=devel \
    --no-fetch fetch= \
    -N,--no-host host_mode=none \
    -A,--all-hosts host_mode=all \
    -h:,-H:,--host: '$set@ host; host_mode=one' \
    -T,--this-host host_mode=self \
    --update-repolist update_repolist=1 \
    --no-update-repolist update_repolist= \
    --shallow-clone shallow_clone=yes \
    --no-shallow-clone shallow_clone=no \
    -0,--offline update=offline \
    -n,--no-pull update=clone \
    -u,--pull update=pull \
    -i:,--identity: identity= \
    -o:,--output: output= \
    -a,--append-output append_output=1 \
    @ args -- "$@" && set -- "${args[@]}" || die "$args"

if [ -z "$config" ]; then
    # Vérifier si une configuration existe
    noconfig=1
    get_defaults_files dconfs runsmod
    for dconf in "${dconfs[@]}"; do
        if [ -n "$(<"$dconf" filter_comment)" ]; then
            noconfig=
            break
        fi
    done
    if [ -n "$noconfig" ]; then
        setx userconfig=get_user_defaults_file runsmod
        ewarn "Aucune configuration n'existe pour runsmod"
        if ask_yesno "Voulez-vous installer une configuration par défaut?" X; then
            if [ ! -f "$userconfig" ]; then
                ewarn "Les profils par défaut ne sont pas installés. Il est conseillé d'installer nutools puis de faire 'uenv -u' avant de continuer"
                ask_yesno "Voulez-vous continuer?" N || die
                mkdirof "$userconfig"
                touch "$userconfig"
            fi
            setx lines=wc -l <"$userconfig"
            lines=$(($lines + 4 + 1))
            # dans la ligne ci-dessus, 4 est le nombre de lignes affichées par
            # la commande suivante:
            echo >>"$userconfig" "
### Configuration par défaut
# Ces valeurs sont copiées pour référence depuis le module runsmod.defaults
"
            awk <"$ULIBDIR/runsmod.defaults" >>"$userconfig" '
BEGIN { copy = 0 }
/--runsmod.defaults--/ { copy = 1; next }
copy { print }
'
            "${EDITOR:-vi}" +"$lines" "$userconfig"
        elif check_interaction -y; then
            die
        fi
    fi
fi

__runsmod_loadconf "$config" "$mode" "$shallow_clone" "$update" || die
runsmod_checkenv || die
estepn "Opération dans le mode $RUNSMOD_MODE"

if [ "$host_mode" == auto ]; then
    case "$RUNSMOD_MODE" in
    prod) host_mode=self;;
    devel) host_mode=all;;
    *) host_mode=none;;
    esac
fi

if [ "$update_repolist" == auto ]; then
    if runsmod_should_update_repolists; then
        etitle "Vérification de la liste des dépôts"
        runsmod_update_repolists
        eend
    fi
elif [ -n "$update_repolist" ]; then
    etitle "Mise à jour de la liste des dépôts"
    runsmod_update_repolists 1
    eend
fi

r=0
if [ -n "$fetch" ]; then
    etitle "Clonage/mise à jour des dépôts"
    runsmod_setup_vars
    runsmod_clone_or_pull "$host_mode" "$host" "$@" || r=1
    runsmod_teardown_vars
    eend
fi

if [ -n "$output" ]; then
    [ "$output" == "-" ] && output=/dev/stdout
    [ -n "$append_output" ] || >"$output"
    set_array_cmd REPODIRS >>"$output"
    echo_setv RUNSSCRIPTSPATH="$RUNSSCRIPTSPATH" >>"$output"
    echo_setv RUNSMODULESPATH="$RUNSMODULESPATH" >>"$output"
    echo_setv RUNSHOSTSPATH="$RUNSHOSTSPATH" >>"$output"
fi

exit $r