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.
Par défaut, seul le tableau RULES est utilisé pour trouver la règle à
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
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é
@ -136,12 +140,25 @@ function __set_dest() {
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=(%
--help '$exit_with display_help'
-c:,--config: config=
-C,--other-configs other_configs=1
--file action=file
-j:,--nrule: nrules
-j:,--nrule: _nrules
-v:,--var: _vars
--force-cp force_cp=1
-S:,--ssh: SSH=
--force-scp force_scp=1
@ -202,20 +219,20 @@ else
function docmd() { "$@"; }
fi
if [ ${#nrules[*]} -gt 0 ]; then
array_fix_paths nrules ,
array_copy rules NRULES
nrule=1
if [ ${#_nrules[*]} -gt 0 ]; then
array_fix_paths _nrules ,
array_copy _rules NRULES
_nrule=1
else
array_copy rules RULES
nrule=
array_copy _rules RULES
_nrule=
fi
[ $# -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
for rule in "${rules[@]}"; do
for rule in "${_rules[@]}"; do
splitpair "$rule" pattern r2
splitpair "$r2" destdir r3
splitpair "$r3" renamef r4
@ -227,15 +244,15 @@ for rule in "${rules[@]}"; do
done
# faire la liste des fichiers
files=()
_files=()
for file in "$@"; do
if [ -d "$file" -a -n "$recursive" ]; then
setx file=abspath "$file"
array_from_lines rfiles "$(find "$file" -type f)"
array_extendu files rfiles
array_extendu _files rfiles
elif [ -f "$file" ]; then
setx file=abspath "$file"
array_addu files "$file"
array_addu _files "$file"
elif [ -n "$fake" ]; then
: # on est en mode fake, pas grave si le fichier n'est pas trouvé
elif [ -d "$file" ]; then
@ -247,12 +264,12 @@ done
# faire le classement effectif
r=
for file in "${files[@]}"; do
for file in "${_files[@]}"; do
setx pf=abspath "$file"
setx dir=dirname -- "$pf"
setx filename=basename -- "$pf"
found=
for rule in "${rules[@]}"; do
for rule in "${_rules[@]}"; do
splitpair "$rule" pattern r2
splitpair "$r2" odestdir r3
splitpair "$r3" renamef r4
@ -262,8 +279,8 @@ for file in "${files[@]}"; do
odestdir="$HOME"
fi
if [ -n "$nrule" ]; then
array_contains nrules "$pattern" || continue
if [ -n "$_nrule" ]; then
array_contains _nrules "$pattern" || continue
else
if [ "${pattern#/}" != "$pattern" ]; then
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
interaction=--DEFAULT--
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
if is_array dest; then
array_copy tmpdests dest