support des variables

This commit is contained in:
Jephté Clain 2017-12-27 10:21:00 +04:00
parent 191d3c223d
commit 0e6f55abb9
1 changed files with 40 additions and 17 deletions

57
ufile
View File

@ -69,6 +69,10 @@ OPTIONS
nécessaire. nécessaire.
Par défaut, seul le tableau RULES est utilisé pour trouver la règle à Par défaut, seul le tableau RULES est utilisé pour trouver la règle à
appliquer. Avec cette option, seul le tableau NRULES est utilisé. appliquer. Avec cette option, seul le tableau NRULES est utilisé.
-v, --var NAME=VALUE
Définir une variable qui sera utilisée par la fonction renamef. Cette
option peut être spécifiée autant de fois que nécessaire.
Les noms commençant par _ sont réservés et ne peuvent pas être définis.
--force-cp --force-cp
Spécifier le mode de classement des fichiers. Par défaut, le fichier est Spécifier le mode de classement des fichiers. Par défaut, le fichier est
déplacé dans la destination s'il s'agit d'un classement local, ou copié déplacé dans la destination s'il s'agit d'un classement local, ou copié
@ -136,12 +140,25 @@ function __set_dest() {
return 0 return 0
} }
function define_vars() {
local _name _value
for _name in "$@"; do
splitvar "$_name" _name _value
if [[ "$_name" == _* ]]; then
ewarn "$_name: cette variable ne peut être définie"
else
setv "$_name" "$_value"
fi
done
}
args=(% args=(%
--help '$exit_with display_help' --help '$exit_with display_help'
-c:,--config: config= -c:,--config: config=
-C,--other-configs other_configs=1 -C,--other-configs other_configs=1
--file action=file --file action=file
-j:,--nrule: nrules -j:,--nrule: _nrules
-v:,--var: _vars
--force-cp force_cp=1 --force-cp force_cp=1
-S:,--ssh: SSH= -S:,--ssh: SSH=
--force-scp force_scp=1 --force-scp force_scp=1
@ -202,20 +219,20 @@ else
function docmd() { "$@"; } function docmd() { "$@"; }
fi fi
if [ ${#nrules[*]} -gt 0 ]; then if [ ${#_nrules[*]} -gt 0 ]; then
array_fix_paths nrules , array_fix_paths _nrules ,
array_copy rules NRULES array_copy _rules NRULES
nrule=1 _nrule=1
else else
array_copy rules RULES array_copy _rules RULES
nrule= _nrule=
fi fi
[ $# -gt 0 ] || die "Vous devez spécifier des fichiers à classer" [ $# -gt 0 ] || die "Vous devez spécifier des fichiers à classer"
[ ${#rules[*]} -gt 0 ] || die "Il faut définir des règles ${nrule:+N}RULES dans ~/etc/default/ufile ou ~/etc/ufile.d/*.conf" [ ${#_rules[*]} -gt 0 ] || die "Il faut définir des règles ${_nrule:+N}RULES dans ~/etc/default/ufile ou ~/etc/ufile.d/*.conf"
# vérifier les règles # vérifier les règles
for rule in "${rules[@]}"; do for rule in "${_rules[@]}"; do
splitpair "$rule" pattern r2 splitpair "$rule" pattern r2
splitpair "$r2" destdir r3 splitpair "$r2" destdir r3
splitpair "$r3" renamef r4 splitpair "$r3" renamef r4
@ -227,15 +244,15 @@ for rule in "${rules[@]}"; do
done done
# faire la liste des fichiers # faire la liste des fichiers
files=() _files=()
for file in "$@"; do for file in "$@"; do
if [ -d "$file" -a -n "$recursive" ]; then if [ -d "$file" -a -n "$recursive" ]; then
setx file=abspath "$file" setx file=abspath "$file"
array_from_lines rfiles "$(find "$file" -type f)" array_from_lines rfiles "$(find "$file" -type f)"
array_extendu files rfiles array_extendu _files rfiles
elif [ -f "$file" ]; then elif [ -f "$file" ]; then
setx file=abspath "$file" setx file=abspath "$file"
array_addu files "$file" array_addu _files "$file"
elif [ -n "$fake" ]; then elif [ -n "$fake" ]; then
: # on est en mode fake, pas grave si le fichier n'est pas trouvé : # on est en mode fake, pas grave si le fichier n'est pas trouvé
elif [ -d "$file" ]; then elif [ -d "$file" ]; then
@ -247,12 +264,12 @@ done
# faire le classement effectif # faire le classement effectif
r= r=
for file in "${files[@]}"; do for file in "${_files[@]}"; do
setx pf=abspath "$file" setx pf=abspath "$file"
setx dir=dirname -- "$pf" setx dir=dirname -- "$pf"
setx filename=basename -- "$pf" setx filename=basename -- "$pf"
found= found=
for rule in "${rules[@]}"; do for rule in "${_rules[@]}"; do
splitpair "$rule" pattern r2 splitpair "$rule" pattern r2
splitpair "$r2" odestdir r3 splitpair "$r2" odestdir r3
splitpair "$r3" renamef r4 splitpair "$r3" renamef r4
@ -262,8 +279,8 @@ for file in "${files[@]}"; do
odestdir="$HOME" odestdir="$HOME"
fi fi
if [ -n "$nrule" ]; then if [ -n "$_nrule" ]; then
array_contains nrules "$pattern" || continue array_contains _nrules "$pattern" || continue
else else
if [ "${pattern#/}" != "$pattern" ]; then if [ "${pattern#/}" != "$pattern" ]; then
awk -v filename="$filename" -v pattern="${pattern#/}" 'BEGIN { exit(filename ~ pattern? 0: 1) }' || continue awk -v filename="$filename" -v pattern="${pattern#/}" 'BEGIN { exit(filename ~ pattern? 0: 1) }' || continue
@ -275,7 +292,13 @@ for file in "${files[@]}"; do
unset dest unset dest
interaction=--DEFAULT-- interaction=--DEFAULT--
if [ -n "$renamef" ]; then if [ -n "$renamef" ]; then
"$renamef" "$filename" "$pf" "$odestdir" || continue # protéger les variables nécessaires au lancement de renamef
_renamef="$renamef"
_filename="$filename"
_pf="$pf"
_odestdir="$odestdir"
define_vars "${_vars[@]}"
"$_renamef" "$_filename" "$_pf" "$_odestdir" || continue
fi fi
if is_array dest; then if is_array dest; then
array_copy tmpdests dest array_copy tmpdests dest