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) |