installation quasi-atomique du répertoire de destination

This commit is contained in:
Jephté Clain 2013-09-19 08:55:35 +04:00
parent 025cc03d0e
commit 7b01e94cc4
1 changed files with 46 additions and 4 deletions

View File

@ -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() {