template: pallier les problèmes d'I/O
This commit is contained in:
		
							parent
							
								
									28487e0240
								
							
						
					
					
						commit
						ee33699608
					
				| @ -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 | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user