Fix clean dublicate package

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

@ -589,18 +589,52 @@ live_autoupdate(){
fi fi
} }
## Удалить старые версии дубликато пакетов в базе pacman ## Удалить версии дубликатов пакетов в базе pacman
exec_remove_duplicated_pacman(){ exec_remove_duplicated_pacman(){
PATH_PACMAN_DB="/var/lib/pacman/local/" ## Если в полном сохранении пользователь обновиляет систему и в очередное обновление обновил только модули, то изменения останутся старыми, т.к. /changes/ имеет приориетный низкий слой
# Из всех дубликатов приложений в базе pacman удалить старые версии ## т.е. по факту приложения останутся старыми. В БД пакетов будут новые имена из модуля видны, и далее могут не дать обновить на новые пакеты.
cd ${PATH_PACMAN_DB}; rm -rdf $(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #' ## т.е. в базе pacman будут новые пакеты, а по факту файлы/бинарники старые
local PATH_PACMAN_DB="/var/lib/pacman/local/"
# Ситуация для которой нет обработки local PKG_PACMAN_DB_OLD=()
# Если в полном сохранении пользователь обновиляет систему и в очередное обновление обновил только модули, то изменения останутся старыми, т.к. /changes/ имеет верхний слой local PKG_PACMAN_DB_NEW=()
# т.е. по факту прилложения останутся старыми. Новые файлы из модуля будут видны, и далее могут не дать обновить на новые пакеты. Поэтому старые пакеты из базы pacman удаляем # Из всех дубликатов приложений в базе pacman удалить старые версии
# т.е. в базе 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}') #'
#sudo rsync -hrlptgoDHAXEU --existing --update --exclude ".wh.*" --progress /memory/bundles/010-core-2204-2-x86_64.ubm/ / 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/ /
} }
################ ################

Loading…
Cancel
Save