up date added recursive deps and added upgrade with popitka

This commit is contained in:
wt committed 2025-09-30 19:27:20 +07:00
1 parent 755df2c2c1
commit 1fb1d40acc
1 file changed
+651 -48
+651 -48
View File
@@ -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