nutools/lib/ulib/install

157 lines
4.7 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
}
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?" 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"
}