diff --git a/bash/src/template.sh b/bash/src/template.sh index c3d3376..f97506c 100644 --- a/bash/src/template.sh +++ b/bash/src/template.sh @@ -22,7 +22,12 @@ et \$2 vaudra alors 'file' si un fichier \${2#.}.local existe (e.g 'file.ext.local'), prendre ce fichier à la place comme source -Ajouter file au tableau userfiles" +Ajouter file au tableau userfiles + +retourner: +- 0 en cas de copie avec succès +- 2 si la source n'existe pas +- 3 si une erreur I/O s'est produite lors de la copie" function template_copy_replace() { local src="$1" dest="$2" local srcdir srcname lsrcname @@ -37,8 +42,28 @@ function template_copy_replace() { lsrcname="${srcname#.}.local" [ -e "$srcdir/$lsrcname" ] && src="$srcdir/$lsrcname" + [ -e "$src" ] || return 2 + userfiles+=("$dest") - cp -P "$src" "$dest" + local have_backup + if [ -e "$dest" ]; then + # copie de sauvegarde avant + if ! cp -P --preserve=all "$dest" "$dest.bck.$$"; then + rm "$dest.bck.$$" + return 3 + fi + have_backup=1 + fi + if ! cp -P "$src" "$dest"; then + rm "$dest" + if [ -n "$have_backup" ]; then + # restaurer la sauvegarde en cas d'erreur + cp -P --preserve=all "$dest.bck.$$" "$dest" && + rm "$dest.bck.$$" + fi + return 3 + fi + [ -n "$have_backup" ] && rm "$dest.bck.$$" return 0 } @@ -51,7 +76,13 @@ et \$2 vaudra alors 'file' si un fichier \${1#.}.local existe (e.g 'file.ext.local'), prendre ce fichier à la place comme source -Ajouter file au tableau userfiles" +Ajouter file au tableau userfiles + +retourner: +- 0 en cas de copie avec succès +- 1 si le fichier existait déjà +- 2 si la source n'existe pas +- 3 si une erreur I/O s'est produite lors de la copie" function template_copy_missing() { local src="$1" dest="$2" local srcdir srcname lsrcname @@ -63,15 +94,33 @@ function template_copy_missing() { dest="$srcdir/$dest" fi - userfiles+=("$dest") - if [ ! -e "$dest" ]; then - lsrcname="${srcname#.}.local" - [ -e "$srcdir/$lsrcname" ] && src="$srcdir/$lsrcname" + lsrcname="${srcname#.}.local" + [ -e "$srcdir/$lsrcname" ] && src="$srcdir/$lsrcname" - cp -P "$src" "$dest" - return 0 + [ -e "$src" ] || return 2 + + userfiles+=("$dest") + [ -e "$dest" ] && return 1 + + if ! cp -P "$src" "$dest"; then + # ne pas garder le fichier en cas d'erreur de copie + rm "$dest" + return 3 fi - return 1 + return 0 +} + +function: template_ioerror "\ +tester si une erreur de copie s'est produite lors de l'appel à +template_copy_missing() ou template_copy_replace(), par exemple en cas de +dépassement de capacité du disque ou si le fichier source n'existe pas + +il faut appeler cette fonction avec la valeur de retour de ces fonctions, e.g + template_copy_missing file + template_ioerror $? && die" +function template_ioerror() { + local r="${1:-$?}" + [ $r -ge 2 ] } function: template_dump_vars "\ @@ -219,8 +268,13 @@ function _template_can_process() { esac } +function: template_process_userfiles "\ +retourner: +- 0 en cas de traitement avec succès des fichiers +- 3 si une erreur I/O s'est produite lors du traitement d'un des fichiers" function template_process_userfiles() { local awkscript sedscript workfile userfile + local have_backup ac_set_tmpfile awkscript ac_set_tmpfile sedscript template_generate_scripts "$awkscript" "$sedscript" "$@" @@ -231,10 +285,28 @@ function template_process_userfiles() { if cat "$userfile" | awk -f "$awkscript" | sed -rf "$sedscript" >"$workfile"; then if testdiff "$workfile" "$userfile"; then # n'écrire le fichier que s'il a changé - cat "$workfile" >"$userfile" + if [ -e "$userfile" ]; then + # copie de sauvegarde avant + if ! cp -P --preserve=all "$userfile" "$userfile.bck.$$"; then + rm "$userfile.bck.$$" + return 3 + fi + have_backup=1 + fi + if ! cat "$workfile" >"$userfile"; then + rm "$userfile" + if [ -n "$have_backup" ]; then + # restaurer la sauvegarde en cas d'erreur + cp -P --preserve=all "$userfile.bck.$$" "$userfile" && + rm "$userfile.bck.$$" + fi + return 3 + fi + [ -n "$have_backup" ] && rm "$userfile.bck.$$" fi fi done ac_clean "$awkscript" "$sedscript" "$workfile" + return 0 }