diff --git a/lib/ulib/base b/lib/ulib/base index 3aa15bc..4eb887b 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -38,9 +38,10 @@ fi ##@include base.quote ##@include base.split ##@include base.args +##@include base.tools ##@include base.compat uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.compat +urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat ## Informations sur l'hôte sur lequel tourne ce script # Type de système @@ -1299,7 +1300,7 @@ function list_all() { cd "$curdir" } function __la_cmd() { - [ -n "$*" ] || set '*' + [ $# -gt 0 ] || set '*' local arg local cmd="/bin/ls -1d" for arg in "$@"; do @@ -2582,7 +2583,7 @@ function utools_local() { # définitions de PRETTYOPTS. # Si aucun arguments n'est fourni, toutes les définitions sont affichées. local arg - [ -n "$*" ] || set -- opts verbosity interaction + [ $# -gt 0 ] || set -- opts verbosity interaction for arg in "$@"; do case "$arg" in parse_opts|opts|o|args) echo "local -a args";; @@ -2608,14 +2609,89 @@ function err_isatty() { # tester si STDERR n'est pas une redirection tty -s <&2 } -function die() { - [ -n "$*" ] && eerror "$@"; exit 1 +function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } +function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } +function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } +function die_unless() { +# Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne +# FAUX + local count=$# + if [ $count -eq 0 ]; then + exit 1 + elif [ $count -eq 1 ]; then + "$@" || exit $? + else + local m r + m="${@:$count}" + count=$(($count - 1)) + set -- "${@:1:$count}" + if "$@"; then + : + else + r=$? + eerror "$m" + exit $r + fi + fi } -function exit_with { - [ -n "$*" ] && "$@"; exit $? +function eerror_unless() { +# Afficher $-1 avec eerror() et retourner $? si la commande $1..-2 retourne FAUX + local count=$# + if [ $count -eq 0 ]; then + return 1 + elif [ $count -eq 1 ]; then + "$@" || return $? + else + local m r + m="${@:$count}" + count=$(($count - 1)) + set -- "${@:1:$count}" + if "$@"; then + : + else + r=$? + eerror "$m" + return $r + fi + fi } -function die_with { - [ -n "$1" ] && eerror "$1"; shift; [ -n "$*" ] && "$@"; exit 1 +function die_if() { +# Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne +# VRAI + local count=$# + if [ $count -eq 0 ]; then + : + elif [ $count -eq 1 ]; then + "$@" && exit 1 + else + local m r + m="${@:$count}" + count=$(($count - 1)) + set -- "${@:1:$count}" + if "$@"; then + eerror "$m" + exit 1 + fi + fi +} +function eerror_if() { +# Afficher $-1 avec eerror() et retourner le code d'erreur 1 si la commande +# $1..-2 retourne VRAI + local count=$# + if [ $count -eq 0 ]; then + : + elif [ $count -eq 1 ]; then + "$@" && return 1 + else + local m r + m="${@:$count}" + count=$(($count - 1)) + set -- "${@:1:$count}" + if "$@"; then + eerror "$m" + return 1 + fi + fi } TAB=$'\t' @@ -2706,7 +2782,7 @@ function toienc() { function uread() { # Lire une valeur sur stdin et la placer dans la variable $1. On assume que la # valeur en entrée est encodée dans l'encoding d'entrée par défaut - [ -n "$*" ] || set -- REPLY + [ $# -gt 0 ] || set -- REPLY local __r_var read "$@" for __r_var in "$@"; do @@ -2999,7 +3075,7 @@ function __t_etitle() { fi fi # commande - if [ -n "$*" ]; then + if [ $# -gt 0 ]; then "$@" __t_s=$? [ "$__t_eend" == "default" ] && __t_eend=1 @@ -3076,7 +3152,7 @@ function ebegin() { __ebegin "$__b_msg" 1>&2 fi # commande - if [ -n "$*" ]; then + if [ $# -gt 0 ]; then "$@" __b_s=$? [ "$__b_eend" == "default" ] && __b_eend=1 @@ -3100,7 +3176,7 @@ function edot() { else __edotx 1>&2 fi - show_verbose && [ -n "$*" ] && __edotd "$*" 1>&2 + show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 return $s } function edotw() { @@ -3113,7 +3189,7 @@ function edotw() { [ -n "$1" ] && s="$1" shift __edotw 1>&2 - show_verbose && [ -n "$*" ] && __edotd "$*" 1>&2 + show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 return $s } function ewait() { diff --git a/lib/ulib/base.tools b/lib/ulib/base.tools new file mode 100644 index 0000000..3cc1bd9 --- /dev/null +++ b/lib/ulib/base.tools @@ -0,0 +1,72 @@ +##@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 +} diff --git a/umove b/umove index b06cdaf..01e2c5d 100755 --- a/umove +++ b/umove @@ -20,55 +20,4 @@ OPTIONS args=(--help '$exit_with display_help' -d:,--updatedir: .) parse_args "$@"; set -- "${args[@]}" -if [ $# -eq 0 ]; then - die "Vous devez spécifier les fichiers à déplacer" -elif [ $# -eq 1 ]; then - die "Vous devez spécifier la destination" -fi - -[ -z "$updatedir" -o -d "$updatedir" ] || die "$updatedir: doit être un répertoire" - -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 - die "$dest: refus d'écraser la destination" - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - link="$src" - linkdir="$(dirname -- "$link")" - ldest="$(abspath "$(readlink "$link")" "$linkdir")" - 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 - exit $? - fi -fi - -# S'il y a plus de deux arguments, il FAUT que dest soit un répertoire -[ -d "$dest" ] || die "$dest: doit être un répertoire" -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 +base_umove ${updatedir:+-d "$updatedir"} "$@"