73 lines
2.4 KiB
Plaintext
73 lines
2.4 KiB
Plaintext
![]() |
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||
|
## Fonctions de base: outils divers
|
||
|
##@cooked nocomments
|
||
|
##@include base
|
||
|
uprovide base.tools
|
||
|
urequire base
|
||
|
|
||
|
function base_umove() {
|
||
|
# Outil de haut niveau pour déplacer un fichier ou un lien. Si c'est un lien qui
|
||
|
# est déplacé, la destination du lien est mise à jour si elle est relative.
|
||
|
# l'option '-d UPDATEDIR' permet de spécifier un répertoire dans lequel tous les
|
||
|
# liens qui pointent vers le fichier déplacé sont mis à jour si le déplacement
|
||
|
# du fichier se fait avec succès.
|
||
|
local -a args
|
||
|
local updatedir
|
||
|
args=(-d:,--updatedir: .)
|
||
|
parse_args_check || return
|
||
|
|
||
|
eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return
|
||
|
eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return
|
||
|
eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return
|
||
|
|
||
|
local -a srcs
|
||
|
local dest
|
||
|
|
||
|
srcs=("$@")
|
||
|
setx dest=last_value srcs
|
||
|
array_del_last srcs
|
||
|
|
||
|
if [ $# -eq 2 ]; then
|
||
|
# S'il n'y a que deux arguments, permettre que le deuxième argument ne
|
||
|
# soit pas un répertoire
|
||
|
if [ -d "$dest" ]; then
|
||
|
: # ce cas sera traité ci-dessous
|
||
|
elif [ -e "$dest" ]; then
|
||
|
eerror "$dest: refus d'écraser la destination"
|
||
|
return 1
|
||
|
else
|
||
|
src="${srcs[0]}"
|
||
|
if [ -n "$updatedir" ]; then
|
||
|
if [ -L "$src" ]; then
|
||
|
ldest="$(readlinka "$src")"
|
||
|
array_find_links update_links "$ldest" "$updatedir"
|
||
|
else
|
||
|
array_find_links update_links "$src" "$updatedir"
|
||
|
fi
|
||
|
move_file "$src" "$dest" "${update_links[@]}"
|
||
|
else
|
||
|
move_link "$src" "$dest"
|
||
|
fi
|
||
|
return $?
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
# S'il y a plus de deux arguments, il FAUT que dest soit un répertoire
|
||
|
[ -d "$dest" ] || {
|
||
|
eerror "$dest: doit être un répertoire"
|
||
|
return 1
|
||
|
}
|
||
|
for src in "${srcs[@]}"; do
|
||
|
if [ -n "$updatedir" ]; then
|
||
|
if [ -L "$src" ]; then
|
||
|
move_link "$src" "$dest"
|
||
|
else
|
||
|
array_find_links update_links "$src" "$updatedir"
|
||
|
move_file "$src" "$dest" "${update_links[@]}"
|
||
|
fi
|
||
|
else
|
||
|
move_link "$src" "$dest"
|
||
|
fi
|
||
|
done
|
||
|
}
|