Fix clean dublicate package

master
Dmitry Razumov 4 months ago
parent 2dfbd2824a
commit 6ec74f30cd
Signed by: asmeron
GPG Key ID: 50BC1DB583B79706

@ -589,24 +589,58 @@ live_autoupdate(){
fi
}
## Удалить старые версии дубликато пакетов в базе pacman
## Удалить версии дубликатов пакетов в базе pacman
exec_remove_duplicated_pacman(){
PATH_PACMAN_DB="/var/lib/pacman/local/"
# Из всех дубликатов приложений в базе pacman удалить старые версии
cd ${PATH_PACMAN_DB}; rm -rdf $(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #'
# Ситуация для которой нет обработки
# Если в полном сохранении пользователь обновиляет систему и в очередное обновление обновил только модули, то изменения останутся старыми, т.к. /changes/ имеет верхний слой
# т.е. по факту прилложения останутся старыми. Новые файлы из модуля будут видны, и далее могут не дать обновить на новые пакеты. Поэтому старые пакеты из базы pacman удаляем
# т.е. в базе pacman будут новые пакеты, а по факту файлы/бинарники старые
# Одно из решений - после установки модулей проверять какие пакеты в базе дублируются и эти файлы этих приложений из модуля переписать в корень
#sudo rsync -hrlptgoDHAXEU --existing --update --exclude ".wh.*" --progress /memory/bundles/010-core-2204-2-x86_64.ubm/ /
## Если в полном сохранении пользователь обновиляет систему и в очередное обновление обновил только модули, то изменения останутся старыми, т.к. /changes/ имеет приориетный низкий слой
## т.е. по факту приложения останутся старыми. В БД пакетов будут новые имена из модуля видны, и далее могут не дать обновить на новые пакеты.
## т.е. в базе pacman будут новые пакеты, а по факту файлы/бинарники старые
local PATH_PACMAN_DB="/var/lib/pacman/local/"
local PKG_PACMAN_DB_OLD=()
local PKG_PACMAN_DB_NEW=()
# Из всех дубликатов приложений в базе pacman удалить старые версии
#cd ${PATH_PACMAN_DB}; rm -rdf $(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #'
readarray -t PKG_PACMAN_DB_OLD < <(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #'
readarray -t PKG_PACMAN_DB_NEW < <(ls -1v ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #'
# Индексы позиций имени пакетов в массиве одинаковые, только разные версии
for PKG_PACMAN_DB in ${!PKG_PACMAN_DB_OLD[@]}; do
# Старые пакеты ${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]}
# Новые пакеты ${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]}
if [[ -d "/memory/changes/${PATH_PACMAN_DB}/${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]}" ]]; then
# Если новые пакет находится в самом низком слое /changes/, то значит и файлы данных пакеты будут новые
# Следует удалить старое имя пакета из корня
rm -rdf "${PATH_PACMAN_DB}/${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]}"
elif [[ -d "/memory/changes/${PATH_PACMAN_DB}/${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]}" ]]; then
# Если старый пакет находится в самом низком слое /changes/, то значит и файлы данных пакеты будут старые, не смотря на новизну модуля
# Следует удалить новое имя пакета из корня
rm -rdf "${PATH_PACMAN_DB}/${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]}"
else
# В нижнем слое /changes/ нет пакета, значит оба пакета и старый и новый находятся в модулях
# Сравниваем номера слоёв старого и нового пакета и удяляем имя пакета в более высоком слое, который перекрывается более низким слоем
local AUFS_BUNDLE=$(aufs-n --raw '$n $bname_bundle')
AUFS_BUNDLE_PKG_NEW=$(find /memory/bundles/*/var/lib/pacman/local/ -maxdepth 1 -type d -name "${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]}" | cut -d/ -f4 | head -1)
AUFS_BUNDLE_PKG_OLD=$(find /memory/bundles/*/var/lib/pacman/local/ -maxdepth 1 -type d -name "${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]}" | cut -d/ -f4 | head -1)
local AUFS_BUNDLE_PKG_NEW_NUM=
local AUFS_BUNDLE_PKG_OLD_NUM=
[[ ${AUFS_BUNDLE} =~ (^|$'\n')([[:digit:]]+)' '${AUFS_BUNDLE_PKG_NEW}($'\n'|$) ]] && AUFS_BUNDLE_PKG_NEW_NUM="${BASH_REMATCH[2]}"
[[ ${AUFS_BUNDLE} =~ (^|$'\n')([[:digit:]]+)' '${AUFS_BUNDLE_PKG_OLD}($'\n'|$) ]] && AUFS_BUNDLE_PKG_OLD_NUM="${BASH_REMATCH[2]}"
if [[ -n ${AUFS_BUNDLE_PKG_NEW_NUM} && -n ${AUFS_BUNDLE_PKG_OLD_NUM} ]]; then
if [[ ${AUFS_BUNDLE_PKG_NEW_NUM} -lt ${AUFS_BUNDLE_PKG_OLD_NUM} ]]; then
rm -rdf "${PATH_PACMAN_DB}/${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]}"
else
rm -rdf "${PATH_PACMAN_DB}/${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]}"
fi
fi
fi
done
# Ситуация для которой не нужно обработки, т.к. манипулировать данными не нужно
# Одно из решений - после установки модулей проверять какие пакеты в базе дублируются и эти файлы этих приложений из модуля переписать в корень
#sudo rsync -hrlptgoDHAXEU --existing --update --exclude ".wh.*" --progress /memory/bundles/010-core-2204-2-x86_64.ubm/ /
}
################
##### MAIN #####
################
# Если файл подключен как ресурс с функциями, то выйти
return 0 2>/dev/null && return 0
if [[ -z $@ ]]; then

Loading…
Cancel
Save