kumquat-buildroot/support/scripts/brpkgutil.py

51 lines
1.7 KiB
Python
Raw Normal View History

# Copyright (C) 2010-2013 Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
support/graph-depends: use the new make-based dependency tree Now that we can get the whole dependency tree from make, use it to speed up things considerably. So far, we had three functions to get the dependencies information: get_depends(), get_rdepends(), and, somehow unrelated, get_version(). Because of the way %-show-{,r}depends works, getting the dependency tree was expensive, the three functions all took a set of packages for which to get the dependencies, in an attempt to limit the time it took to get that tree, but we still had to call these functions iteratively, until they returned no new dependency. This was pretty costly. Now, getting the tree is much, much less costly, and we can get the whole tree as cheaply as we previously got only the first-level dependencies. Furthermore, we can now also get the version information at the same time, and that also brings in whether the package is virtual or not, target or host. So, we drop all three helper functions, and replace them with a single one that returns all that information in one go: full dependency trees (direct and reverse), per-package type, and per-package version. Note: since commit 2d29fd96a (pkg-virtual: remove VERSION/SOURCE), virtual packages are no longer reported as having a 'virtual' version, so have since been displayed as regular packages in the graphs. Although noone complained, this patch incidentally restores the initial behaviour, and virtual packages are now correctly displayed as such again. Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Cc: Thomas De Schampheleire <patrickdepinguin@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2019-03-22 22:07:07 +01:00
# Copyright (C) 2019 Yann E. MORIN <yann.morin.1998@free.fr>
import json
import logging
support/graph-depends: use the new make-based dependency tree Now that we can get the whole dependency tree from make, use it to speed up things considerably. So far, we had three functions to get the dependencies information: get_depends(), get_rdepends(), and, somehow unrelated, get_version(). Because of the way %-show-{,r}depends works, getting the dependency tree was expensive, the three functions all took a set of packages for which to get the dependencies, in an attempt to limit the time it took to get that tree, but we still had to call these functions iteratively, until they returned no new dependency. This was pretty costly. Now, getting the tree is much, much less costly, and we can get the whole tree as cheaply as we previously got only the first-level dependencies. Furthermore, we can now also get the version information at the same time, and that also brings in whether the package is virtual or not, target or host. So, we drop all three helper functions, and replace them with a single one that returns all that information in one go: full dependency trees (direct and reverse), per-package type, and per-package version. Note: since commit 2d29fd96a (pkg-virtual: remove VERSION/SOURCE), virtual packages are no longer reported as having a 'virtual' version, so have since been displayed as regular packages in the graphs. Although noone complained, this patch incidentally restores the initial behaviour, and virtual packages are now correctly displayed as such again. Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Cc: Thomas De Schampheleire <patrickdepinguin@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2019-03-22 22:07:07 +01:00
import os
import subprocess
support/graph-depends: use the new make-based dependency tree Now that we can get the whole dependency tree from make, use it to speed up things considerably. So far, we had three functions to get the dependencies information: get_depends(), get_rdepends(), and, somehow unrelated, get_version(). Because of the way %-show-{,r}depends works, getting the dependency tree was expensive, the three functions all took a set of packages for which to get the dependencies, in an attempt to limit the time it took to get that tree, but we still had to call these functions iteratively, until they returned no new dependency. This was pretty costly. Now, getting the tree is much, much less costly, and we can get the whole tree as cheaply as we previously got only the first-level dependencies. Furthermore, we can now also get the version information at the same time, and that also brings in whether the package is virtual or not, target or host. So, we drop all three helper functions, and replace them with a single one that returns all that information in one go: full dependency trees (direct and reverse), per-package type, and per-package version. Note: since commit 2d29fd96a (pkg-virtual: remove VERSION/SOURCE), virtual packages are no longer reported as having a 'virtual' version, so have since been displayed as regular packages in the graphs. Although noone complained, this patch incidentally restores the initial behaviour, and virtual packages are now correctly displayed as such again. Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Cc: Thomas De Schampheleire <patrickdepinguin@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2019-03-22 22:07:07 +01:00
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 = {}
support/graph-depends: use the new make-based dependency tree Now that we can get the whole dependency tree from make, use it to speed up things considerably. So far, we had three functions to get the dependencies information: get_depends(), get_rdepends(), and, somehow unrelated, get_version(). Because of the way %-show-{,r}depends works, getting the dependency tree was expensive, the three functions all took a set of packages for which to get the dependencies, in an attempt to limit the time it took to get that tree, but we still had to call these functions iteratively, until they returned no new dependency. This was pretty costly. Now, getting the tree is much, much less costly, and we can get the whole tree as cheaply as we previously got only the first-level dependencies. Furthermore, we can now also get the version information at the same time, and that also brings in whether the package is virtual or not, target or host. So, we drop all three helper functions, and replace them with a single one that returns all that information in one go: full dependency trees (direct and reverse), per-package type, and per-package version. Note: since commit 2d29fd96a (pkg-virtual: remove VERSION/SOURCE), virtual packages are no longer reported as having a 'virtual' version, so have since been displayed as regular packages in the graphs. Although noone complained, this patch incidentally restores the initial behaviour, and virtual packages are now correctly displayed as such again. Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Cc: Thomas De Schampheleire <patrickdepinguin@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2019-03-22 22:07:07 +01:00
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"]
support/graph-depends: use the new make-based dependency tree Now that we can get the whole dependency tree from make, use it to speed up things considerably. So far, we had three functions to get the dependencies information: get_depends(), get_rdepends(), and, somehow unrelated, get_version(). Because of the way %-show-{,r}depends works, getting the dependency tree was expensive, the three functions all took a set of packages for which to get the dependencies, in an attempt to limit the time it took to get that tree, but we still had to call these functions iteratively, until they returned no new dependency. This was pretty costly. Now, getting the tree is much, much less costly, and we can get the whole tree as cheaply as we previously got only the first-level dependencies. Furthermore, we can now also get the version information at the same time, and that also brings in whether the package is virtual or not, target or host. So, we drop all three helper functions, and replace them with a single one that returns all that information in one go: full dependency trees (direct and reverse), per-package type, and per-package version. Note: since commit 2d29fd96a (pkg-virtual: remove VERSION/SOURCE), virtual packages are no longer reported as having a 'virtual' version, so have since been displayed as regular packages in the graphs. Although noone complained, this patch incidentally restores the initial behaviour, and virtual packages are now correctly displayed as such again. Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Cc: Thomas De Schampheleire <patrickdepinguin@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2019-03-22 22:07:07 +01:00
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"]
support/graph-depends: use the new make-based dependency tree Now that we can get the whole dependency tree from make, use it to speed up things considerably. So far, we had three functions to get the dependencies information: get_depends(), get_rdepends(), and, somehow unrelated, get_version(). Because of the way %-show-{,r}depends works, getting the dependency tree was expensive, the three functions all took a set of packages for which to get the dependencies, in an attempt to limit the time it took to get that tree, but we still had to call these functions iteratively, until they returned no new dependency. This was pretty costly. Now, getting the tree is much, much less costly, and we can get the whole tree as cheaply as we previously got only the first-level dependencies. Furthermore, we can now also get the version information at the same time, and that also brings in whether the package is virtual or not, target or host. So, we drop all three helper functions, and replace them with a single one that returns all that information in one go: full dependency trees (direct and reverse), per-package type, and per-package version. Note: since commit 2d29fd96a (pkg-virtual: remove VERSION/SOURCE), virtual packages are no longer reported as having a 'virtual' version, so have since been displayed as regular packages in the graphs. Although noone complained, this patch incidentally restores the initial behaviour, and virtual packages are now correctly displayed as such again. Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Cc: Thomas De Schampheleire <patrickdepinguin@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2019-03-22 22:07:07 +01:00
return (deps, rdeps, types, versions)