# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@cooked nocomments module: base.path base_ "Fonctions de base: gestion des chemins et des fichiers" require: base.core function: base_in_path "tester l'existence d'un programme dans le PATH" function base_in_path() { [ -n "$1" -a -x "$(which "$1" 2>/dev/null)" ] } function: base_delpath "supprimer le chemin \$1 de \$2(=PATH)" function base_delpath() { local _qdir="${1//\//\\/}" eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' } function: base_addpath "Ajouter le chemin \$1 à la fin, dans \$2(=PATH), s'il n'y existe pas déjà" function base_addpath() { local _qdir="${1//\//\\/}" eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' } function: base_inspathm "Ajouter le chemin \$1 au début, dans \$2(=PATH), s'il n'y existe pas déjà" function base_inspathm() { local _qdir="${1//\//\\/}" eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' } function: base_inspath "S'assurer que le chemin \$1 est au début de \$2(=PATH)" function base_inspath() { base_delpath "$@" base_inspathm "$@" } function: base_push_cwd "enregistrer le répertoire courant dans la variable \$2(=cwd) et se placer dans le répertoire \$1" function base_push_cwd() { eval "${2:-cwd}"'="$(pwd)"' cd "$1" } function: base_pop_cwd "se placer dans le répertoire \${!\$2}(=\$cwd) puis retourner le code d'erreur \$1(=0)" function base_pop_cwd() { eval 'cd "$'"${2:-cwd}"'"' return "${1:-0}" } ################################################################################ ## fichiers temporaires function: base_mktempf "générer un fichier temporaire et retourner son nom" function base_mktempf() { mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" } function: base_mktempd "générer un répertoire temporaire et retourner son nom" function base_mktempd() { mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" } function base_ac__forgetall() { NULIB__AC_FILES=(); } base_ac__forgetall function base_ac__trap() { local file for file in "${NULIB__AC_FILES[@]}"; do [ -e "$file" ] && rm -rf "$file" 2>/dev/null done base_ac__forgetall } trap base_ac__trap 1 3 15 EXIT function: base_autoclean "\ Ajouter les fichiers spécifiés à la liste des fichiers à supprimer à la fin du programme" function base_autoclean() { local file for file in "$@"; do [ -n "$file" ] && NULIB__AC_FILES=("${NULIB__AC_FILES[@]}" "$file") done } function: base_ac_cleanall "\ Supprimer *tous* les fichiers temporaires gérés par autoclean tout de suite." function base_ac_cleanall() { base_ac__trap } function: base_ac_clean "\ Supprimer les fichier temporaires \$1..@ si et seulement s'ils ont été générés par base_ac_set_tmpfile() ou base_ac_set_tmpdir()" function base_ac_clean() { local file acfile found local -a acfiles for acfile in "${NULIB__AC_FILES[@]}"; do found= for file in "$@"; do if [ "$file" == "$acfile" ]; then found=1 [ -e "$file" ] && rm -rf "$file" 2>/dev/null break fi done [ -z "$found" ] && acfiles=("${acfiles[@]}" "$acfile") done NULIB__AC_FILES=("${acfiles[@]}") } function: base_ac_set_tmpfile "\ Créer un fichier temporaire avec le motif \$2, l'ajouter à la liste des fichiers à supprimer en fin de programme, et mettre sa valeur dans la variable \$1 En mode debug, si (\$5 est vide ou \${!5} est une valeur vraie), et si \$3 n'est pas vide, prendre ce fichier au lieu de générer un nouveau fichier temporaire. Si \$4==keep, ne pas écraser le fichier \$3 s'il existe." function base_ac_set_tmpfile() { local se__d if base_is_debug; then if [ -n "$5" ]; then is_yes "${!5}" && se__d=1 else se__d=1 fi fi if [ -n "$se__d" -a -n "$3" ]; then _setv "$1" "$3" [ -f "$3" -a "$4" == keep ] || >"$3" else local se__t="$(base_mktempf "$2")" base_autoclean "$se__t" _setv "$1" "$se__t" fi } function: base_ac_set_tmpdir "\ Créer un répertoire temporaire avec le motif \$2, l'ajouter à la liste des fichiers à supprimer en fin de programme, et mettre sa valeur dans la variable \$1 En mode debug, si (\$4 est vide ou \${!4} est une valeur vraie), et si \$3 n'est pas vide, prendre ce nom de répertoire au lieu de créer un nouveau répertoire temporaire" function base_ac_set_tmpdir() { local sr__d if base_is_debug; then if [ -n "$4" ]; then is_yes "${!4}" && sr__d=1 else sr__d=1 fi fi if [ -n "$sr__d" -a -n "$3" ]; then _setv "$1" "$3" mkdir -p "$3" else local sr__t="$(base_mktempd "$2")" base_autoclean "$sr__t" _setv "$1" "$sr__t" fi }