installation quasi-atomique du répertoire de destination
This commit is contained in:
		
							parent
							
								
									025cc03d0e
								
							
						
					
					
						commit
						7b01e94cc4
					
				
							
								
								
									
										50
									
								
								ulib/uinst
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								ulib/uinst
									
									
									
									
									
								
							| @ -1237,6 +1237,11 @@ function __uinst2s_copy_files() { | ||||
|     destdir="$(abspath "$destdir")" | ||||
|     dest="$destdir/$srcname" | ||||
|     copied_files=() | ||||
| 
 | ||||
|     # pour la copie "atomique" du répertoire de destination (en réalité, on | ||||
|     # cherche à minimiser le temps d'indisponibilité du répertoire destination) | ||||
|     atomic= | ||||
|     actualdest= | ||||
|      | ||||
|     if [ -f "$srcdir" ]; then | ||||
|         ## Copie d'un fichier dans un répertoire | ||||
| @ -1252,14 +1257,33 @@ function __uinst2s_copy_files() { | ||||
|     elif [ -d "$srcdir" ]; then | ||||
|         ## Copie d'un répertoire ou d'une partie de son contenu dans un | ||||
|         ## répertoire de destination | ||||
|         enote "La copie se fera dans $destdir" | ||||
|         if [ -z "${files[*]}" ]; then | ||||
|             # On n'a pas spécifié de liste de fichiers. C'est tout le répertoire | ||||
|             # source qui est copié, et il remplace la destination. | ||||
|             estep "Suppression de $dest" | ||||
|             rm -rf "$dest" || return 1 | ||||
|             if [ -d "$dest" ]; then | ||||
|                 # Le répertoire existe déjà. Tenter de faire une copie la plus | ||||
|                 # atomique possible: déployer dans un répertoire temporaire, qui | ||||
|                 # sera renommé vers la destination au dernier moment | ||||
|                 eimportant "Le répertoire destination $dest sera écrasé" | ||||
|                 ebegin "Attente de 3 secondes" | ||||
|                 sleep 1; edot | ||||
|                 sleep 1; edot | ||||
|                 sleep 1; edot | ||||
|                 eend | ||||
| 
 | ||||
|                 atomic=1 | ||||
|                 actualdest="$dest" | ||||
|                 dest="$actualdest.copy$$" | ||||
|                 i=0 | ||||
|                 while [ -d "$dest" ]; do | ||||
|                     dest="$actualdest.copy$$-$i" | ||||
|                     i=$(($i + 1)) | ||||
|                 done | ||||
|             else | ||||
|                 enote "Le répertoire destination est $dest" | ||||
|             fi | ||||
|             mkdir -p "$dest" || return 1 | ||||
|              | ||||
| 
 | ||||
|             estep "Copie de $(ppath "$srcdir")" | ||||
|             cpdir "$srcdir" "$dest" || return 1 | ||||
|             copied_files=("${copied_files[@]}" "$dest") | ||||
| @ -1267,6 +1291,8 @@ function __uinst2s_copy_files() { | ||||
|         else | ||||
|             # On a spécifié une liste de fichiers. Seuls ces fichiers sont | ||||
|             # copiés, et le répertoire de destination n'est pas écrasé | ||||
|             enote "La copie se fera dans $destdir" | ||||
| 
 | ||||
|             mkdir -p "$destdir" || return 1 | ||||
|             for file in "${files[@]}"; do | ||||
|                 estep "Copie de $file" | ||||
| @ -1325,6 +1351,22 @@ function __uinst2s_copy_files() { | ||||
|             fi | ||||
|         done | ||||
|     fi | ||||
| 
 | ||||
|     if [ -n "$atomic" ]; then | ||||
|         tmpdest="$actualdest.tmp$$" | ||||
|         i=0 | ||||
|         while [ -d "$tmpdest" ]; do | ||||
|             tmpdest="$actualdest.tmp$$-$i" | ||||
|             i=$(($i + 1)) | ||||
|         done | ||||
| 
 | ||||
|         estep "Installation du nouveau répertoire" | ||||
|         mv "$actualdest" "$tmpdest" && | ||||
|         mv "$dest" "$actualdest" || return 1 | ||||
| 
 | ||||
|         estep "Suppression de l'ancien répertoire" | ||||
|         rm -rf "$tmpdest" || return 1 | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| function __uinst2s_root_scripts() { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user