From 7b01e94cc482ba457c2d01b8384cf2a4236ef9b5 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Thu, 19 Sep 2013 08:55:35 +0400 Subject: [PATCH] =?UTF-8?q?installation=20quasi-atomique=20du=20r=C3=A9per?= =?UTF-8?q?toire=20de=20destination?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ulib/uinst | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/ulib/uinst b/ulib/uinst index 99738a7..81273f4 100644 --- a/ulib/uinst +++ b/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() {