frappe_docker/scripts/easy-docker/lib/app/wizard/common/ux.sh

153 lines
3.7 KiB
Bash
Executable file

#!/usr/bin/env bash
list_existing_stack_names() {
local setup_type_filter="${1:-}"
local stacks_dir=""
local stack_dir=""
local metadata_path=""
local stack_name=""
local stack_setup_type=""
stacks_dir="$(get_easy_docker_stacks_dir)"
if [ ! -d "${stacks_dir}" ]; then
return 0
fi
for stack_dir in "${stacks_dir}"/*; do
if [ ! -d "${stack_dir}" ]; then
continue
fi
metadata_path="${stack_dir}/metadata.json"
if [ ! -f "${metadata_path}" ]; then
continue
fi
stack_name="$(get_metadata_string_field "${metadata_path}" "stack_name" || true)"
if [ -z "${stack_name}" ]; then
continue
fi
stack_setup_type="$(get_metadata_string_field "${metadata_path}" "setup_type" || true)"
if [ -z "${stack_setup_type}" ]; then
stack_setup_type="production"
fi
case "${setup_type_filter}" in
"" | all) ;;
*)
if [ "${stack_setup_type}" != "${setup_type_filter}" ]; then
continue
fi
;;
esac
printf '%s\n' "${stack_name}"
done | sort
}
stack_name_in_array() {
local stack_name="${1}"
shift
local candidate=""
for candidate in "$@"; do
if [ "${candidate}" = "${stack_name}" ]; then
return 0
fi
done
return 1
}
prompt_stack_name_with_cancel() {
local result_var="${1}"
local input_value=""
local input_status=0
input_value="$(prompt_new_stack_name)"
input_status=$?
if [ "${input_status}" -ne 0 ]; then
return "${FLOW_ABORT_INPUT}"
fi
input_value="$(printf '%s' "${input_value}" | tr -d '\r\n')"
case "${input_value}" in
/cancel | /CANCEL | /Cancel)
return "${FLOW_ABORT_INPUT}"
;;
esac
printf -v "${result_var}" "%s" "${input_value}"
return "${FLOW_CONTINUE}"
}
prompt_frappe_branch_with_cancel() {
local result_var="${1}"
local stack_name="${2}"
local options_lines=""
local selection=""
local selection_status=0
local selected_label=""
local selected_branch=""
local default_branch=""
local default_label=""
local version_entry=""
local version_id=""
local version_label=""
local version_branch=""
local -a version_entries=()
mapfile -t version_entries < <(get_frappe_versions_catalog_entries || true)
for version_entry in "${version_entries[@]}"; do
IFS='|' read -r version_id version_label version_branch <<<"${version_entry}"
if [ -z "${version_id}" ] || [ -z "${version_label}" ] || [ -z "${version_branch}" ]; then
continue
fi
if [ -z "${options_lines}" ]; then
options_lines="${version_label}"
else
options_lines="$(printf '%s\n%s' "${options_lines}" "${version_label}")"
fi
done
if [ -z "${options_lines}" ]; then
show_warning_and_wait "No Frappe version profiles available in scripts/easy-docker/config/frappe.tsv." 3
return 1
fi
default_branch="$(get_default_frappe_branch || true)"
default_label="$(get_frappe_version_label_by_branch "${default_branch}" || true)"
selection="$(show_frappe_version_profile_menu "${stack_name}" "${options_lines}" "${default_label}")"
selection_status=$?
if [ "${selection_status}" -ne 0 ]; then
return "${FLOW_ABORT_INPUT}"
fi
selected_label="$(printf '%s' "${selection}" | tr -d '\r\n')"
case "${selected_label}" in
"" | "Back")
return "${FLOW_ABORT_INPUT}"
;;
esac
selected_branch="$(get_frappe_version_branch_by_label "${selected_label}" || true)"
if [ -z "${selected_branch}" ]; then
show_warning_and_wait "Could not resolve branch for selected profile: ${selected_label}" 2
return 1
fi
printf -v "${result_var}" "%s" "${selected_branch}"
return "${FLOW_CONTINUE}"
}
show_warning_and_wait() {
local message="${1}"
local seconds="${2:-1}"
show_warning_message "${message}"
sleep "${seconds}"
}