diff --git a/src/pm b/src/pm index 3739ec6..e4558c2 100755 --- a/src/pm +++ b/src/pm @@ -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