#!/usr/bin/env python import argparse import json import pprint import sys import toml import yaml from pathlib import Path def main(argv): pp = pprint.PrettyPrinter(indent=2) parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group(required=True) group.add_argument('--json', action='store_true') group.add_argument('--toml', action='store_true') group.add_argument('--yaml', action='store_true') group.add_argument('--pprint', action='store_true') parser.add_argument('vdbdir', type=str) opts = parser.parse_args(argv[1:]) vdb = Path(opts.vdbdir) if not vdb.is_dir(): print(f'{vdb} is not a directory') sys.exit(-1) d = {} for file in (x for x in vdb.iterdir()): if not file.name.isupper(): # print(f"Ignoring file {file.name}") continue value = file.read_text().rstrip('\n') if file.name == "CONTENTS": contents = {} for line in value.splitlines(keepends=False): (type, *rest) = line.split(sep=' ') parts = rest[0].split(sep='/') p = contents if type == 'dir': assert(len(rest) == 1) for part in parts[1:]: p = p.setdefault(part, {}) else: for part in parts[1:-1]: p = p.get(part) if type == 'obj': assert(len(rest) == 3) p[parts[-1]] = {'hash': rest[1], 'size': rest[2]} elif type == 'sym': assert(len(rest) == 4) p[parts[-1]] = {'target': rest[2], 'size': rest[3]} d[file.name] = contents elif file.name in ('DEFINED_PHASES', 'FEATURES', 'HOMEPAGE', 'INHERITED', 'IUSE', 'IUSE_EFFECTIVE', 'LICENSE', 'KEYWORDS', 'PKGUSE', 'RESTRICT', 'USE'): d[file.name] = value.split(' ') else: d[file.name] = value if opts.json: json.dump(d, sys.stdout) if opts.toml: toml.dump(d, sys.stdout) if opts.yaml: yaml.dump(d, sys.stdout) if opts.pprint: pp.pprint(d) if __name__ == '__main__': main(sys.argv)