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 à
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"
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
}