mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-05-29 04:53:17 +02:00
fix(dotenv): add support for escaped dollars
This commit is contained in:
parent
785db2faa3
commit
d30724763f
2 changed files with 29 additions and 3 deletions
|
|
@ -143,11 +143,9 @@ _parse_dotenv_content() {
|
||||||
fi
|
fi
|
||||||
## END: FILTER COMMAND EXPANSION
|
## END: FILTER COMMAND EXPANSION
|
||||||
|
|
||||||
# Unquote the value to handle special characters and multiline values
|
|
||||||
value="${(Q)value}"
|
|
||||||
|
|
||||||
# Single-quoted values are fully literal and must not participate in expansion.
|
# Single-quoted values are fully literal and must not participate in expansion.
|
||||||
if [[ "$raw_value" == \'*\' ]]; then
|
if [[ "$raw_value" == \'*\' ]]; then
|
||||||
|
value="${(Q)value}"
|
||||||
parsed_vars[$key]="$value"
|
parsed_vars[$key]="$value"
|
||||||
if [[ "$mode" == "export" ]]; then
|
if [[ "$mode" == "export" ]]; then
|
||||||
typeset -x "$key"="$value"
|
typeset -x "$key"="$value"
|
||||||
|
|
@ -155,6 +153,13 @@ _parse_dotenv_content() {
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Preserve escaped dollars so they remain literal after unquoting.
|
||||||
|
local escaped_dollar_placeholder=$'\001DOTENV_ESCAPED_DOLLAR\001'
|
||||||
|
value="${value//\\\$/$escaped_dollar_placeholder}"
|
||||||
|
|
||||||
|
# Unquote the value to handle special characters and multiline values.
|
||||||
|
value="${(Q)value}"
|
||||||
|
|
||||||
# Expand previously parsed in-file variables without partial name matches.
|
# Expand previously parsed in-file variables without partial name matches.
|
||||||
local expanded="" prefix remainder="$value" var_name
|
local expanded="" prefix remainder="$value" var_name
|
||||||
while [[ "$remainder" == *'$'* ]]; do
|
while [[ "$remainder" == *'$'* ]]; do
|
||||||
|
|
@ -179,6 +184,7 @@ _parse_dotenv_content() {
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
value="${expanded}${remainder}"
|
value="${expanded}${remainder}"
|
||||||
|
value="${value//$escaped_dollar_placeholder/\$}"
|
||||||
|
|
||||||
# Store in parsed vars (for in-file expansion)
|
# Store in parsed vars (for in-file expansion)
|
||||||
parsed_vars[$key]="$value"
|
parsed_vars[$key]="$value"
|
||||||
|
|
|
||||||
|
|
@ -366,3 +366,23 @@ EOF
|
||||||
|
|
||||||
assert "DOTENV_TEST_VARS" var_same_as "expected_vars"
|
assert "DOTENV_TEST_VARS" var_same_as "expected_vars"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test 'parse preserves escaped dollar signs before variable expansion' {
|
||||||
|
> "$fixture" <<'EOF'
|
||||||
|
BAR=expanded
|
||||||
|
ESCAPED_UNQUOTED=foo\$BAR
|
||||||
|
ESCAPED_DOUBLE="foo\$BAR"
|
||||||
|
ESCAPED_BRACED="\${BAR}"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
expected_vars=(
|
||||||
|
BAR 'expanded'
|
||||||
|
ESCAPED_UNQUOTED 'foo$BAR'
|
||||||
|
ESCAPED_DOUBLE 'foo$BAR'
|
||||||
|
ESCAPED_BRACED '${BAR}'
|
||||||
|
)
|
||||||
|
|
||||||
|
_parse_dotenv_test "$fixture"
|
||||||
|
|
||||||
|
assert "DOTENV_TEST_VARS" var_same_as "expected_vars"
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue