157 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
##@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à, avec les permissions
 | 
						|
    # $2(=644). 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"
 | 
						|
        local r=0
 | 
						|
        touch "$1" && chmod "${2:-644}" "$1" || r=$?
 | 
						|
        return $r
 | 
						|
    }
 | 
						|
    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, en
 | 
						|
    # réinitialisation les permissions à la valeur $3
 | 
						|
    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
 | 
						|
    local r=0
 | 
						|
    if cp "$src" "$dest"; then
 | 
						|
        if [ -n "$3" ]; then
 | 
						|
            chmod "$3" "$dest" || r=$?
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
    return $r
 | 
						|
}
 | 
						|
 | 
						|
function copy_new() {
 | 
						|
    # Copier le fichier "$1" vers le fichier "$2", avec les permissions $3(=644)
 | 
						|
    # 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" "$3"
 | 
						|
    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. Réinitialiser le cas échéant les
 | 
						|
    # permissions à la valeur $3
 | 
						|
    # 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" "$3"
 | 
						|
    elif testdiff "$src" "$dest"; then
 | 
						|
        copy_replace "$src" "$dest" "$3"
 | 
						|
    else
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
COPY_UPDATE_ASK_DEFAULT=
 | 
						|
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.
 | 
						|
    # si $1 commence par '-' alors on s'en sert comme option pour configurer le
 | 
						|
    # niveau d'interaction pour demander la confirmation. les paramètres sont
 | 
						|
    # alors décalés
 | 
						|
    # Retourner vrai si le fichier a été copié sans erreur.
 | 
						|
    local interopt=-c
 | 
						|
    if [[ "$1" == -* ]]; then
 | 
						|
        interopt="$1"
 | 
						|
        shift
 | 
						|
    fi
 | 
						|
    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
 | 
						|
        check_interaction "$interopt" && diff -u "$dest" "$src"
 | 
						|
        if ask_yesno "$interopt" "Voulez-vous remplacer $(ppath "$dest") par la nouvelle version?" "${COPY_UPDATE_ASK_DEFAULT:-C}"; then
 | 
						|
            copy_replace "$src" "$dest" "$3"
 | 
						|
            return $?
 | 
						|
        elif ! check_interaction "$interopt"; then
 | 
						|
            ewarn "Les mises à jours suivantes sont disponibles:"
 | 
						|
            diff -u "$dest" "$src"
 | 
						|
            ewarn "Le fichier $(ppath "$dest") n'a pas été mis à jour"
 | 
						|
        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"
 | 
						|
}
 |