@@ -1149,6 +1149,43 @@ def flat_deps(services, with_extends=False):
1149
1149
for name , srv in services .items ():
1150
1150
rec_deps (services , name )
1151
1151
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 )
1152
1189
1153
1190
###################
1154
1191
# podman and compose classes
@@ -1330,6 +1367,8 @@ def rec_merge_one(target, source):
1330
1367
update target from source recursively
1331
1368
"""
1332
1369
done = set ()
1370
+ remove = set ()
1371
+
1333
1372
for key , value in source .items ():
1334
1373
if key in target :
1335
1374
continue
@@ -1340,10 +1379,18 @@ def rec_merge_one(target, source):
1340
1379
continue
1341
1380
if key not in source :
1342
1381
continue
1382
+
1343
1383
value2 = source [key ]
1384
+
1344
1385
if key in ("command" , "entrypoint" ):
1345
1386
target [key ] = clone (value2 )
1346
1387
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
1347
1394
if not isinstance (value2 , type (value )):
1348
1395
value_type = type (value )
1349
1396
value2_type = type (value2 )
@@ -1368,6 +1415,10 @@ def rec_merge_one(target, source):
1368
1415
rec_merge_one (value , value2 )
1369
1416
else :
1370
1417
target [key ] = value2
1418
+
1419
+ for key in remove :
1420
+ del target [key ]
1421
+
1371
1422
return target
1372
1423
1373
1424
0 commit comments