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

function display_help() {
    uecho "$scriptname: Créer une archive auto-extractible qui installe son contenu avec uinst

USAGE
    $scriptname [options] [--bare] src cmd...
    $scriptname [options] [--uinst] src

OPTIONS
    --bare
        Installer le contenu de l'archive en lançant la commande 'cmd...' avec
        le répertoire courant étant le contenu de l'archive. Typiquement, ce
        sera une commande de forme './script', où script est un fichier situé à
        la racine de l'archive
        Dans ce mode d'installation, l'option --self-contained est ignorée.
    --uinst
        Installer le contenu de l'archive avec uinst (par défaut)
    -o dest
        Spécifier le fichier de sortie. Par défaut, il s'agit de
        \${src}-installer.run
    --tmp-archive
        Spécifier qu'il s'agit d'une archive temporaire. Cette archive
        s'auto-détruit après utilisation.
    --self-contained
        Spécifier que l'archive doit pouvoir s'installer même sur un système sur
        lequel nutools n'est pas installé. Cette archive contiendra une copie
        locale de ulib et uinst.sh"
}

source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS ||
exit 1

MAKESELFDIR="$scriptdir/lib/makeself-2.1.5"

sfxtype=uinst
mode=755
parse_opts "${PRETTYOPTS[@]}" \
    --help '$exit_with display_help' \
    --bare sfxtype=bare \
    --uinst sfxtype=uinst \
    -o: dest \
    -m: mode= \
    --tmp-archive tmp_archive \
    --self-contained self_contained \
    @ args -- "$@" && set -- "${args[@]}" || die "$args"

src="$(abspath "${1:-.}")"
srcname="$(basename "$src")"

################################################################################
if [ "$sfxtype" == "uinst" ]; then
    ac_set_tmpdir archivedir
    conf="$archivedir/uinst_prepare.conf"
    
    ## préparer l'installation
    "$scriptdir/uinst" --prepare-1s "$archivedir" \
        --prepare-conf "$conf" \
        ${self_contained:+--prepare-with-ulib} \
        "$src" || die
    
    # la commande ci-dessus crée un fichier de configuration avec la variable
    # prepare_name qui contient le *nom* du répertoire ou du fichier dans
    # $archivedir à installer
    source "$conf"
    [ -n "$dest" ] || dest="${prepare_name}_installer.run"
    
    # si le fichier à générer se trouve dans le répertoire à installer, créer
    # l'archive dans le répertoire au-dessus
    dest="$(abspath "$dest")"
    if [ "$src" == "$dest" -o "${dest#$src/}" != "$dest" ]; then
        dest="$(dirname "$src")/$(basename "$dest")"
    fi
    
    if [ -f "$dest" -a -z "$tmp_archive" ]; then
        ask_yesno "Voulez-vous remplacer l'archive existante $(ppath "$dest")?" O || exit 0
    fi
    
    ## arguments pour la création de l'archive
    args=("$MAKESELFDIR/makeself.sh" --quiet ${tmp_archive:+--tmp-archive} --nox11
        "$archivedir" "$dest"
        "$srcname installer"
        )

    if [ -n "$self_contained" ]; then
        args=("${args[@]}" /bin/sh ./uinst.sh --prepare-2s)
    else
        args=("${args[@]}" uinst)
    fi
    args=("${args[@]}" "$prepare_name")

################################################################################
elif [ "$sfxtype" == "bare" ]; then
    shift
    [ -n "$*" ] || die "Vous devez spécifier la commande à lancer pour installer l'archive"
    [ -d "$src" ] || die "$src doit être un répertoire"
    [ -n "$dest" ] || dest="${srcname}_installer.run"

    # si le fichier à générer se trouve dans le répertoire à installer, créer
    # l'archive dans le répertoire au-dessus
    dest="$(abspath "$dest")"
    if [ "$src" == "$dest" -o "${dest#$src/}" != "$dest" ]; then
        dest="$(dirname "$src")/$(basename "$dest")"
    fi
    
    if [ -f "$dest" -a -z "$tmp_archive" ]; then
        ask_yesno "Voulez-vous remplacer l'archive existante $(ppath "$dest")?" O || exit 0
    fi

    ## arguments pour la création de l'archive
    args=("$MAKESELFDIR/makeself.sh" --quiet ${tmp_archive:+--tmp-archive} --nox11
        "$src" "$dest"
        "$srcname installer"
        "$@"
    )
fi

################################################################################
# créer l'archive

estep "Création de l'archive $(ppath "$dest")"
"${args[@]}"

# l'archive doit être exécutable
[ -n "$mode" ] && chmod "$mode" "$dest"

exit 0