blob: 820b1c38a970778651165da3278ea8aaecf4b69e [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import json
import math
import os
import sys
def main():
parser = argparse.ArgumentParser(
description="Convert zbi tool JSON output to d3js-friendly JSON input format"
)
parser.add_argument(
"--input",
required=True,
type=argparse.FileType("r"),
help="Output of `zbi --output-json=...`",
)
parser.add_argument(
"--output",
required=True,
help="Output JSON in d3js-friendly format",
type=argparse.FileType("w"),
)
parser.add_argument(
"--page-size",
type=int,
default=4096,
help="Round file sizes up to multiples of this size",
)
args = parser.parse_args()
zbi = json.load(args.input)
root = {"name": "bootfs", "children": []}
# Find bootfs
bootfs = next((item for item in zbi if item["type"] == "BOOTFS"), None)
if not bootfs:
print("Could not find bootfs in ZBI")
return 1
# Accumulate contents and their uncompressed size
for file in bootfs["contents"]:
name = file["name"]
length = file["length"]
# Round up to page size
length = math.ceil(length / args.page_size) * args.page_size
# Find base directory for file
basedir = root
path_parts = name.split("/")
for path_part in path_parts[:-1]:
nextdir = next(
(
child
for child in basedir["children"]
if child["name"] == path_part
),
None,
)
if not nextdir:
nextdir = {"name": path_part, "children": []}
basedir["children"].append(nextdir)
basedir = nextdir
# Add file
basedir["children"].append({"name": path_parts[-1], "value": length})
json.dump(root, args.output)
return 0
if __name__ == "__main__":
sys.exit(main())