# Copyright (C) 2010-2013 Thomas Petazzoni # Copyright (C) 2019 Yann E. MORIN import json import logging import os import subprocess from collections import defaultdict # This function returns a tuple of four dictionaries, all using package # names as keys: # - a dictionary which values are the lists of packages that are the # dependencies of the package used as key; # - a dictionary which values are the lists of packages that are the # reverse dependencies of the package used as key; # - a dictionary which values are the type of the package used as key; # - a dictionary which values are the version of the package used as key, # 'virtual' for a virtual package, or the empty string for a rootfs. def get_dependency_tree(): logging.info("Getting dependency tree...") deps = {} rdeps = defaultdict(list) types = {} versions = {} # Special case for the 'all' top-level fake package deps['all'] = [] types['all'] = 'target' versions['all'] = '' cmd = ["make", "-s", "--no-print-directory", "show-info"] with open(os.devnull, 'wb') as devnull: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=devnull, universal_newlines=True) pkg_list = json.loads(p.communicate()[0]) for pkg in pkg_list: deps['all'].append(pkg) types[pkg] = pkg_list[pkg]["type"] deps[pkg] = pkg_list[pkg].get("dependencies", []) for p in deps[pkg]: rdeps[p].append(pkg) versions[pkg] = \ None if pkg_list[pkg]["type"] == "rootfs" \ else "virtual" if pkg_list[pkg]["virtual"] \ else pkg_list[pkg]["version"] return (deps, rdeps, types, versions)