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

@ -1238,6 +1238,11 @@ function __uinst2s_copy_files() {
dest="$destdir/$srcname" dest="$destdir/$srcname"
copied_files=() 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 if [ -f "$srcdir" ]; then
## Copie d'un fichier dans un répertoire ## Copie d'un fichier dans un répertoire
if [ ! -d "$destdir" ]; then if [ ! -d "$destdir" ]; then
@ -1252,12 +1257,31 @@ function __uinst2s_copy_files() {
elif [ -d "$srcdir" ]; then elif [ -d "$srcdir" ]; then
## Copie d'un répertoire ou d'une partie de son contenu dans un ## Copie d'un répertoire ou d'une partie de son contenu dans un
## répertoire de destination ## répertoire de destination
enote "La copie se fera dans $destdir"
if [ -z "${files[*]}" ]; then if [ -z "${files[*]}" ]; then
# On n'a pas spécifié de liste de fichiers. C'est tout le répertoire # 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. # source qui est copié, et il remplace la destination.
estep "Suppression de $dest" if [ -d "$dest" ]; then
rm -rf "$dest" || return 1 # 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 mkdir -p "$dest" || return 1
estep "Copie de $(ppath "$srcdir")" estep "Copie de $(ppath "$srcdir")"
@ -1267,6 +1291,8 @@ function __uinst2s_copy_files() {
else else
# On a spécifié une liste de fichiers. Seuls ces fichiers sont # On a spécifié une liste de fichiers. Seuls ces fichiers sont
# copiés, et le répertoire de destination n'est pas écrasé # copiés, et le répertoire de destination n'est pas écrasé
enote "La copie se fera dans $destdir"
mkdir -p "$destdir" || return 1 mkdir -p "$destdir" || return 1
for file in "${files[@]}"; do for file in "${files[@]}"; do
estep "Copie de $file" estep "Copie de $file"
@ -1325,6 +1351,22 @@ function __uinst2s_copy_files() {
fi fi
done done
fi 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() { function __uinst2s_root_scripts() {