diff --git a/bash/src/_output_color.sh b/bash/src/_output_color.sh index afe6428..2cc5cc8 100644 --- a/bash/src/_output_color.sh +++ b/bash/src/_output_color.sh @@ -6,7 +6,8 @@ function __esection() { local length="${COLUMNS:-80}" setx lsep=__complete "$prefix" "$length" - - recho "$COULEUR_BLEUE$lsep$COULEUR_NORMALE" + recho " +$COULEUR_BLEUE$lsep$COULEUR_NORMALE" [ -n "$*" ] || return 0 length=$((length - 1)) setx -a lines=echo "$1" diff --git a/bash/src/_output_vanilla.sh b/bash/src/_output_vanilla.sh index cbd466f..165f1d7 100644 --- a/bash/src/_output_vanilla.sh +++ b/bash/src/_output_vanilla.sh @@ -6,7 +6,8 @@ function __esection() { local length="${COLUMNS:-80}" setx lsep=__complete "$prefix" "$length" - - recho "$lsep" + recho " +$lsep" [ -n "$*" ] || return 0 length=$((length - 1)) setx -a lines=echo "$1" diff --git a/bash/src/install.sh b/bash/src/install.sh new file mode 100644 index 0000000..fc4dc51 --- /dev/null +++ b/bash/src/install.sh @@ -0,0 +1,147 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@cooked nocomments +module: install "Outils de haut niveau pour installer des fichiers de configuration" +require: base + +if [ -z "$NULIB_INSTALL_CONFIGURED" ]; then + # Faut-il afficher le nom des fichiers copié/créés? + export NULIB_INSTALL_VERBOSE=1 + # Faut-il afficher les destinations avec ppath? + export NULIB_INSTALL_USES_PPATH= +fi +export NULIB_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 "$NULIB_INSTALL_VERBOSE" ]; then + if [ -n "$NULIB_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 __nulib_install_show_args() { + if [ -z "$NULIB_INSTALL_VERBOSE" ]; then + : + elif [ -n "$NULIB_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 "$NULIB_INSTALL_VERBOSE" ]; then + local destarg destname slash + destarg="$(dirname -- "$dest")" + destname="$(basename -- "$dest")" + if [ "$srcname" == "$destname" ]; then + slash=1 + else + destarg="$destarg/$destname" + fi + __nulib_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 link_new() { + # Si $2 n'existe pas, créer le lien symbolique $2 pointant vers $1 + [ -e "$2" ] && return 0 + + __nulib_install_show_args "$(basename -- "$2")" "$(dirname -- "$1")" + ln -s "$1" "$2" +}