up date added recursive deps and added upgrade with popitka
This commit is contained in:
1 parent
755df2c2c1
commit
1fb1d40acc
1 file changed
+651
-48
@@ -11,7 +11,7 @@
|
||||
## ## ##
|
||||
## ## ##
|
||||
|
||||
set -e
|
||||
# set -e
|
||||
|
||||
#---------------- variables --------------------------
|
||||
version="1.0.0"
|
||||
@@ -26,6 +26,8 @@ packages=""
|
||||
archives=""
|
||||
destdir=""
|
||||
colors=y
|
||||
recursive=false
|
||||
auto_upgrade=false
|
||||
#-----------------------------------------------------
|
||||
|
||||
#----- colors -------
|
||||
@@ -399,6 +401,7 @@ ${YELLOW}Commands:${BWHITE}
|
||||
|
||||
${YELLOW}Options:${BWHITE}
|
||||
${BGREEN}-r, --rootdir${BWHITE} - set root directory for package manager
|
||||
${BGREEN}-R, --recursive${BWHITE} - show deps recursively
|
||||
${RESET}"
|
||||
}
|
||||
#------------------------------------------------------------------------
|
||||
@@ -424,7 +427,7 @@ s() {
|
||||
#----------------- search package in repo function ----------------------
|
||||
search() {
|
||||
servers=$(/usr/bin/cat $repofile)
|
||||
if [[ "$packages" == "" ]]; then
|
||||
if [ -z "$packages" ]; then
|
||||
for i in $servers; do
|
||||
serverdir=$(echo $i | sed -e "/http:\/\//s///")
|
||||
serverdir=$(echo $serverdir | sed -e "/ftp:\/\//s///")
|
||||
@@ -439,12 +442,12 @@ search() {
|
||||
&& break
|
||||
done
|
||||
printf "${YELLOW}$serverdir: ${BWHITE}$(get_pkgname $j) ${BGREEN}$(get_pkgver $j)-$(get_pkgrel $j) ${RESET}"
|
||||
[[ "$installed" == "true" ]] \
|
||||
[ "$installed" = "true" ] \
|
||||
&& printf "${BBLUE}[installed]\n${RESET}" \
|
||||
|| echo ""
|
||||
done
|
||||
done
|
||||
exit 0
|
||||
return 0
|
||||
fi
|
||||
for k in $packages; do
|
||||
found=false
|
||||
@@ -453,10 +456,12 @@ search() {
|
||||
serverdir=$(echo $serverdir | sed -e "/ftp:\/\//s///")
|
||||
repoquery=$(/usr/bin/cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///')
|
||||
for j in $repoquery; do
|
||||
if [[ $j =~ $k ]]; then
|
||||
printf "${YELLOW}$serverdir: ${BWHITE}$j\n${RESET}"
|
||||
found=true
|
||||
fi
|
||||
case "$j" in
|
||||
*"$k"*)
|
||||
printf "${YELLOW}$serverdir: ${BWHITE}$j\n${RESET}"
|
||||
found=true
|
||||
;;
|
||||
esac
|
||||
done
|
||||
done
|
||||
[ "$found" = "false" ] && printf "${YELLOW}**${RED} error:${RESET} can't find package ($k)\n"
|
||||
@@ -482,42 +487,147 @@ c() {
|
||||
}
|
||||
#------------------------------------------------------------------------
|
||||
|
||||
# Рекурсивная функция для поиска зависимостей
|
||||
# $1 - имя пакета
|
||||
# $2 - уровень вложенности (для отступов)
|
||||
# $3 - список уже посещенных пакетов (для предотвращения циклов)
|
||||
# $4 - это последний элемент в списке (для рисования дерева)
|
||||
show_deps_recursive() {
|
||||
local pkg="$1"
|
||||
local depth="${2:-0}"
|
||||
local visited="$3"
|
||||
local is_last="${4:-false}"
|
||||
local prefix=""
|
||||
|
||||
# Создаем префикс с символами дерева
|
||||
if [ $depth -gt 0 ]; then
|
||||
local i=1
|
||||
while [ $i -lt $depth ]; do
|
||||
prefix="$prefix│ "
|
||||
i=$((i + 1))
|
||||
done
|
||||
if [ "$is_last" = "true" ]; then
|
||||
prefix="$prefix└── "
|
||||
else
|
||||
prefix="$prefix├── "
|
||||
fi
|
||||
fi
|
||||
|
||||
# Проверяем, не посещали ли мы уже этот пакет (предотвращение циклов)
|
||||
for visited_pkg in $visited; do
|
||||
if [ "$visited_pkg" = "$pkg" ]; then
|
||||
printf "${prefix}${YELLOW}**${BRED} $pkg ${BWHITE}(circular dependency)${RESET}\n"
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
# Добавляем текущий пакет в список посещенных
|
||||
visited="$visited $pkg"
|
||||
|
||||
# Ищем полное имя пакета в директории установленных пакетов
|
||||
cd $installedpackagesdir
|
||||
local pkgname=$(echo $(find . -name "$pkg*") | sed -e "/.\//s///" | sed -e "/.pkg/s///")
|
||||
cd - &>/dev/null
|
||||
|
||||
if [ "$pkgname" = "" ]; then
|
||||
printf "${prefix}${BRED}**${BWHITE} $pkg (not installed)${RESET}\n"
|
||||
return
|
||||
fi
|
||||
|
||||
# Выводим информацию о пакете
|
||||
printf "${prefix}${YELLOW}$(get_pkgname $pkgname) ${BGREEN}$(get_pkgver $pkgname)-$(get_pkgrel $pkgname)${RESET}\n"
|
||||
|
||||
# Проверяем наличие файла зависимостей
|
||||
if [ ! -f $installedpackagesdir/${pkgname}.pkg/deps ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# Читаем зависимости
|
||||
local pkg_deps=$(cat $installedpackagesdir/${pkgname}.pkg/deps)
|
||||
local deps_count=$(echo $pkg_deps | wc -w)
|
||||
local current=1
|
||||
|
||||
# Рекурсивно показываем зависимости
|
||||
for dep in $pkg_deps; do
|
||||
if [ $current -eq $deps_count ]; then
|
||||
show_deps_recursive "$dep" $((depth + 1)) "$visited" "true"
|
||||
else
|
||||
show_deps_recursive "$dep" $((depth + 1)) "$visited" "false"
|
||||
fi
|
||||
current=$((current + 1))
|
||||
done
|
||||
}
|
||||
#------------------------------------------------------------------------
|
||||
|
||||
#--- show package dependencies function ---
|
||||
deps() {
|
||||
checkroot
|
||||
if [[ "$packages" == "" ]]; then
|
||||
for i in $(/usr/bin/cat $packagesqueryfile); do
|
||||
# Показываем зависимости для всех установленных пакетов
|
||||
for pkg in $(/usr/bin/cat $packagesqueryfile); do
|
||||
cd $installedpackagesdir
|
||||
pkgname=$(echo $(find . -name "$i*") | sed -e "/.\//s///" | sed -e "/.pkg/s///")
|
||||
pkgname=$(echo $(find . -name "$pkg*") | sed -e "/.\//s///" | sed -e "/.pkg/s///")
|
||||
cd - &>/dev/null
|
||||
printf "${YELLOW}$(get_pkgname $pkgname) ${BGREEN}$(get_pkgver $pkgname)-$(get_pkgrel $pkgname)${BWHITE} deps: \n${RESET}"
|
||||
|
||||
if [ "$recursive" = "true" ]; then
|
||||
printf "${YELLOW}$(get_pkgname $pkgname) ${BGREEN}$(get_pkgver $pkgname)-$(get_pkgrel $pkgname)${BWHITE} deps (recursive): \n${RESET}"
|
||||
else
|
||||
printf "${YELLOW}$(get_pkgname $pkgname) ${BGREEN}$(get_pkgver $pkgname)-$(get_pkgrel $pkgname)${BWHITE} deps: \n${RESET}"
|
||||
fi
|
||||
|
||||
[ ! -f $installedpackagesdir/${pkgname}.pkg/deps ] \
|
||||
&& printf "\t${YELLOW}**${BWHITE} No deps\n${RESET}" \
|
||||
&& continue
|
||||
for j in $(cat $installedpackagesdir/${pkgname}.pkg/deps); do
|
||||
printf "\t"
|
||||
printpkg $j
|
||||
done
|
||||
|
||||
if [ "$recursive" = "true" ]; then
|
||||
# Рекурсивный вывод
|
||||
for dep in $(cat $installedpackagesdir/${pkgname}.pkg/deps); do
|
||||
show_deps_recursive "$dep" 1 "$pkg"
|
||||
done
|
||||
else
|
||||
# Обычный вывод (только прямые зависимости)
|
||||
for dep in $(cat $installedpackagesdir/${pkgname}.pkg/deps); do
|
||||
printf "\t"
|
||||
printpkg $dep
|
||||
done
|
||||
fi
|
||||
unset pkgname
|
||||
done
|
||||
exit 0
|
||||
fi
|
||||
for i in $packages; do
|
||||
|
||||
# Показываем зависимости для указанных пакетов
|
||||
for pkg in $packages; do
|
||||
cd $installedpackagesdir
|
||||
pkgname=$(echo $(find . -name "$i*") | sed -e "/.\//s///" | sed -e "/.pkg/s///")
|
||||
pkgname=$(echo $(find . -name "$pkg*") | sed -e "/.\//s///" | sed -e "/.pkg/s///")
|
||||
cd - &>/dev/null
|
||||
if [ "$pkgname" = "" ]; then
|
||||
printf "${BBLUE}**${BWHITE} Package $i not found [${BRED} ERROR ${BWHITE}]\n${RESET}"
|
||||
printf "${BBLUE}**${BWHITE} Package $pkg not found [${BRED} ERROR ${BWHITE}]\n${RESET}"
|
||||
continue
|
||||
fi
|
||||
printf "${YELLOW}$(get_pkgname $pkgname) ${BGREEN}$(get_pkgver $pkgname)-$(get_pkgrel $pkgname)${BWHITE} deps: \n${RESET}"
|
||||
|
||||
if [ "$recursive" = "true" ]; then
|
||||
printf "${YELLOW}$(get_pkgname $pkgname) ${BGREEN}$(get_pkgver $pkgname)-$(get_pkgrel $pkgname)${BWHITE} deps (recursive): \n${RESET}"
|
||||
else
|
||||
printf "${YELLOW}$(get_pkgname $pkgname) ${BGREEN}$(get_pkgver $pkgname)-$(get_pkgrel $pkgname)${BWHITE} deps: \n${RESET}"
|
||||
fi
|
||||
|
||||
[ ! -f $installedpackagesdir/${pkgname}.pkg/deps ] \
|
||||
&& printf "\t${YELLOW}**${BWHITE} No deps\n${RESET}" \
|
||||
&& continue
|
||||
for j in $(cat $installedpackagesdir/${pkgname}.pkg/deps); do
|
||||
printf "\t"
|
||||
printpkg $j
|
||||
done
|
||||
|
||||
if [ "$recursive" = "true" ]; then
|
||||
# Рекурсивный вывод
|
||||
for dep in $(cat $installedpackagesdir/${pkgname}.pkg/deps); do
|
||||
show_deps_recursive "$dep" 1 "$pkg"
|
||||
done
|
||||
else
|
||||
# Обычный вывод (только прямые зависимости)
|
||||
for dep in $(cat $installedpackagesdir/${pkgname}.pkg/deps); do
|
||||
printf "\t"
|
||||
printpkg $dep
|
||||
done
|
||||
fi
|
||||
unset pkgname
|
||||
done
|
||||
}
|
||||
@@ -615,38 +725,523 @@ buildpkg() {
|
||||
}
|
||||
#-----------------------------------------------------
|
||||
|
||||
# upgrade system packages function
|
||||
upgrade() {
|
||||
checkroot
|
||||
total_updates=0
|
||||
for i in $(cat $packagesqueryfile); do
|
||||
package=$(search $(get_pkgname $i) | awk -F' ' '{ for (i=2; i<=NF; i++) { print $i } }')
|
||||
repo=$(search $(get_pkgname $i) | awk -F' ' '{ print $1 }')
|
||||
for j in $package; do
|
||||
if [ $(get_pkgrel $j) -gt $(get_pkgrel $i) ]; then
|
||||
printf "${BRED}old: $(printpkg $i)"
|
||||
printf "${BGREEN}new: $(printpkg $j)"
|
||||
printf "${BGREEN}from: $(printf $repo | sed 's/://g')\n${RESET}"
|
||||
total_updates=$((total_updates+1))
|
||||
continue
|
||||
fi
|
||||
instver=$(echo $(get_pkgver $i) | awk -F'.' '{ for (i=1; i<=NF; i++) printf $i }')
|
||||
repover=$(echo $(get_pkgver $j) | awk -F'.' '{ for (i=1; i<=NF; i++) printf $i }')
|
||||
if [ $repover -gt $instver ]; then
|
||||
printf "${BRED}old: $(printpkg $i)"
|
||||
printf "${BGREEN}new: $(printpkg $j)"
|
||||
printf "${BGREEN}from: $(printf $repo | sed 's/://g')\n${RESET}"
|
||||
total_updates=$((total_updates+1))
|
||||
continue
|
||||
# Функция для правильного сравнения версий (POSIX)
|
||||
# Поддерживает любое количество компонентов в версии
|
||||
# Возвращает: 0 если равны, 1 если $1 > $2, 2 если $1 < $2
|
||||
compare_versions() {
|
||||
ver1="$1"
|
||||
ver2="$2"
|
||||
|
||||
# Если версии одинаковые, возвращаем сразу
|
||||
if [ "$ver1" = "$ver2" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Заменяем точки на пробелы
|
||||
ver1_parts=$(echo "$ver1" | sed 's/\./ /g')
|
||||
ver2_parts=$(echo "$ver2" | sed 's/\./ /g')
|
||||
|
||||
# Считаем количество частей
|
||||
ver1_count=$(echo "$ver1_parts" | wc -w)
|
||||
ver2_count=$(echo "$ver2_parts" | wc -w)
|
||||
|
||||
max_parts=$ver1_count
|
||||
if [ $ver2_count -gt $max_parts ]; then
|
||||
max_parts=$ver2_count
|
||||
fi
|
||||
|
||||
# Сравниваем каждую часть
|
||||
idx=1
|
||||
while [ $idx -le $max_parts ]; do
|
||||
# DEBUG
|
||||
>&2 echo "DEBUG: idx=$idx, max_parts=$max_parts"
|
||||
|
||||
# Извлекаем части через awk
|
||||
ver1_part=$(echo "$ver1_parts" | awk -v n=$idx '{ print $n }')
|
||||
ver2_part=$(echo "$ver2_parts" | awk -v n=$idx '{ print $n }')
|
||||
|
||||
# DEBUG
|
||||
>&2 echo "DEBUG: ver1_part=$ver1_part, ver2_part=$ver2_part"
|
||||
|
||||
# Устанавливаем 0 если пусто
|
||||
ver1_part=${ver1_part:-0}
|
||||
ver2_part=${ver2_part:-0}
|
||||
|
||||
# Очищаем от нечисловых символов
|
||||
ver1_num=$(echo "$ver1_part" | sed 's/[^0-9]//g')
|
||||
ver2_num=$(echo "$ver2_part" | sed 's/[^0-9]//g')
|
||||
|
||||
# DEBUG
|
||||
>&2 echo "DEBUG: ver1_num=$ver1_num, ver2_num=$ver2_num"
|
||||
|
||||
# Если пусто после очистки, ставим 0
|
||||
ver1_num=${ver1_num:-0}
|
||||
ver2_num=${ver2_num:-0}
|
||||
|
||||
# Сравниваем числа
|
||||
if [ "$ver1_num" -gt "$ver2_num" ]; then
|
||||
>&2 echo "DEBUG: returning 1"
|
||||
return 1
|
||||
elif [ "$ver1_num" -lt "$ver2_num" ]; then
|
||||
>&2 echo "DEBUG: returning 2"
|
||||
return 2
|
||||
fi
|
||||
|
||||
idx=$((idx + 1))
|
||||
done
|
||||
|
||||
# Все части равны
|
||||
>&2 echo "DEBUG: returning 0"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Вспомогательная функция для поиска пакета в репозитории (для upgrade)
|
||||
# Возвращает полное имя пакета из репозитория или пустую строку
|
||||
search_package_in_repo() {
|
||||
pkg_to_find="$1"
|
||||
servers=$(/usr/bin/cat $repofile)
|
||||
|
||||
for server in $servers; do
|
||||
serverdir=$(echo $server | sed -e "/http:\/\//s///" | sed -e "/ftp:\/\//s///")
|
||||
repoquery=$(/usr/bin/cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///')
|
||||
|
||||
for repo_pkg in $repoquery; do
|
||||
repo_pkg_name=$(get_pkgname "$repo_pkg")
|
||||
if [ "$repo_pkg_name" = "$pkg_to_find" ]; then
|
||||
# Возвращаем формат: "serverdir|полное_имя_пакета"
|
||||
printf "%s|%s\n" "$serverdir" "$repo_pkg"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
done
|
||||
printf "${YELLOW}Total updates: ${BWHITE}$total_updates\n${RESET}"
|
||||
return
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Функция для поиска самой новой версии пакета в репозиториях
|
||||
# Если есть несколько версий, возвращает самую новую
|
||||
find_latest_package_version() {
|
||||
pkg_to_find="$1"
|
||||
servers=$(/usr/bin/cat $repofile)
|
||||
|
||||
latest_pkg=""
|
||||
latest_ver=""
|
||||
latest_rel=""
|
||||
latest_server=""
|
||||
|
||||
for server in $servers; do
|
||||
serverdir=$(echo $server | sed -e "/http:\/\//s///" | sed -e "/ftp:\/\//s///")
|
||||
repoquery=$(/usr/bin/cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///')
|
||||
|
||||
for repo_pkg in $repoquery; do
|
||||
repo_pkg_name=$(get_pkgname "$repo_pkg")
|
||||
|
||||
if [ "$repo_pkg_name" = "$pkg_to_find" ]; then
|
||||
repo_ver=$(get_pkgver "$repo_pkg")
|
||||
repo_rel=$(get_pkgrel "$repo_pkg")
|
||||
|
||||
# Если это первая найденная версия
|
||||
if [ -z "$latest_pkg" ]; then
|
||||
latest_pkg="$repo_pkg"
|
||||
latest_ver="$repo_ver"
|
||||
latest_rel="$repo_rel"
|
||||
latest_server="$serverdir"
|
||||
else
|
||||
# Сравниваем с текущей последней версией
|
||||
compare_versions "$repo_ver" "$latest_ver"
|
||||
ver_result=$?
|
||||
|
||||
if [ $ver_result -eq 1 ]; then
|
||||
# Новая версия больше
|
||||
latest_pkg="$repo_pkg"
|
||||
latest_ver="$repo_ver"
|
||||
latest_rel="$repo_rel"
|
||||
latest_server="$serverdir"
|
||||
elif [ $ver_result -eq 0 ]; then
|
||||
# Версии равны, сравниваем релизы
|
||||
if [ "$repo_rel" -gt "$latest_rel" ] 2>/dev/null; then
|
||||
latest_pkg="$repo_pkg"
|
||||
latest_ver="$repo_ver"
|
||||
latest_rel="$repo_rel"
|
||||
latest_server="$serverdir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
if [ -n "$latest_pkg" ]; then
|
||||
printf "%s|%s\n" "$latest_server" "$latest_pkg"
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
upgrade() {
|
||||
checkroot
|
||||
|
||||
# Вместо массивов используем списки через символ новой строки
|
||||
packages_to_upgrade=""
|
||||
new_versions=""
|
||||
repos_list=""
|
||||
|
||||
total_updates=0
|
||||
|
||||
printf "${YELLOW}**${BWHITE} Checking for updates...\n${RESET}"
|
||||
|
||||
# Сохраняем текущее значение packages
|
||||
saved_packages="$packages"
|
||||
|
||||
# Проверяем что файл с установленными пакетами существует
|
||||
if [ ! -f "$packagesqueryfile" ]; then
|
||||
printf "${BRED}**${BWHITE} Cannot find $packagesqueryfile\n${RESET}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
installed_count=$(wc -l < "$packagesqueryfile")
|
||||
printf "${YELLOW}**${BWHITE} Found $installed_count installed packages\n${RESET}"
|
||||
|
||||
for installed_pkg in $(cat $packagesqueryfile); do
|
||||
printf "${BBLUE}**${BWHITE} Processing: $installed_pkg\n${RESET}"
|
||||
|
||||
pkg_name=$(get_pkgname "$installed_pkg")
|
||||
installed_ver=$(get_pkgver "$installed_pkg")
|
||||
installed_rel=$(get_pkgrel "$installed_pkg")
|
||||
|
||||
printf "${BBLUE} Name: $pkg_name\n${RESET}"
|
||||
printf "${BBLUE} Version: $installed_ver\n${RESET}"
|
||||
printf "${BBLUE} Release: $installed_rel\n${RESET}"
|
||||
|
||||
# Проверяем что значения не пустые
|
||||
if [ -z "$pkg_name" ] || [ -z "$installed_ver" ] || [ -z "$installed_rel" ]; then
|
||||
printf "${BRED} Skipping (empty values)\n${RESET}"
|
||||
continue
|
||||
fi
|
||||
|
||||
printf "${BBLUE} Searching in repos...\n${RESET}"
|
||||
|
||||
# Ищем самую новую версию пакета в репозиториях
|
||||
search_result=$(find_latest_package_version "$pkg_name")
|
||||
search_status=$?
|
||||
|
||||
printf "${BBLUE} Search result: $search_result\n${RESET}"
|
||||
printf "${BBLUE} Search status: $search_status\n${RESET}"
|
||||
|
||||
if [ $search_status -ne 0 ] || [ -z "$search_result" ]; then
|
||||
printf "${BRED} Not found in repos\n${RESET}"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Парсим результат: "serverdir|packagename"
|
||||
repo=$(printf '%s\n' "$search_result" | cut -d'|' -f1)
|
||||
repo_pkg=$(printf '%s\n' "$search_result" | cut -d'|' -f2)
|
||||
|
||||
printf "${BBLUE} Repo: $repo\n${RESET}"
|
||||
printf "${BBLUE} Repo pkg: $repo_pkg\n${RESET}"
|
||||
|
||||
repo_ver=$(get_pkgver "$repo_pkg")
|
||||
repo_rel=$(get_pkgrel "$repo_pkg")
|
||||
|
||||
printf "${BBLUE} Repo version: $repo_ver\n${RESET}"
|
||||
printf "${BBLUE} Repo release: $repo_rel\n${RESET}"
|
||||
|
||||
# Проверяем что значения не пустые
|
||||
if [ -z "$repo_ver" ] || [ -z "$repo_rel" ]; then
|
||||
printf "${BRED} Empty repo version/release\n${RESET}"
|
||||
continue
|
||||
fi
|
||||
|
||||
needs_update=false
|
||||
|
||||
# Сначала сравниваем версии
|
||||
printf "${BBLUE} Comparing versions: $repo_ver vs $installed_ver\n${RESET}"
|
||||
|
||||
# Вызываем compare_versions БЕЗ перенаправления вывода
|
||||
compare_versions "$repo_ver" "$installed_ver" #|| true
|
||||
ver_result=$?
|
||||
|
||||
printf "${BBLUE} Compare result: $ver_result\n${RESET}"
|
||||
|
||||
# Проверяем что результат корректен (0, 1, или 2)
|
||||
if [ $ver_result -lt 0 ] || [ $ver_result -gt 2 ]; then
|
||||
printf "${BRED} Error comparing versions (result=$ver_result)\n${RESET}"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ $ver_result -eq 1 ]; then
|
||||
# Версия в репозитории новее
|
||||
printf "${BGREEN} Repo version is newer!\n${RESET}"
|
||||
needs_update=true
|
||||
elif [ $ver_result -eq 0 ]; then
|
||||
# Версии равны, сравниваем релизы
|
||||
printf "${BBLUE} Versions equal, comparing releases: $repo_rel vs $installed_rel\n${RESET}"
|
||||
if [ "$repo_rel" -gt "$installed_rel" ] 2>/dev/null; then
|
||||
printf "${BGREEN} Repo release is newer!\n${RESET}"
|
||||
needs_update=true
|
||||
fi
|
||||
else
|
||||
printf "${BBLUE} Repo version is older\n${RESET}"
|
||||
fi
|
||||
|
||||
if [ "$needs_update" = "true" ]; then
|
||||
printf "${BRED}old: ${BWHITE}$pkg_name ${BGREEN}$installed_ver-$installed_rel\n${RESET}"
|
||||
printf "${BGREEN}new: ${BWHITE}$pkg_name ${BGREEN}$repo_ver-$repo_rel\n${RESET}"
|
||||
printf "${BGREEN}from: ${BWHITE}$repo\n${RESET}"
|
||||
|
||||
# Добавляем в списки (используем символ новой строки как разделитель)
|
||||
if [ -z "$packages_to_upgrade" ]; then
|
||||
packages_to_upgrade="$pkg_name"
|
||||
new_versions="$repo_pkg"
|
||||
repos_list="$repo"
|
||||
else
|
||||
packages_to_upgrade="$packages_to_upgrade
|
||||
$pkg_name"
|
||||
new_versions="$new_versions
|
||||
$repo_pkg"
|
||||
repos_list="$repos_list
|
||||
$repo"
|
||||
fi
|
||||
|
||||
total_updates=$((total_updates + 1))
|
||||
else
|
||||
printf "${BGREEN} Package is up to date\n${RESET}"
|
||||
fi
|
||||
|
||||
printf "\n"
|
||||
done
|
||||
|
||||
# Восстанавливаем packages
|
||||
packages="$saved_packages"
|
||||
|
||||
printf "${YELLOW}**${BWHITE} Total updates found: $total_updates\n${RESET}"
|
||||
|
||||
if [ $total_updates -eq 0 ]; then
|
||||
printf "${BGREEN}**${BWHITE} System is up to date!\n${RESET}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
printf "\n${YELLOW}Total updates available: ${BWHITE}$total_updates\n${RESET}"
|
||||
|
||||
# Если указан флаг --yes или -y, обновляем автоматически
|
||||
if [ "$auto_upgrade" = "true" ]; then
|
||||
printf "${YELLOW}**${BWHITE} Upgrading packages...\n${RESET}"
|
||||
upgrade_packages=true
|
||||
else
|
||||
# Спрашиваем пользователя
|
||||
printf "${YELLOW}**${BWHITE} Do you want to upgrade these packages? [y/N]: ${RESET}"
|
||||
read answer
|
||||
case "$answer" in
|
||||
[Yy]|[Yy][Ee][Ss])
|
||||
upgrade_packages=true
|
||||
;;
|
||||
*)
|
||||
printf "${YELLOW}**${BWHITE} Upgrade cancelled.\n${RESET}"
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if [ "$upgrade_packages" = "true" ]; then
|
||||
# Обновляем пакеты
|
||||
# Используем временные файлы для хранения списков
|
||||
temp_pkg_list="/tmp/pm_upgrade_pkg_$$"
|
||||
temp_ver_list="/tmp/pm_upgrade_ver_$$"
|
||||
|
||||
printf '%s\n' "$packages_to_upgrade" > "$temp_pkg_list"
|
||||
printf '%s\n' "$new_versions" > "$temp_ver_list"
|
||||
|
||||
idx=1
|
||||
while [ $idx -le $total_updates ]; do
|
||||
pkg_to_upgrade=$(sed -n "${idx}p" "$temp_pkg_list")
|
||||
|
||||
if [ -n "$pkg_to_upgrade" ]; then
|
||||
printf "\n${YELLOW}**${GREEN} Upgrading $pkg_to_upgrade...\n${RESET}"
|
||||
|
||||
# Удаляем старую версию
|
||||
packages="$pkg_to_upgrade"
|
||||
del
|
||||
|
||||
# Устанавливаем новую версию
|
||||
packages="$pkg_to_upgrade"
|
||||
archives=""
|
||||
add
|
||||
|
||||
printf "${BGREEN}**${BWHITE} $pkg_to_upgrade upgraded successfully!\n${RESET}"
|
||||
fi
|
||||
|
||||
idx=$((idx + 1))
|
||||
done
|
||||
|
||||
# Удаляем временные файлы
|
||||
rm -f "$temp_pkg_list" "$temp_ver_list"
|
||||
|
||||
printf "\n${BGREEN}**${BWHITE} All packages upgraded successfully!\n${RESET}"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
up() {
|
||||
upgrade
|
||||
}
|
||||
|
||||
|
||||
# upgrade() {
|
||||
# checkroot
|
||||
|
||||
# # Вместо массивов используем списки через символ новой строки
|
||||
# packages_to_upgrade=""
|
||||
# new_versions=""
|
||||
# repos_list=""
|
||||
|
||||
# total_updates=0
|
||||
|
||||
# printf "${YELLOW}**${BWHITE} Checking for updates...\n${RESET}"
|
||||
|
||||
# # Сохраняем текущее значение packages
|
||||
# saved_packages="$packages"
|
||||
|
||||
# for installed_pkg in $(cat $packagesqueryfile); do
|
||||
# pkg_name=$(get_pkgname "$installed_pkg")
|
||||
# installed_ver=$(get_pkgver "$installed_pkg")
|
||||
# installed_rel=$(get_pkgrel "$installed_pkg")
|
||||
|
||||
# # Проверяем что значения не пустые
|
||||
# if [ -z "$pkg_name" ] || [ -z "$installed_ver" ] || [ -z "$installed_rel" ]; then
|
||||
# continue
|
||||
# fi
|
||||
|
||||
# # Ищем самую новую версию пакета в репозиториях
|
||||
# search_result=$(find_latest_package_version "$pkg_name")
|
||||
|
||||
# if [ -z "$search_result" ]; then
|
||||
# # Пакет не найден в репозиториях
|
||||
# continue
|
||||
# fi
|
||||
|
||||
# # Парсим результат: "serverdir|packagename"
|
||||
# repo=$(printf '%s\n' "$search_result" | cut -d'|' -f1)
|
||||
# repo_pkg=$(printf '%s\n' "$search_result" | cut -d'|' -f2)
|
||||
|
||||
# repo_ver=$(get_pkgver "$repo_pkg")
|
||||
# repo_rel=$(get_pkgrel "$repo_pkg")
|
||||
|
||||
# # Проверяем что значения не пустые
|
||||
# if [ -z "$repo_ver" ] || [ -z "$repo_rel" ]; then
|
||||
# continue
|
||||
# fi
|
||||
|
||||
# needs_update=false
|
||||
|
||||
# # Сначала сравниваем версии
|
||||
# compare_versions "$repo_ver" "$installed_ver"
|
||||
# ver_result=$?
|
||||
|
||||
# if [ $ver_result -eq 1 ]; then
|
||||
# # Версия в репозитории новее
|
||||
# needs_update=true
|
||||
# elif [ $ver_result -eq 0 ]; then
|
||||
# # Версии равны, сравниваем релизы
|
||||
# if [ "$repo_rel" -gt "$installed_rel" ] 2>/dev/null; then
|
||||
# needs_update=true
|
||||
# fi
|
||||
# fi
|
||||
|
||||
# if [ "$needs_update" = "true" ]; then
|
||||
# printf "${BRED}old: ${BWHITE}$pkg_name ${BGREEN}$installed_ver-$installed_rel\n${RESET}"
|
||||
# printf "${BGREEN}new: ${BWHITE}$pkg_name ${BGREEN}$repo_ver-$repo_rel\n${RESET}"
|
||||
# printf "${BGREEN}from: ${BWHITE}$repo\n${RESET}"
|
||||
|
||||
# # Добавляем в списки (используем символ новой строки как разделитель)
|
||||
# if [ -z "$packages_to_upgrade" ]; then
|
||||
# packages_to_upgrade="$pkg_name"
|
||||
# new_versions="$repo_pkg"
|
||||
# repos_list="$repo"
|
||||
# else
|
||||
# packages_to_upgrade="$packages_to_upgrade
|
||||
# $pkg_name"
|
||||
# new_versions="$new_versions
|
||||
# $repo_pkg"
|
||||
# repos_list="$repos_list
|
||||
# $repo"
|
||||
# fi
|
||||
|
||||
# total_updates=$((total_updates + 1))
|
||||
# fi
|
||||
# done
|
||||
|
||||
# # Восстанавливаем packages
|
||||
# packages="$saved_packages"
|
||||
|
||||
# if [ $total_updates -eq 0 ]; then
|
||||
# printf "${BGREEN}**${BWHITE} System is up to date!\n${RESET}"
|
||||
# return 0
|
||||
# fi
|
||||
|
||||
# printf "\n${YELLOW}Total updates available: ${BWHITE}$total_updates\n${RESET}"
|
||||
|
||||
# # Если указан флаг --yes или -y, обновляем автоматически
|
||||
# if [ "$auto_upgrade" = "true" ]; then
|
||||
# printf "${YELLOW}**${BWHITE} Upgrading packages...\n${RESET}"
|
||||
# upgrade_packages=true
|
||||
# else
|
||||
# # Спрашиваем пользователя
|
||||
# printf "${YELLOW}**${BWHITE} Do you want to upgrade these packages? [y/N]: ${RESET}"
|
||||
# read answer
|
||||
# case "$answer" in
|
||||
# [Yy]|[Yy][Ee][Ss])
|
||||
# upgrade_packages=true
|
||||
# ;;
|
||||
# *)
|
||||
# printf "${YELLOW}**${BWHITE} Upgrade cancelled.\n${RESET}"
|
||||
# return 0
|
||||
# ;;
|
||||
# esac
|
||||
# fi
|
||||
|
||||
# if [ "$upgrade_packages" = "true" ]; then
|
||||
# # Обновляем пакеты
|
||||
# # Используем временные файлы для хранения списков
|
||||
# temp_pkg_list="/tmp/pm_upgrade_pkg_$$"
|
||||
# temp_ver_list="/tmp/pm_upgrade_ver_$$"
|
||||
|
||||
# printf '%s\n' "$packages_to_upgrade" > "$temp_pkg_list"
|
||||
# printf '%s\n' "$new_versions" > "$temp_ver_list"
|
||||
|
||||
# idx=1
|
||||
# while [ $idx -le $total_updates ]; do
|
||||
# pkg_to_upgrade=$(sed -n "${idx}p" "$temp_pkg_list")
|
||||
|
||||
# if [ -n "$pkg_to_upgrade" ]; then
|
||||
# printf "\n${YELLOW}**${GREEN} Upgrading $pkg_to_upgrade...\n${RESET}"
|
||||
|
||||
# # Удаляем старую версию
|
||||
# packages="$pkg_to_upgrade"
|
||||
# del
|
||||
|
||||
# # Устанавливаем новую версию
|
||||
# packages="$pkg_to_upgrade"
|
||||
# archives=""
|
||||
# add
|
||||
|
||||
# printf "${BGREEN}**${BWHITE} $pkg_to_upgrade upgraded successfully!\n${RESET}"
|
||||
# fi
|
||||
|
||||
# idx=$((idx + 1))
|
||||
# done
|
||||
|
||||
# # Удаляем временные файлы
|
||||
# rm -f "$temp_pkg_list" "$temp_ver_list"
|
||||
|
||||
# printf "\n${BGREEN}**${BWHITE} All packages upgraded successfully!\n${RESET}"
|
||||
# fi
|
||||
|
||||
# return 0
|
||||
# }
|
||||
# up() {
|
||||
# upgrade
|
||||
# }
|
||||
#-----------------------------
|
||||
|
||||
# index packages in directory and create query file for create pm repository
|
||||
@@ -771,6 +1366,10 @@ parse_opts() {
|
||||
rootdir=$2
|
||||
shift 2
|
||||
;;
|
||||
-R|--recursive)
|
||||
recursive=true
|
||||
shift
|
||||
;;
|
||||
-q|--query)
|
||||
command=query
|
||||
shift
|
||||
@@ -821,6 +1420,10 @@ parse_opts() {
|
||||
shift
|
||||
packages=$@
|
||||
;;
|
||||
-y|--yes)
|
||||
auto_upgrade=true
|
||||
shift
|
||||
;;
|
||||
-U|--upgrade)
|
||||
command=upgrade
|
||||
shift
|
||||
|
||||
Reference in new issue
Block a user