template: pallier les problèmes d'I/O

This commit is contained in:
Jephté Clain 2025-09-10 11:31:45 +04:00
parent 28487e0240
commit ee33699608

View File

@ -22,7 +22,12 @@ et \$2 vaudra alors 'file'
si un fichier \${2#.}.local existe (e.g 'file.ext.local'), prendre ce fichier à si un fichier \${2#.}.local existe (e.g 'file.ext.local'), prendre ce fichier à
la place comme source 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() { function template_copy_replace() {
local src="$1" dest="$2" local src="$1" dest="$2"
local srcdir srcname lsrcname local srcdir srcname lsrcname
@ -37,8 +42,28 @@ function template_copy_replace() {
lsrcname="${srcname#.}.local" lsrcname="${srcname#.}.local"
[ -e "$srcdir/$lsrcname" ] && src="$srcdir/$lsrcname" [ -e "$srcdir/$lsrcname" ] && src="$srcdir/$lsrcname"
[ -e "$src" ] || return 2
userfiles+=("$dest") 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 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 à si un fichier \${1#.}.local existe (e.g 'file.ext.local'), prendre ce fichier à
la place comme source 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() { function template_copy_missing() {
local src="$1" dest="$2" local src="$1" dest="$2"
local srcdir srcname lsrcname local srcdir srcname lsrcname
@ -63,15 +94,33 @@ function template_copy_missing() {
dest="$srcdir/$dest" dest="$srcdir/$dest"
fi fi
userfiles+=("$dest")
if [ ! -e "$dest" ]; then
lsrcname="${srcname#.}.local" lsrcname="${srcname#.}.local"
[ -e "$srcdir/$lsrcname" ] && src="$srcdir/$lsrcname" [ -e "$srcdir/$lsrcname" ] && src="$srcdir/$lsrcname"
cp -P "$src" "$dest" [ -e "$src" ] || return 2
return 0
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 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 "\ function: template_dump_vars "\
@ -219,8 +268,13 @@ function _template_can_process() {
esac 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() { function template_process_userfiles() {
local awkscript sedscript workfile userfile local awkscript sedscript workfile userfile
local have_backup
ac_set_tmpfile awkscript ac_set_tmpfile awkscript
ac_set_tmpfile sedscript ac_set_tmpfile sedscript
template_generate_scripts "$awkscript" "$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 cat "$userfile" | awk -f "$awkscript" | sed -rf "$sedscript" >"$workfile"; then
if testdiff "$workfile" "$userfile"; then if testdiff "$workfile" "$userfile"; then
# n'écrire le fichier que s'il a changé # 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
fi fi
done done
ac_clean "$awkscript" "$sedscript" "$workfile" ac_clean "$awkscript" "$sedscript" "$workfile"
return 0
} }