#!/usr/bin/env bash csv_contains_value() { local csv_values="${1}" local value="${2}" case ",${csv_values}," in *,"${value}",*) return 0 ;; *) return 1 ;; esac } append_csv_unique() { local result_var="${1}" local csv_values="${2}" local value="${3}" local updated_csv="${csv_values}" if [ -z "${value}" ]; then printf -v "${result_var}" "%s" "${updated_csv}" return 0 fi if csv_contains_value "${updated_csv}" "${value}"; then printf -v "${result_var}" "%s" "${updated_csv}" return 0 fi if [ -z "${updated_csv}" ]; then updated_csv="${value}" else updated_csv="${updated_csv},${value}" fi printf -v "${result_var}" "%s" "${updated_csv}" } lines_contains_line() { local lines="${1}" local target_line="${2}" local line="" while IFS= read -r line; do if [ -z "${line}" ]; then continue fi if [ "${line}" = "${target_line}" ]; then return 0 fi done <&2 status_text="$(printf "Stack: %s\n\nSelect branch for %s (%s)\nRepo: %s\n%s" "${stack_dir##*/}" "${app_label}" "${app_id}" "${repo_url}" "${default_hint}")" render_box_message "${status_text}" "0 2" >&2 if selection="$( gum choose \ --height 16 \ --header "Branch selection (${app_label})" \ --cursor.foreground 63 \ --selected.foreground 45 \ "${branch_options[@]}" \ "Back to app selection" )"; then : else return 2 fi case "${selection}" in "Back to app selection" | "") return 2 ;; *) printf -v "${result_var}" "%s" "${selection}" return 0 ;; esac } prompt_custom_modular_apps_data() { local result_apps_metadata_var="${1}" local stack_dir="${2}" local metadata_path="" local options_lines="" local selected_labels_csv="" local selection_raw="" local selection_lines="" local prompt_status=0 local selected_predefined_csv="" local parsed_predefined_csv="" local selected_label="" local predefined_app_id="" local predefined_app_label="" local predefined_repo_url="" local selected_branch="" local preferred_branch="" local available_branch_lines="" local existing_branch_lines="" local existing_custom_lines="" local selected_branch_lines="" local selected_app_count=0 local assembled_apps_metadata_json_object="" local -a predefined_catalog_entries=() local -a selected_predefined_ids=() metadata_path="${stack_dir}/metadata.json" if [ -f "${metadata_path}" ]; then selected_predefined_csv="$(get_metadata_apps_predefined_csv "${metadata_path}" || true)" existing_branch_lines="$(get_metadata_apps_predefined_branch_lines "${metadata_path}" || true)" existing_custom_lines="$(get_metadata_apps_custom_lines "${metadata_path}" || true)" fi while true; do options_lines="" selected_labels_csv="" predefined_catalog_entries=() mapfile -t predefined_catalog_entries < <(get_predefined_apps_catalog_entries || true) for selected_label in "${predefined_catalog_entries[@]}"; do IFS='|' read -r predefined_app_id predefined_app_label predefined_repo_url _ _ <<<"${selected_label}" if [ -z "${predefined_app_id}" ] || [ -z "${predefined_app_label}" ]; then continue fi if [ -z "${options_lines}" ]; then options_lines="$(printf '%s' "${predefined_app_label}")" else options_lines="$(printf '%s\n%s' "${options_lines}" "${predefined_app_label}")" fi done if [ -n "${selected_predefined_csv}" ]; then IFS=',' read -r -a selected_predefined_ids <<<"${selected_predefined_csv}" for predefined_app_id in "${selected_predefined_ids[@]}"; do if [ -z "${predefined_app_id}" ]; then continue fi predefined_app_label="$(get_predefined_app_label_by_id "${predefined_app_id}" || true)" if [ -z "${predefined_app_label}" ]; then continue fi append_csv_unique selected_labels_csv "${selected_labels_csv}" "${predefined_app_label}" done fi if [ -z "${options_lines}" ]; then show_warning_and_wait "No apps available in catalog." 3 return 1 fi if selection_raw="$(show_custom_modular_apps_multi_select "${stack_dir}" "${options_lines}" "${selected_labels_csv}")"; then prompt_status=0 else prompt_status=$? fi if [ "${prompt_status}" -ne 0 ]; then return 2 fi if [ -z "${selection_raw}" ]; then show_warning_message "Select at least one app." continue fi parsed_predefined_csv="" # gum choose can return multiple values separated by newlines or commas # depending on version/configuration. Normalize to one label per line. selection_lines="$(printf '%s' "${selection_raw}" | tr ',' '\n')" while IFS= read -r selected_label; do trim_predefined_catalog_field selected_label "${selected_label}" if [ -z "${selected_label}" ]; then continue fi predefined_app_id="$(get_predefined_app_id_by_label "${selected_label}" || true)" if [ -z "${predefined_app_id}" ]; then continue fi append_csv_unique parsed_predefined_csv "${parsed_predefined_csv}" "${predefined_app_id}" done <