diff --git a/bash/src/base.path.sh b/bash/src/base.path.sh index 03f705d..80a1da2 100644 --- a/bash/src/base.path.sh +++ b/bash/src/base.path.sh @@ -155,3 +155,79 @@ function ac_set_tmpdir() { _setv "$1" "$sr__t" fi } + +################################################################################ +## manipulation de chemins + +#XXX repris tel quel depuis nutools, à migrer + +function normpath() { +# normaliser le chemin $1, qui est soit absolu, soit relatif à $2 (qui vaut +# $(pwd) par défaut) + local -a parts + local part ap + IFS=/ read -a parts <<<"$1" + if [ "${1#/}" != "$1" ]; then + ap=/ + elif [ -n "$2" ]; then + ap="$2" + else + ap="$(pwd)" + fi + for part in "${parts[@]}"; do + if [ "$part" == "." ]; then + continue + elif [ "$part" == ".." ]; then + ap="${ap%/*}" + [ -n "$ap" ] || ap=/ + else + [ "$ap" != "/" ] && ap="$ap/" + ap="$ap$part" + fi + done + recho "$ap" +} +function __normpath() { + # normaliser dans les cas simple le chemin absolu $1. sinon retourner 1. + # cette fonction est utilisée par abspath() + if [ -d "$1" ]; then + if [ -x "$1" ]; then + # le cas le plus simple: un répertoire dans lequel on peut entrer + (cd "$1"; pwd) + return 0 + fi + elif [ -f "$1" ]; then + local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" + if [ -x "$dn" ]; then + # autre cas simple: un fichier situé dans un répertoire dans lequel + # on peut entrer + (cd "$dn"; echo "$(pwd)/$bn") + return 0 + fi + fi + return 1 +} +function abspath() { +# Retourner un chemin absolu vers $1. Si $2 est non nul et si $1 est un chemin +# relatif, alors $1 est exprimé par rapport à $2, sinon il est exprimé par +# rapport au répertoire courant. +# Si le chemin n'existe pas, il n'est PAS normalisé. Sinon, les meilleurs +# efforts sont faits pour normaliser le chemin. + local ap="$1" + if [ "${ap#/}" != "$ap" ]; then + # chemin absolu. on peut ignorer $2 + __normpath "$ap" && return + else + # chemin relatif. il faut exprimer le chemin par rapport à $2 + local cwd + if [ -n "$2" ]; then + cwd="$(abspath "$2")" + else + cwd="$(pwd)" + fi + ap="$cwd/$ap" + __normpath "$ap" && return + fi + # dans les cas spéciaux, il faut calculer "manuellement" le répertoire absolu + normpath "$ap" +}