Skip to content

Commit 90c1a27

Browse files
committed
Implement override and reset analog to docker-compose (https://docs.docker.com/compose/compose-file/13-merge/)
Signed-off-by: Sebastian Sellmeier <[email protected]>
1 parent bce40c2 commit 90c1a27

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

podman_compose.py

+51
Original file line numberDiff line numberDiff line change
@@ -1149,6 +1149,43 @@ def flat_deps(services, with_extends=False):
11491149
for name, srv in services.items():
11501150
rec_deps(services, name)
11511151

1152+
###################
1153+
# Override and reset tags
1154+
###################
1155+
1156+
class OverrideTag(yaml.YAMLObject):
1157+
yaml_tag = u'!override'
1158+
1159+
def __init__(self, value):
1160+
self.value = value
1161+
1162+
def __repr__(self):
1163+
return self.value
1164+
1165+
@classmethod
1166+
def from_yaml(cls, loader, node):
1167+
return OverrideTag(node.value)
1168+
1169+
@classmethod
1170+
def to_yaml(cls, dumper, data):
1171+
return dumper.represent_scalar(cls.yaml_tag, data.value)
1172+
1173+
class ResetTag(yaml.YAMLObject):
1174+
yaml_tag = u'!reset'
1175+
1176+
def __repr__(self):
1177+
return
1178+
1179+
@classmethod
1180+
def from_yaml(cls, loader, node):
1181+
return ResetTag()
1182+
1183+
@classmethod
1184+
def to_yaml(cls, dumper, data):
1185+
return
1186+
1187+
yaml.SafeLoader.add_constructor(OverrideTag.yaml_tag, OverrideTag.from_yaml)
1188+
yaml.SafeLoader.add_constructor(ResetTag.yaml_tag, ResetTag.from_yaml)
11521189

11531190
###################
11541191
# podman and compose classes
@@ -1330,6 +1367,8 @@ def rec_merge_one(target, source):
13301367
update target from source recursively
13311368
"""
13321369
done = set()
1370+
remove = set()
1371+
13331372
for key, value in source.items():
13341373
if key in target:
13351374
continue
@@ -1340,10 +1379,18 @@ def rec_merge_one(target, source):
13401379
continue
13411380
if key not in source:
13421381
continue
1382+
13431383
value2 = source[key]
1384+
13441385
if key in ("command", "entrypoint"):
13451386
target[key] = clone(value2)
13461387
continue
1388+
if isinstance(value, ResetTag) or isinstance(value2, ResetTag):
1389+
remove.add(key)
1390+
continue
1391+
if isinstance(value, OverrideTag) or isinstance(value2, OverrideTag):
1392+
target[key] = clone(value.value) if isinstance(value, OverrideTag) else clone(value2.value)
1393+
continue
13471394
if not isinstance(value2, type(value)):
13481395
value_type = type(value)
13491396
value2_type = type(value2)
@@ -1368,6 +1415,10 @@ def rec_merge_one(target, source):
13681415
rec_merge_one(value, value2)
13691416
else:
13701417
target[key] = value2
1418+
1419+
for key in remove:
1420+
del target[key]
1421+
13711422
return target
13721423

13731424

0 commit comments

Comments
 (0)