diff --git a/lib/ulib/install b/lib/ulib/install index 89de2fc..014bb33 100644 --- a/lib/ulib/install +++ b/lib/ulib/install @@ -111,7 +111,15 @@ 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")" @@ -119,10 +127,14 @@ function copy_update_ask() { [ -f "$dest" ] || copy_replace "$src" "$dest" if testdiff "$src" "$dest"; then - diff -u "$dest" "$src" - if ask_yesno -c "Voulez-vous remplacer $(ppath "$dest") par la nouvelle version?" C; 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 diff --git a/lib/ulib/multiconf b/lib/ulib/multiconf index a6ff13c..0fda462 100644 --- a/lib/ulib/multiconf +++ b/lib/ulib/multiconf @@ -2,6 +2,7 @@ ## Gestion de fichiers de configuration et de répertoires de configuration ##@cooked nocomments uprovide multiconf +urequire install function conf_local() { # afficher les commandes pour définir comme locales les variables utilisées @@ -145,3 +146,37 @@ function conf_load_files() { done done } + +function conf_install() { + # USAGE: conf_install DEST SRCS... + # installer les fichiers de SRCS dans le répertoire standardisé DEST + # ## destination + # - si DEST est un nom sans chemin, e.g NAME, alors la destination est + # ~/etc/NAME.d + # - si DEST est un nom avec chemin, alors la valeur est prise telle quelle + # comme destination, et le répertoire est créé le cas échéant. + # Si un fichier existe déjà dans la destination, afficher une demande de + # confirmation avant de l'écraser + # ## source + # - si SRC est un fichier, le prendre tel quel + # - si SRC est un répertoire, prendre tous les fichiers SRC/*.conf + # - si SRC est un pattern, prendre tous les fichiers correspondant + local -a srcs + local src dir wc + local dest="$1"; shift + [[ "$dest" == */* ]] || dest="$HOME/etc/$dest.d" + mkdir -p "$dest" || return 1 + for src in "$@"; do + if [ -f "$src" ]; then + srcs=("$src") + elif [ -d "$src" ]; then + array_lsfiles srcs "$src" "*.conf" + else + splitwcs "$src" dir wc + array_lsfiles srcs "$dir" "$wc" + fi + for src in "${srcs[@]}"; do + copy_update_ask -y "$src" "$dest" + done + done +}