ajout de die_unless(), die_if(), eerror_unless() et eerror_if()

ajout du module base.tools
This commit is contained in:
Jephte CLAIN 2014-12-22 16:52:51 +04:00
parent 429f246946
commit c70a20ba26
3 changed files with 163 additions and 66 deletions

View File

@ -38,9 +38,10 @@ fi
##@include base.quote ##@include base.quote
##@include base.split ##@include base.split
##@include base.args ##@include base.args
##@include base.tools
##@include base.compat ##@include base.compat
uprovide base 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 ## Informations sur l'hôte sur lequel tourne ce script
# Type de système # Type de système
@ -1299,7 +1300,7 @@ function list_all() {
cd "$curdir" cd "$curdir"
} }
function __la_cmd() { function __la_cmd() {
[ -n "$*" ] || set '*' [ $# -gt 0 ] || set '*'
local arg local arg
local cmd="/bin/ls -1d" local cmd="/bin/ls -1d"
for arg in "$@"; do for arg in "$@"; do
@ -2582,7 +2583,7 @@ function utools_local() {
# définitions de PRETTYOPTS. # définitions de PRETTYOPTS.
# Si aucun arguments n'est fourni, toutes les définitions sont affichées. # Si aucun arguments n'est fourni, toutes les définitions sont affichées.
local arg local arg
[ -n "$*" ] || set -- opts verbosity interaction [ $# -gt 0 ] || set -- opts verbosity interaction
for arg in "$@"; do for arg in "$@"; do
case "$arg" in case "$arg" in
parse_opts|opts|o|args) echo "local -a args";; parse_opts|opts|o|args) echo "local -a args";;
@ -2608,14 +2609,89 @@ function err_isatty() {
# tester si STDERR n'est pas une redirection # tester si STDERR n'est pas une redirection
tty -s <&2 tty -s <&2
} }
function die() { function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; }
[ -n "$*" ] && 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 { function eerror_unless() {
[ -n "$*" ] && "$@"; exit $? # 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 { function die_if() {
[ -n "$1" ] && eerror "$1"; shift; [ -n "$*" ] && "$@"; exit 1 # 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' TAB=$'\t'
@ -2706,7 +2782,7 @@ function toienc() {
function uread() { function uread() {
# Lire une valeur sur stdin et la placer dans la variable $1. On assume que la # 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 # 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 local __r_var
read "$@" read "$@"
for __r_var in "$@"; do for __r_var in "$@"; do
@ -2999,7 +3075,7 @@ function __t_etitle() {
fi fi
fi fi
# commande # commande
if [ -n "$*" ]; then if [ $# -gt 0 ]; then
"$@" "$@"
__t_s=$? __t_s=$?
[ "$__t_eend" == "default" ] && __t_eend=1 [ "$__t_eend" == "default" ] && __t_eend=1
@ -3076,7 +3152,7 @@ function ebegin() {
__ebegin "$__b_msg" 1>&2 __ebegin "$__b_msg" 1>&2
fi fi
# commande # commande
if [ -n "$*" ]; then if [ $# -gt 0 ]; then
"$@" "$@"
__b_s=$? __b_s=$?
[ "$__b_eend" == "default" ] && __b_eend=1 [ "$__b_eend" == "default" ] && __b_eend=1
@ -3100,7 +3176,7 @@ function edot() {
else else
__edotx 1>&2 __edotx 1>&2
fi fi
show_verbose && [ -n "$*" ] && __edotd "$*" 1>&2 show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2
return $s return $s
} }
function edotw() { function edotw() {
@ -3113,7 +3189,7 @@ function edotw() {
[ -n "$1" ] && s="$1" [ -n "$1" ] && s="$1"
shift shift
__edotw 1>&2 __edotw 1>&2
show_verbose && [ -n "$*" ] && __edotd "$*" 1>&2 show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2
return $s return $s
} }
function ewait() { function ewait() {

72
lib/ulib/base.tools Normal file
View File

@ -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
}

53
umove
View File

@ -20,55 +20,4 @@ OPTIONS
args=(--help '$exit_with display_help' -d:,--updatedir: .) args=(--help '$exit_with display_help' -d:,--updatedir: .)
parse_args "$@"; set -- "${args[@]}" parse_args "$@"; set -- "${args[@]}"
if [ $# -eq 0 ]; then base_umove ${updatedir:+-d "$updatedir"} "$@"
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