nutools/udir

211 lines
8.9 KiB
Bash
Executable File

#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: gérer les variables de répertoire
USAGE
$scriptname [options] [dir [name=value...]]
Par défaut, mettre à jour les variables du répertoire avec les définitions
données. Attention! Les définitions sont insérées ${COULEUR_JAUNE}*telles quelles*${COULEUR_NORMALE} dans le
fichier. Par exemple, pour définir une variable qui contient des espaces,
on pourra faire:
$scriptname /path/to/dir 'var=\"value with spaces\"'
pour définir un tableau:
$scriptname /path/to/dir 'array=(first second)'
OPTIONS
-i
Afficher la description du répertoire. C'est l'action par défaut si ce
script est lancé *sans argument*
-d
Afficher toutes les variables définies pour le répertoire 'dir'.
-x 'cmds;...'
Exécuter les commandes dans le contexte des variables définies pour le
répertoire.
-e
Editer les variables du répertoire
--local-vars
Avec -d, ajouter des directives 'local' aux définitions de variables
-A
Avec -d et -x, considérer les variables de tous les répertoires parents
jusqu'à la racine. Pour ne considérer que les variables du répertoire
spécifié (par défaut), utiliser --local-only
--help-vars
Afficher une descriptions des variables spécifiques aux outils de nutools"
}
function display_help_vars() {
local OENC="$UTF8"
uecho "\
udir_desc Description du projet contenu dans ce répertoire, affichée avec
'udir -i'
udir_note Note importante concernant le contenu de ce répertoire.
Cette note doit être affichée automatiquement quand on entre dans
le répertoire.
udir_types Liste de types pour ce répertoire. Les valeurs valides sont:
uinst -- un répertoire installable avec uinst.
uinst:legacy -- un répertoire installable avec uinst en utilisant
l'ancien fichier de configuration .uinst.conf
uinst:python -- un répertoire de projet python à installer avec
'python setup.py'
uinc Mode de dépliage des fichiers avant le déploiement. Les valeurs
valides sont:
false -- ne jamais faire dépliage/repliage automatique
release -- ne faire le dépliage que lors de 'release -u'
true -- faire systématiquement le dépliage/repliage pour
chaque opération
uinc_options
Options à passer automatiquement à uinc quand il traite ce
répertoire
uinc_args Liste des fichiers à traiter par uinc en mode automatique
config_scripts
Liste de scripts de configuration à lancer avant déploiement,
avec les droits de l'utilisateur qui lance uinst.
Chacun de ces script est exécuté avec en unique argument un fichier
de configuration, qui représente la somme de tous les paramètres
qui ont été spécifiés.
Les script peuvent augmenter ce fichier de configuration avec
d'autres valeurs s'ils le désirent. Ces nouvelles valeurs pourront
être utilisées par les scripts suivants, ou les scripts root.
Pour annuler le déploiement, les scripts de configuration peuvent
créer un fichier nommé 'abort' dans le répertoire qui contient le
fichier de configuration. Par défaut, la variable ABORT contient le
chemin vers ce fichier, sauf si cette variable a été surchargée par
des paramètres du fichier de configuration.
configure_variables
Liste de variables configurables. Pour chacune des variables de
ce tableau, un tableau nommé configure_\${name}_for contient la
liste des fichiers qui doivent être mis à jour. Dans ce fichiers,
toutes les occurences de @@name@@ sont remplacées par la valeur
de la variable \$name.
install_profiles
Faut-il installer les profils pour l'utilisateur courant dans
~/etc
profiledir Répertoire source pour les fichiers à copier dans ~/etc/profile.d
bashrcdir Répertoire source pour les fichiers à copier dans ~/etc/bashrc.d
defaultdir Répertoire source pour les fichiers à copier dans ~/etc/default.d
copy_files Faut-il copier les fichiers sources dans le répertoire de
destination? Les fichiers sources et le répertoire de
destination sont calculés à partir des valeurs des variables
\$srcdir, \$files, \$destdir
srcdir Si \$copy_files==true, répertoire source pour la copie des fichiers.
files Liste de fichiers à copier, exprimés par rapport à srcdir.
Si ce tableau est vide, tout le répertoire courant est déployé
et écrase la destination. Sinon, le répertoire de destination
n'est pas écrasé et seuls les fichiers mentionnés sont copiés.
destdir Répertoire de base pour la copie des fichiers. Le répertoire de
destination proprement dit est \$destdir/\$dirname où \$dirname est
le nom de base de ce répertoire si \$files est un tableau
vide. Sinon, la destination est \$destdir. \$dest contient le
répertoire de destination effectif.
owner Propriétaire et groupe des fichiers après le déploiement. Le
propriétaire et le groupe sont appliqués de façon récursive à tous
les fichiers déployés.
modes Liste de modes pour les fichiers après le déploiement. Le
premier élément de ce tableau contient les modes à appliquer de
façon récursive à tous les fichiers déployés. Les éléments suivants
doivent être de la forme path:mode, où path est un chemin relatif à
\$dest. Par contre, dans ce cas la modification du mode ne se fait
pas de manière récursive, et il faut spécifier chaque fichier
concerné séparément.
root_scripts
Liste de scripts de configuration à lancer après le déploiement,
avec les droits de root. Si des fichiers sont copiés pendant le
déploiement, les scripts sont lancés dans le répertoire de
destination."
}
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS udir ||
exit 1
action=auto
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
--help-vars '$exit_with display_help_vars' \
-u,--update action=update \
-i,--show-desc action=desc \
--show-note action=desc:note \
-d,--dump action=dump \
-x,--eval action=eval \
-e,--edit action=edit \
--local-vars local_vars \
-A,--all-parents all_parents \
--local-only local_only \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
function check_dir() { [ -d "$1" ] || die "$1: Répertoire non trouvé"; }
[ -z "$all_parents" -a -z "$local_only" ] && local_only=1
[ -z "$*" -a "$action" == "auto" ] && action=desc
[ "$action" == "auto" ] && action=update
udir="${1:-.}"; shift
if [ "$action" == "update" ]; then
check_dir "$udir"
if [ -z "$*" ]; then
# pas de variable à mettre à jour, afficher simplement la note si elle existe
udir_check "$udir" &&
udir_eval "$udir" '[ -n "$udir_note" ] && eecho "$(ppath "$udir"): $udir_note"'
else
# mettre à jour les variables
udir_create_maybe "$udir"
udir_update "$udir" "$@"
check_verbosity -c && udir_dump "$udir" 1>&2
fi
elif [ "$action" == "desc" ]; then
check_dir "$udir"
udir_desc=
udir_note=
udir_ppath="$(ppath "$udir")"
if [ "$udir_ppath" == "." ]; then
udir_ppath="$(abspath "$udir_ppath")"
udir_ppath="$(basename "$udir_ppath")"
fi
udir_eval "$udir" '
if [ -n "$udir_desc" -o -n "$udir_note" ]; then
eecho "$udir_ppath: $udir_desc"
[ -n "$udir_note" ] && estepe "$udir_note"
fi
'
elif [ "$action" == "desc:note" ]; then
check_dir "$udir"
udir_note=
udir_eval "$udir" '
maxi="${COLUMNS:-80}"
line0="== $(basename "$PWD") "
line1=
while [ ${#line0} -lt $maxi ]; do line0="$line0="; done
while [ ${#line1} -lt $maxi ]; do line1="$line1="; done
if [ -n "$udir_note" ]; then
eecho "$COULEUR_ROUGE$line0$COULEUR_NORMALE
$udir_note
$COULEUR_ROUGE$line1$COULEUR_NORMALE"
fi
'
elif [ "$action" == "dump" ]; then
[ -n "$local_vars" ] && opts=(-l) || opts=()
check_dir "$udir"
if [ -n "$all_parents" ]; then
udir_dump_all "${opts[@]}" "$udir"
elif [ -n "$local_only" ]; then
udir_dump "${opts[@]}" "$udir"
fi
elif [ "$action" == "eval" ]; then
check_dir "$udir"
if [ -n "$all_parents" ]; then
udir_eval_all "$udir" "$@"
elif [ -n "$local_only" ]; then
udir_eval "$udir" "$@"
fi
elif [ "$action" == "edit" ]; then
check_dir "$udir"
udir_edit "$udir"
fi