harden the config reader against an empty or malformed .env

holcommon's empty .env made the loader evaluate one blank line, which
tripped set -u. Verified afterwards on holcommon's real host stack: the CLI
and the make engine resolve the same five files and render a byte-identical
241-line compose config.
This commit is contained in:
Yann Autissier
2026-09-03 18:40:31 +02:00
parent 35999574bd
commit 653a3c9415
6 changed files with 34 additions and 4 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ myos_cmd_doctor() {
printf 'configuration:\n'
for _f in $(myos_conf_files); do _ok "$_f" "read"; done
[ -f "$HOME/.config/myos/config" ] && _ok "$HOME/.config/myos/config" "read"
[ -f "${HOME:-}/.config/myos/config" ] && _ok "${HOME:-}/.config/myos/config" "read"
[ -f "$WORKDIR/.env" ] && _ok "$WORKDIR/.env" "read"
_ok ENV "$ENV"
_ok USER "$USER"
+3
View File
@@ -36,7 +36,10 @@ myos_dotenv_parse() {
myos_dotenv_load() {
[ -f "$1" ] || return 0
while IFS= read -r _kv; do
# an empty file still yields one empty line through the here-document
[ -n "$_kv" ] || continue
_k=${_kv%%=*}
[ -n "$_k" ] || continue
[ -n "$(myos_var "$_k")" ] && continue
eval "$_k=\${_kv#*=}"
done <<EOF
+1 -1
View File
@@ -15,7 +15,7 @@ myos_path() {
_wd=${WORKDIR:-$PWD}
_name=${STACK_DIR_NAME:-stack}
_out=
for _d in "$_wd" "$_wd/.." "$HOME/.local/share" /usr/local/share /usr/share; do
for _d in "$_wd" "$_wd/.." "${HOME:-/nonexistent}/.local/share" /usr/local/share /usr/share; do
for _c in "$_d/$_name" "$_d/myos/$_name"; do
[ -d "$_c" ] || continue
_c=$(cd "$_c" && pwd -P)
+4 -1
View File
@@ -6,7 +6,10 @@
# to consul, fabio routes on the urlprefix- tags it finds there.
# myos_var NAME value of the variable named NAME, empty when unset
myos_var() { eval "printf '%s' \"\${$1:-}\""; }
myos_var() {
[ -n "${1:-}" ] || return 0
eval "printf '%s' \"\${$1:-}\""
}
# myos_uri SERVICE PORT [BASE_URI]
# <service>.<base uri>, unless <SERVICE>_SERVICE[_<port>]_NAME overrides the prefix