Files
compose-files/deploy/envparse.py
T
admin b664e9d41d
ci/woodpecker/push/woodpecker Pipeline was successful
feat(envparse): add merge mode for global+stack env layering
2026-07-08 21:29:13 -07:00

42 lines
1.4 KiB
Python

import sys, re
def parse_env(path):
pairs = []
with open(path) as f:
for line in f:
line = line.strip()
if not line or line.startswith('#') or '=' not in line:
continue
k, _, v = line.partition('=')
k = k.strip(); v = v.strip()
if (v.startswith("'") and v.endswith("'")) or \
(v.startswith('"') and v.endswith('"')):
v = v[1:-1]
pairs.append((k, v))
return pairs
def merge_envs(base_path, override_path):
"""Merge two env files. Keys in override_path win over base_path."""
base = dict(parse_env(base_path))
override = dict(parse_env(override_path))
merged = {**base, **override}
return list(merged.items())
mode = sys.argv[1]
if mode == 'export':
for k, v in parse_env(sys.argv[2]):
print('export {}={}'.format(k, repr(v)))
elif mode == 'export_merged':
# export_merged <global.env> <stack.env>
for k, v in merge_envs(sys.argv[2], sys.argv[3]):
print('export {}={}'.format(k, repr(v)))
elif mode == 'vars':
print(' '.join('$' + k for k, v in parse_env(sys.argv[2])))
elif mode == 'vars_merged':
# vars_merged <global.env> <stack.env>
print(' '.join('$' + k for k, v in merge_envs(sys.argv[2], sys.argv[3])))
elif mode == 'strip':
t = sys.stdin.read()
t = re.sub(r'[ \t]*env_file:[ \t]*\n([ \t]+-[^\n]*\n)+', '', t)
sys.stdout.write(t)