From b664e9d41d44bb1396c3718cf31cb6d92c0ed7a2 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 8 Jul 2026 21:29:13 -0700 Subject: [PATCH] feat(envparse): add merge mode for global+stack env layering --- deploy/envparse.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/deploy/envparse.py b/deploy/envparse.py index 50f0ea7..e5739d6 100644 --- a/deploy/envparse.py +++ b/deploy/envparse.py @@ -15,12 +15,26 @@ def parse_env(path): 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 + 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 + 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)