From a07328c99ddd4a2162df77df93cb2bb1263d872c Mon Sep 17 00:00:00 2001 From: yalh76 Date: Thu, 17 Mar 2022 19:24:03 +0100 Subject: [PATCH] removal simplification --- helpers/app | 126 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 54 deletions(-) diff --git a/helpers/app b/helpers/app index 67479ec09..d272194af 100644 --- a/helpers/app +++ b/helpers/app @@ -1,6 +1,6 @@ #!/bin/bash -# Install other YunoHost apps +# Install other YunoHost apps when they are not multi-instance # # usage: ynh_install_apps --apps="appfoo appbar?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" # | arg: -a, --apps= - apps to install @@ -16,78 +16,96 @@ ynh_install_apps() { # Split the list of apps in an array local apps_list=($(echo $apps | tr " " "\n")) + local apps_dependencies="" # For each app - for oneapp_and_its_args in "${apps_list[@]}" + for one_app_and_its_args in "${apps_list[@]}" do - # Retrieve the name of the app (part before _ynh) - local oneapp=$(echo "$oneapp_and_its_args" | awk -F'?' '{print $1}') - [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to install" + # Retrieve the name of the app (part before ?) + local one_app=$(echo "$one_app_and_its_args" | awk -F'?' '{print $1}') + [ -z "$one_app" ] && ynh_die --message="You didn't provided a YunoHost app to install" - # Retrieve the arguments of the app (part after ?) - local oneargument=$(echo "$oneapp_and_its_args" | awk -F'?' '{print $2}') - [ ! -z "$oneargument" ] && oneargument="--args \"$oneargument\"" - - # Installing or upgrading the app yunohost tools update apps - if ! yunohost app list --output-as json --quiet | jq -e --arg id $oneapp '.apps[] | select(.id == $id)' >/dev/null + + # Installing or upgrading the app depending if it's installed or not + if ! yunohost app list --output-as json --quiet | jq -e --arg id $one_app '.apps[] | select(.id == $id)' >/dev/null then - yunohost app install $oneapp $oneargument + # Retrieve the arguments of the app (part after ?) + local one_argument=$(echo "$one_app_and_its_args" | awk -F'?' '{print $2}') + [ ! -z "$one_argument" ] && one_argument="--args \"$one_argument\"" + + # Install the app with its arguments + yunohost app install $one_app $one_argument else - yunohost app upgrade $oneapp $oneargument + # Upgrade the app + yunohost app upgrade $one_app + fi + + if [ ! -z "$apps_dependencies" ] + then + apps_dependencies="$apps_dependencies, $one_app" + else + apps_dependencies="$one_app" fi - ynh_app_setting_set --app=$app --key=require_$oneapp --value="1" done + + ynh_app_setting_set --app=$app --key=apps_dependencies --value="$apps_dependencies" } # Remove other YunoHost apps # -# apps will be removed only if no other apps need them. +# Other YunoHost apps will be removed only if no other apps need them. # -# usage: ynh_remove_apps --apps="appfoo appbar?domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666" -# | arg: -a, --apps= - apps to install +# usage: ynh_remove_apps # # Requires YunoHost version *.*.* or higher. ynh_remove_apps() { - # Declare an array to define the options of this helper. - local legacy_args=a - local -A args_array=([a]=app=) - local app - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - # Split the list of apps in an array - local apps_list=($(echo $apps | tr " " "\n")) - - # For each app - for i in "${apps_list[@]}" - do - # Retrieve the name of the app (part before _ynh) - local oneapp=$(echo "$i" | awk -F'?' '{print $1}') - [ -z "$oneapp" ] && ynh_die --message="You didn't provided a YunoHost app to remove" + # Retrieve the apps dependencies of the app + local apps_dependencies=$(ynh_app_setting_get --app=$app --key=apps_dependencies) || true + ynh_app_setting_delete --app=$app --key=apps_dependencies || true - ynh_app_setting_delete --app=$app --key=require_$oneapp - - # List apps requiring $oneapp - local installed_apps=$(yunohost app list --output-as json --quiet | jq -r .apps[].id) - local required_by="" - local installed_app_required_by="" - for installed_app in $installed_apps + if [ ! -z "$apps_dependencies" ] + then + # Split the list of apps dependencies in an array + local apps_dependencies_list=($(echo $apps_dependencies | tr ", " "\n")) + + # For each apps dependencies + for one_app in "${apps_dependencies_list[@]}" do - local installed_app_required_by=$(ynh_app_setting_get --app=$installed_app --key="require_$oneapp") - if [[ -n "$installed_app_required_by" ]] - then - required_by="${installed_app_required_by}" - fi - installed_app_required_by="" - done + # Retrieve the list of installed apps + local installed_apps_list=$(yunohost app list --output-as json --quiet | jq -r .apps[].id) + local required_by="" + local installed_app_required_by="" - # If $oneapp is no more required - if [[ -z "$required_by" ]] - then - # Remove $oneapp - ynh_print_info --message="Removing of $oneapp" - yunohost app remove $oneapp --purge - fi - done + # For each other installed app + for one_installed_app in $installed_apps_list + do + # Retrieve the other apps dependencies + one_installed_apps_dependencies=$(ynh_app_setting_get --app=$one_installed_app --key=apps_dependencies) + if [ ! -z "$one_installed_apps_dependencies" ] + then + one_installed_apps_dependencies_list=($(echo $one_installed_apps_dependencies | tr ", " "\n")) + + # For each dependency of the other apps + for one_installed_app_dependency in "${one_installed_apps_dependencies_list[@]}" + do + if [[ $one_installed_app_dependency == $one_app ]]; then + required_by="$required_by $one_installed_app" + fi + done + fi + done + + # If $one_app is no more required + if [[ -z "$required_by" ]] + then + # Remove $one_app + ynh_print_info --message="Removing of $one_app" + yunohost app remove $one_app --purge + else + ynh_print_info --message="$one_app was not removed because it's still required by${required_by}" + fi + done + fi }