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

191 lines
4.1 KiB
Bash
Executable file

#!/usr/bin/env bash
persist_stack_metadata_apps_object() {
local stack_dir="${1}"
local apps_json_object="${2}"
local metadata_path=""
local metadata_tmp_path=""
metadata_path="${stack_dir}/metadata.json"
metadata_tmp_path="${metadata_path}.tmp"
if [ ! -f "${metadata_path}" ]; then
return 1
fi
if [ -z "${apps_json_object}" ]; then
return 1
fi
if ! awk -v apps_object="${apps_json_object}" '
BEGIN {
in_top_level_apps = 0
apps_depth = 0
inserted = 0
prev = ""
}
function flush_prev() {
if (prev != "") {
print prev
prev = ""
}
}
{
if (!in_top_level_apps && $0 ~ /^ "apps"[[:space:]]*:/) {
flush_prev()
print " \"apps\": " apps_object ","
in_top_level_apps = 1
inserted = 1
if ($0 ~ /{/) {
apps_depth += gsub(/{/, "{", $0)
apps_depth -= gsub(/}/, "}", $0)
} else {
apps_depth = 0
}
if (apps_depth <= 0) {
in_top_level_apps = 0
}
next
}
if (in_top_level_apps) {
apps_depth += gsub(/{/, "{", $0)
apps_depth -= gsub(/}/, "}", $0)
if (apps_depth <= 0) {
in_top_level_apps = 0
}
next
}
if (!inserted && $0 ~ /^ "wizard"[[:space:]]*:/) {
flush_prev()
print " \"apps\": " apps_object ","
inserted = 1
}
if (!inserted && $0 ~ /^}/) {
if (prev != "") {
if (prev !~ /,[[:space:]]*$/) {
prev = prev ","
}
print prev
prev = ""
}
print " \"apps\": " apps_object
inserted = 1
print $0
next
}
flush_prev()
prev = $0
}
END {
flush_prev()
if (!inserted) {
exit 2
}
}
' "${metadata_path}" >"${metadata_tmp_path}"; then
rm -f -- "${metadata_tmp_path}" >/dev/null 2>&1 || true
return 1
fi
if ! mv -- "${metadata_tmp_path}" "${metadata_path}"; then
rm -f -- "${metadata_tmp_path}" >/dev/null 2>&1 || true
return 1
fi
return 0
}
persist_stack_metadata_wizard_object() {
local stack_dir="${1}"
local wizard_json_object="${2}"
local metadata_path=""
local metadata_tmp_path=""
metadata_path="${stack_dir}/metadata.json"
metadata_tmp_path="${metadata_path}.tmp"
if [ ! -f "${metadata_path}" ]; then
return 1
fi
if [ -z "${wizard_json_object}" ]; then
return 1
fi
if ! awk -v wizard_object="${wizard_json_object}" '
BEGIN {
in_top_level_wizard = 0
wizard_depth = 0
inserted = 0
prev = ""
}
function flush_prev() {
if (prev != "") {
print prev
prev = ""
}
}
{
if (!in_top_level_wizard && $0 ~ /^ "wizard"[[:space:]]*:/) {
flush_prev()
print " \"wizard\": " wizard_object
in_top_level_wizard = 1
inserted = 1
if ($0 ~ /{/) {
wizard_depth += gsub(/{/, "{", $0)
wizard_depth -= gsub(/}/, "}", $0)
} else {
wizard_depth = 0
}
if (wizard_depth <= 0) {
in_top_level_wizard = 0
}
next
}
if (in_top_level_wizard) {
wizard_depth += gsub(/{/, "{", $0)
wizard_depth -= gsub(/}/, "}", $0)
if (wizard_depth <= 0) {
in_top_level_wizard = 0
}
next
}
if (!inserted && $0 ~ /^}/) {
if (prev != "") {
if (prev !~ /,[[:space:]]*$/) {
prev = prev ","
}
print prev
prev = ""
}
print " \"wizard\": " wizard_object
inserted = 1
print $0
next
}
flush_prev()
prev = $0
}
END {
flush_prev()
if (!inserted) {
exit 2
}
}
' "${metadata_path}" >"${metadata_tmp_path}"; then
rm -f -- "${metadata_tmp_path}" >/dev/null 2>&1 || true
return 1
fi
if ! mv -- "${metadata_tmp_path}" "${metadata_path}"; then
rm -f -- "${metadata_tmp_path}" >/dev/null 2>&1 || true
return 1
fi
return 0
}