| Index: services/shell/public/tools/manifest/manifest_collator.py
|
| diff --git a/services/shell/public/tools/manifest/manifest_collator.py b/services/shell/public/tools/manifest/manifest_collator.py
|
| index 4cf845b38b8a5434ac531b222f3e0b533a55c1ef..a8d79b26b3ff20aed0f82d134296ebd4955e778c 100755
|
| --- a/services/shell/public/tools/manifest/manifest_collator.py
|
| +++ b/services/shell/public/tools/manifest/manifest_collator.py
|
| @@ -12,6 +12,13 @@ import shutil
|
| import sys
|
| import urlparse
|
|
|
| +
|
| +# Keys which are completely overridden by manifest overlays
|
| +_MANIFEST_OVERLAY_OVERRIDE_KEYS = [
|
| + "display_name",
|
| + "process-group",
|
| +]
|
| +
|
| eater_relative = '../../../../../../tools/json_comment_eater'
|
| eater_relative = os.path.join(os.path.abspath(__file__), eater_relative)
|
| sys.path.insert(0, os.path.normpath(eater_relative))
|
| @@ -20,13 +27,15 @@ try:
|
| finally:
|
| sys.path.pop(0)
|
|
|
| +
|
| def ParseJSONFile(filename):
|
| with open(filename) as json_file:
|
| try:
|
| return json.loads(json_comment_eater.Nom(json_file.read()))
|
| - except ValueError:
|
| + except ValueError as e:
|
| print "%s is not a valid JSON document" % filename
|
| - return None
|
| + raise e
|
| +
|
|
|
| def MergeDicts(left, right):
|
| for k, v in right.iteritems():
|
| @@ -44,16 +53,17 @@ def MergeDicts(left, right):
|
| return left
|
|
|
|
|
| -def MergeBaseManifest(parent, base):
|
| - MergeDicts(parent["capabilities"], base["capabilities"])
|
| +def MergeManifestOverlay(manifest, overlay):
|
| + MergeDicts(manifest["capabilities"], overlay["capabilities"])
|
|
|
| - if "services" in base:
|
| - if "services" not in parent:
|
| - parent["services"] = []
|
| - parent["services"].extend(base["services"])
|
| + if "services" in overlay:
|
| + if "services" not in manifest:
|
| + manifest["services"] = []
|
| + manifest["services"].extend(overlay["services"])
|
|
|
| - if "process-group" in base:
|
| - parent["process-group"] = base["process-group"]
|
| + for key in _MANIFEST_OVERLAY_OVERRIDE_KEYS:
|
| + if key in overlay:
|
| + manifest[key] = overlay[key]
|
|
|
|
|
| def main():
|
| @@ -62,18 +72,10 @@ def main():
|
| parser.add_argument("--parent")
|
| parser.add_argument("--output")
|
| parser.add_argument("--name")
|
| - parser.add_argument("--base-manifest", default=None)
|
| + parser.add_argument("--overlays", nargs="+", dest="overlays", default=[])
|
| args, children = parser.parse_known_args()
|
|
|
| parent = ParseJSONFile(args.parent)
|
| - if parent == None:
|
| - return 1
|
| -
|
| - if args.base_manifest:
|
| - base = ParseJSONFile(args.base_manifest)
|
| - if base == None:
|
| - return 1
|
| - MergeBaseManifest(parent, base)
|
|
|
| service_path = parent['name'].split(':')[1]
|
| if service_path.startswith('//'):
|
| @@ -87,14 +89,14 @@ def main():
|
|
|
| services = []
|
| for child in children:
|
| - service = ParseJSONFile(child)
|
| - if service == None:
|
| - return 1
|
| - services.append(service)
|
| + services.append(ParseJSONFile(child))
|
|
|
| if len(services) > 0:
|
| parent['services'] = services
|
|
|
| + for overlay_path in args.overlays:
|
| + MergeManifestOverlay(parent, ParseJSONFile(overlay_path))
|
| +
|
| with open(args.output, 'w') as output_file:
|
| json.dump(parent, output_file)
|
|
|
|
|