Skip to content

Commit

Permalink
Implement override and reset analog to docker-compose (https://docs.d…
Browse files Browse the repository at this point in the history
…ocker.com/compose/compose-file/13-merge/)

Signed-off-by: Sebastian Sellmeier <mail@sebastian-sellmeier.de>
  • Loading branch information
SebTM committed Feb 1, 2024
1 parent bce40c2 commit 90c1a27
Showing 1 changed file with 51 additions and 0 deletions.
51 changes: 51 additions & 0 deletions podman_compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -1149,6 +1149,43 @@ def flat_deps(services, with_extends=False):
for name, srv in services.items():
rec_deps(services, name)

###################
# Override and reset tags
###################

class OverrideTag(yaml.YAMLObject):
yaml_tag = u'!override'

def __init__(self, value):
self.value = value

def __repr__(self):
return self.value

@classmethod
def from_yaml(cls, loader, node):
return OverrideTag(node.value)

@classmethod
def to_yaml(cls, dumper, data):
return dumper.represent_scalar(cls.yaml_tag, data.value)

class ResetTag(yaml.YAMLObject):
yaml_tag = u'!reset'

def __repr__(self):
return

@classmethod
def from_yaml(cls, loader, node):
return ResetTag()

@classmethod
def to_yaml(cls, dumper, data):
return

yaml.SafeLoader.add_constructor(OverrideTag.yaml_tag, OverrideTag.from_yaml)
yaml.SafeLoader.add_constructor(ResetTag.yaml_tag, ResetTag.from_yaml)

###################
# podman and compose classes
Expand Down Expand Up @@ -1330,6 +1367,8 @@ def rec_merge_one(target, source):
update target from source recursively
"""
done = set()
remove = set()

for key, value in source.items():
if key in target:
continue
Expand All @@ -1340,10 +1379,18 @@ def rec_merge_one(target, source):
continue
if key not in source:
continue

value2 = source[key]

if key in ("command", "entrypoint"):
target[key] = clone(value2)
continue
if isinstance(value, ResetTag) or isinstance(value2, ResetTag):
remove.add(key)
continue
if isinstance(value, OverrideTag) or isinstance(value2, OverrideTag):
target[key] = clone(value.value) if isinstance(value, OverrideTag) else clone(value2.value)
continue
if not isinstance(value2, type(value)):
value_type = type(value)
value2_type = type(value2)
Expand All @@ -1368,6 +1415,10 @@ def rec_merge_one(target, source):
rec_merge_one(value, value2)
else:
target[key] = value2

for key in remove:
del target[key]

return target


Expand Down

0 comments on commit 90c1a27

Please sign in to comment.