| # Copyright (C) 2010-2013 Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | |
| # Copyright (C) 2019 Yann E. MORIN <yann.morin.1998@free.fr> | |
| 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) |