installation quasi-atomique du répertoire de destination
This commit is contained in:
parent
025cc03d0e
commit
7b01e94cc4
48
ulib/uinst
48
ulib/uinst
|
@ -1238,6 +1238,11 @@ function __uinst2s_copy_files() {
|
|||
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
|
||||
if [ ! -d "$destdir" ]; then
|
||||
|
@ -1252,12 +1257,31 @@ 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")"
|
||||
|
@ -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…
Reference in New Issue