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"
|
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() {
|
||||||
|
|
Loading…
Reference in New Issue