blob: 7effe3aa0239d3caf18a7629c484c55eb24b3132 [file] [log] [blame]
#!/usr/bin/env python2.7
# Copyright 2020 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 collections
import os
import re
import subprocess
import sys
_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
FUCHSIA_ROOT = os.path.dirname( # $root
os.path.dirname( # scripts
_SCRIPT_DIR)) # unification
BootfsEntry = collections.namedtuple('BootfsEntry', ['name', 'size'])
def parse_zbi(data):
bootfs = []
current_header = None
for line in data.splitlines():
header_match = re.match('^[0-9a-f]{8}: [0-9a-f]{8} (\w+).*$', line)
if header_match:
current_header = header_match.group(1)
continue
if current_header == 'BOOTFS':
bootfs_match = re.match('^\s{8}: [0-9a-f]{8} ([0-9a-f]{8}) (.+)$',
line)
if bootfs_match:
bootfs.append(BootfsEntry(name=bootfs_match.group(2),
size=int(bootfs_match.group(1), 16)))
return bootfs
def main():
parser = argparse.ArgumentParser(description='Displays ZBI contents')
parser.add_argument('zbi',
help='Path to the zbi file to inspect')
parser.add_argument('--build-dir',
help='Path to the build directory',
default=os.path.join(FUCHSIA_ROOT, 'out', 'default'))
parser.add_argument('--mode',
help='Sorting dimension',
choices=['size', 'name'],
default='name')
args = parser.parse_args()
zbi_tool = os.path.join(args.build_dir, 'host_x64', 'zbi')
contents = subprocess.check_output([zbi_tool, '-tv', args.zbi])
bootfs = parse_zbi(contents)
if args.mode == 'size':
for b in sorted(bootfs, key=lambda b: b.size, reverse=True):
size = '{:,}'.format(b.size)
print(size.rjust(11) + ' ' + b.name)
elif args.mode == 'name':
for b in sorted(bootfs):
print(b.name)
return 0
if __name__ == '__main__':
sys.exit(main())