diff --git a/lib/ulib/base b/lib/ulib/base index bbc28e7..3aa15bc 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -768,6 +768,16 @@ function deref() { done abspath "$file" } +function readlinka() { +# Afficher un chemin absolu vers la destination du fichier $1. Si $1 n'est pas +# un lien, afficher simplement le chemin du fichier + if [ -L "$1" ]; then + local linkdir="$(dirname -- "$1")" + abspath "$(readlink "$1")" "$linkdir" + else + abspath "$1" + fi +} function readlinkm() { # Retourner un chemin absolu vers le fichier $1, dans lequel toutes les # composantes "lien symbolique" ont été supprimées. Il n'est pas requis que les @@ -832,6 +842,17 @@ function update_link() { ln -sf "$dest" "$link" fi } +function update_links() { + # Mettre à jour les liens $2..@ pour qu'ils pointent vers la nouvelle + # destination $1 + [ -n "$1" ] || return 1 + local dest="$1"; shift + local r=0 link + for link in "$@"; do + update_link "$dest" "$link" || r=$? + done + return $r +} function move_link() { # Déplacer le lien $1 vers $2, et mettre à jour la destination du lien si # elle est exprimée de façon relative @@ -842,10 +863,8 @@ function move_link() { dest="$(abspath "$dest")" if [ -L "$link" ]; then link="$(abspath "$link")" - linkdir="$(dirname -- "$link")" - ldest="$(readlink "$link")" - ldest="$(abspath "$ldest" "$linkdir")" [ "$dest" == "$link" ] && return 0 + ldest="$(readlinka "$link")" mv "$link" "$dest" || return 1 update_link "$ldest" "$dest" else @@ -895,10 +914,7 @@ function move_file() { shift; shift [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" move_link "$src" "$dest" || return 1 - for link in "$@"; do - update_link "$dest" "$link" - done - return 0 + update_links "$dest" "$@" } ################################################################################