fix(easy-docker): restore app selection mapping and parsing

This commit is contained in:
RocketQuack 2026-03-01 19:38:52 +01:00
parent 6cd1723a40
commit 84ca792a23
4 changed files with 138 additions and 187 deletions

View file

@ -230,216 +230,169 @@ get_predefined_apps_catalog_entries() {
done <"${catalog_path}" done <"${catalog_path}"
} }
get_predefined_app_labels_lines() { parse_predefined_app_catalog_entry() {
local entry="" local entry="${1}"
local app_label="" local app_id_var="${2}"
local app_label_var="${3}"
local app_repo_var="${4}"
local app_default_branch_var="${5}"
local app_branches_csv_var="${6}"
local parsed_app_id=""
local parsed_app_label=""
local parsed_app_repo=""
local parsed_app_default_branch=""
local parsed_app_branches_csv=""
while IFS= read -r entry; do IFS='|' read -r parsed_app_id parsed_app_label parsed_app_repo parsed_app_default_branch parsed_app_branches_csv <<<"${entry}"
if [ -z "${entry}" ]; then printf -v "${app_id_var}" "%s" "${parsed_app_id}"
continue printf -v "${app_label_var}" "%s" "${parsed_app_label}"
fi printf -v "${app_repo_var}" "%s" "${parsed_app_repo}"
printf -v "${app_default_branch_var}" "%s" "${parsed_app_default_branch}"
app_label="${entry#*|}" printf -v "${app_branches_csv_var}" "%s" "${parsed_app_branches_csv}"
app_label="${app_label%%|*}"
printf '%s\n' "${app_label}"
done < <(get_predefined_apps_catalog_entries)
} }
get_predefined_app_id_by_label() { get_predefined_app_field_by_field() {
local label="${1}" local lookup_field="${1}"
local lookup_value="${2}"
local result_field="${3}"
local entry="" local entry=""
local app_id="" local app_id=""
local app_label="" local app_label=""
local app_repo="" local app_repo=""
local app_default_branch="" local app_default_branch=""
local app_branches_csv="" local app_branches_csv=""
local lookup_candidate=""
local result_value=""
trim_predefined_catalog_field lookup_value "${lookup_value}"
if [ -z "${lookup_value}" ]; then
return 1
fi
while IFS= read -r entry; do while IFS= read -r entry; do
if [ -z "${entry}" ]; then if [ -z "${entry}" ]; then
continue continue
fi fi
IFS='|' read -r app_id app_label app_repo app_default_branch app_branches_csv <<<"${entry}" parse_predefined_app_catalog_entry "${entry}" app_id app_label app_repo app_default_branch app_branches_csv
if [ "${app_label}" = "${label}" ]; then
printf '%s\n' "${app_id}"
return 0
fi
done < <(get_predefined_apps_catalog_entries)
return 1 case "${lookup_field}" in
} id)
lookup_candidate="${app_id}"
get_predefined_app_repo_by_id() { ;;
local app_id_lookup="${1}" label)
local entry="" lookup_candidate="${app_label}"
local app_id="" ;;
local app_label="" *)
local app_repo=""
local app_default_branch=""
local app_branches_csv=""
while IFS= read -r entry; do
if [ -z "${entry}" ]; then
continue
fi
IFS='|' read -r app_id app_label app_repo app_default_branch app_branches_csv <<<"${entry}"
if [ "${app_id}" = "${app_id_lookup}" ]; then
printf '%s\n' "${app_repo}"
return 0
fi
done < <(get_predefined_apps_catalog_entries)
return 1
}
get_predefined_app_label_by_id() {
local app_id_lookup="${1}"
local entry=""
local app_id=""
local app_label=""
local app_repo=""
local app_default_branch=""
local app_branches_csv=""
while IFS= read -r entry; do
if [ -z "${entry}" ]; then
continue
fi
IFS='|' read -r app_id app_label app_repo app_default_branch app_branches_csv <<<"${entry}"
if [ "${app_id}" = "${app_id_lookup}" ]; then
printf '%s\n' "${app_label}"
return 0
fi
done < <(get_predefined_apps_catalog_entries)
return 1
}
get_predefined_app_default_branch_by_id() {
local app_id_lookup="${1}"
local entry=""
local app_id=""
local app_label=""
local app_repo=""
local app_default_branch=""
local app_branches_csv=""
while IFS= read -r entry; do
if [ -z "${entry}" ]; then
continue
fi
IFS='|' read -r app_id app_label app_repo app_default_branch app_branches_csv <<<"${entry}"
if [ "${app_id}" = "${app_id_lookup}" ]; then
printf '%s\n' "${app_default_branch}"
return 0
fi
done < <(get_predefined_apps_catalog_entries)
return 1
}
get_predefined_app_branch_lines_by_id() {
local result_var="${1}"
local app_id_lookup="${2}"
local entry=""
local app_id=""
local app_label=""
local app_repo=""
local app_default_branch=""
local app_branches_csv=""
local branch=""
local branch_lines=""
local -a branches=()
while IFS= read -r entry; do
if [ -z "${entry}" ]; then
continue
fi
IFS='|' read -r app_id app_label app_repo app_default_branch app_branches_csv <<<"${entry}"
if [ "${app_id}" != "${app_id_lookup}" ]; then
continue
fi
IFS=',' read -r -a branches <<<"${app_branches_csv}"
for branch in "${branches[@]}"; do
trim_predefined_catalog_field branch "${branch}"
if [ -z "${branch}" ]; then
continue
fi
if [ -z "${branch_lines}" ]; then
branch_lines="${branch}"
else
branch_lines="${branch_lines}"$'\n'"${branch}"
fi
done
if [ -z "${branch_lines}" ]; then
return 1 return 1
;;
esac
trim_predefined_catalog_field lookup_candidate "${lookup_candidate}"
if [ "${lookup_candidate}" != "${lookup_value}" ]; then
continue
fi fi
printf -v "${result_var}" "%s" "${branch_lines}" case "${result_field}" in
id)
result_value="${app_id}"
;;
label)
result_value="${app_label}"
;;
repo)
result_value="${app_repo}"
;;
default_branch)
result_value="${app_default_branch}"
;;
branches_csv)
result_value="${app_branches_csv}"
;;
*)
return 1
;;
esac
printf '%s\n' "${result_value}"
return 0 return 0
done < <(get_predefined_apps_catalog_entries) done < <(get_predefined_apps_catalog_entries)
return 1 return 1
} }
get_predefined_app_id_by_label() {
local label="${1}"
get_predefined_app_field_by_field "label" "${label}" "id"
}
get_predefined_app_repo_by_id() {
local app_id_lookup="${1}"
get_predefined_app_field_by_field "id" "${app_id_lookup}" "repo"
}
get_predefined_app_label_by_id() {
local app_id_lookup="${1}"
get_predefined_app_field_by_field "id" "${app_id_lookup}" "label"
}
get_predefined_app_default_branch_by_id() {
local app_id_lookup="${1}"
get_predefined_app_field_by_field "id" "${app_id_lookup}" "default_branch"
}
get_predefined_app_branch_lines_by_id() {
local result_var="${1}"
local app_id_lookup="${2}"
local app_branches_csv=""
local branch=""
local branch_lines=""
local -a branches=()
app_branches_csv="$(get_predefined_app_field_by_field "id" "${app_id_lookup}" "branches_csv" || true)"
if [ -z "${app_branches_csv}" ]; then
return 1
fi
IFS=',' read -r -a branches <<<"${app_branches_csv}"
for branch in "${branches[@]}"; do
trim_predefined_catalog_field branch "${branch}"
if [ -z "${branch}" ]; then
continue
fi
if [ -z "${branch_lines}" ]; then
branch_lines="${branch}"
else
branch_lines="${branch_lines}"$'\n'"${branch}"
fi
done
if [ -z "${branch_lines}" ]; then
return 1
fi
printf -v "${result_var}" "%s" "${branch_lines}"
return 0
}
predefined_app_catalog_has_id() { predefined_app_catalog_has_id() {
local app_id_lookup="${1}" local app_id_lookup="${1}"
local entry=""
local app_id=""
local app_label=""
local app_repo=""
local app_default_branch=""
local app_branches_csv=""
if [ -z "${app_id_lookup}" ]; then if [ -z "${app_id_lookup}" ]; then
return 1 return 1
fi fi
while IFS= read -r entry; do get_predefined_app_field_by_field "id" "${app_id_lookup}" "id" >/dev/null 2>&1
if [ -z "${entry}" ]; then
continue
fi
IFS='|' read -r app_id app_label app_repo app_default_branch app_branches_csv <<<"${entry}"
if [ "${app_id}" = "${app_id_lookup}" ]; then
return 0
fi
done < <(get_predefined_apps_catalog_entries || true)
return 1
} }
predefined_app_catalog_has_label() { predefined_app_catalog_has_label() {
local app_label_lookup="${1}" local app_label_lookup="${1}"
local entry=""
local app_id=""
local app_label=""
local app_repo=""
local app_default_branch=""
local app_branches_csv=""
if [ -z "${app_label_lookup}" ]; then if [ -z "${app_label_lookup}" ]; then
return 1 return 1
fi fi
while IFS= read -r entry; do get_predefined_app_field_by_field "label" "${app_label_lookup}" "label" >/dev/null 2>&1
if [ -z "${entry}" ]; then
continue
fi
IFS='|' read -r app_id app_label app_repo app_default_branch app_branches_csv <<<"${entry}"
if [ "${app_label}" = "${app_label_lookup}" ]; then
return 0
fi
done < <(get_predefined_apps_catalog_entries || true)
return 1
} }
append_predefined_app_catalog_entry() { append_predefined_app_catalog_entry() {

View file

@ -120,22 +120,6 @@ get_metadata_string_field() {
' "${metadata_path}" ' "${metadata_path}"
} }
get_metadata_number_field() {
local metadata_path="${1}"
local field_name="${2}"
if [ ! -f "${metadata_path}" ]; then
return 1
fi
awk -v field_name="${field_name}" '
match($0, "\"" field_name "\"[[:space:]]*:[[:space:]]*([0-9]+)", parts) {
print parts[1]
exit
}
' "${metadata_path}"
}
get_env_file_key_value() { get_env_file_key_value() {
local env_file="${1}" local env_file="${1}"
local key="${2}" local key="${2}"

View file

@ -235,6 +235,7 @@ prompt_custom_modular_apps_data() {
local options_lines="" local options_lines=""
local selected_labels_csv="" local selected_labels_csv=""
local selection_raw="" local selection_raw=""
local selection_lines=""
local prompt_status=0 local prompt_status=0
local selected_predefined_csv="" local selected_predefined_csv=""
local parsed_predefined_csv="" local parsed_predefined_csv=""
@ -311,8 +312,12 @@ prompt_custom_modular_apps_data() {
fi fi
parsed_predefined_csv="" 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 while IFS= read -r selected_label; do
trim_predefined_catalog_field selected_label "${selected_label}"
if [ -z "${selected_label}" ]; then if [ -z "${selected_label}" ]; then
continue continue
fi fi
@ -323,7 +328,7 @@ prompt_custom_modular_apps_data() {
fi fi
append_csv_unique parsed_predefined_csv "${parsed_predefined_csv}" "${predefined_app_id}" append_csv_unique parsed_predefined_csv "${parsed_predefined_csv}" "${predefined_app_id}"
done <<EOF done <<EOF
${selection_raw} ${selection_lines}
EOF EOF
selected_predefined_csv="${parsed_predefined_csv}" selected_predefined_csv="${parsed_predefined_csv}"

View file

@ -194,7 +194,9 @@ show_custom_modular_apps_multi_select() {
local stack_name="" local stack_name=""
local status_text="" local status_text=""
local option_line="" local option_line=""
local selected_label=""
local -a menu_options=() local -a menu_options=()
local -a selected_labels=()
local -a gum_args=() local -a gum_args=()
render_main_screen 1 >&2 render_main_screen 1 >&2
@ -224,7 +226,14 @@ EOF
--selected.foreground 45 --selected.foreground 45
) )
if [ -n "${selected_labels_csv}" ]; then if [ -n "${selected_labels_csv}" ]; then
gum_args+=(--selected "${selected_labels_csv}") IFS=',' read -r -a selected_labels <<<"${selected_labels_csv}"
for selected_label in "${selected_labels[@]}"; do
trim_predefined_catalog_field selected_label "${selected_label}"
if [ -z "${selected_label}" ]; then
continue
fi
gum_args+=(--selected "${selected_label}")
done
fi fi
gum choose "${gum_args[@]}" "${menu_options[@]}" gum choose "${gum_args[@]}" "${menu_options[@]}"