Add --transitive option to spack dependents

This commit is contained in:
Todd Gamblin 2017-06-17 18:14:44 -07:00
parent 6928cf7a68
commit b9606e3157
2 changed files with 18 additions and 8 deletions

View File

@ -31,7 +31,7 @@
import spack.store import spack.store
import spack.cmd import spack.cmd
description = "show installed packages that depend on another" description = "show packages that depend on another"
section = "basic" section = "basic"
level = "long" level = "long"
@ -41,9 +41,12 @@ def setup_parser(subparser):
'-i', '--installed', action='store_true', default=False, '-i', '--installed', action='store_true', default=False,
help="List installed dependents of an installed spec, " help="List installed dependents of an installed spec, "
"instead of possible dependents of a package.") "instead of possible dependents of a package.")
subparser.add_argument(
'-t', '--transitive', action='store_true', default=False,
help="Show all transitive dependents.")
subparser.add_argument( subparser.add_argument(
'spec', nargs=argparse.REMAINDER, 'spec', nargs=argparse.REMAINDER,
help="spec to list dependents for") help="spec or package name")
def inverted_dependencies(): def inverted_dependencies():
@ -69,12 +72,13 @@ def inverted_dependencies():
return dag return dag
def get_dependents(pkg_name, ideps, dependents=None): def get_dependents(pkg_name, ideps, transitive=False, dependents=None):
"""Get all dependents for a package. """Get all dependents for a package.
Args: Args:
pkg_name (str): name of the package whose dependents should be returned pkg_name (str): name of the package whose dependents should be returned
ideps (dict): dictionary of dependents, from inverted_dependencies() ideps (dict): dictionary of dependents, from inverted_dependencies()
transitive (bool, optional): return transitive dependents when True
""" """
if dependents is None: if dependents is None:
dependents = set() dependents = set()
@ -84,8 +88,9 @@ def get_dependents(pkg_name, ideps, dependents=None):
dependents.add(pkg_name) dependents.add(pkg_name)
direct = ideps[pkg_name] direct = ideps[pkg_name]
if transitive:
for dep_name in direct: for dep_name in direct:
get_dependents(dep_name, ideps, dependents) get_dependents(dep_name, ideps, transitive, dependents)
dependents.update(direct) dependents.update(direct)
return dependents return dependents
@ -109,7 +114,7 @@ def dependents(parser, args):
spec = specs[0] spec = specs[0]
ideps = inverted_dependencies() ideps = inverted_dependencies()
dependents = get_dependents(spec.name, ideps) dependents = get_dependents(spec.name, ideps, args.transitive)
dependents.remove(spec.name) dependents.remove(spec.name)
if dependents: if dependents:
colify(sorted(dependents)) colify(sorted(dependents))

View File

@ -711,11 +711,16 @@ def remove(self, spec):
return self._remove(spec) return self._remove(spec)
@_autospec @_autospec
def installed_dependents(self, spec): def installed_dependents(self, spec, transitive=True):
"""List the installed specs that depend on this one.""" """List the installed specs that depend on this one."""
dependents = set() dependents = set()
for spec in self.query(spec): for spec in self.query(spec):
for dependent in spec.traverse(direction='parents', root=False): if transitive:
to_add = spec.traverse(direction='parents', root=False)
else:
to_add = spec.dependents()
for dependent in to_add:
dependents.add(dependent) dependents.add(dependent)
return dependents return dependents