spack dependents lists possible dependencies by default.
This commit is contained in:
parent
bd94a17066
commit
6928cf7a68
@ -38,16 +38,22 @@
|
|||||||
|
|
||||||
def setup_parser(subparser):
|
def setup_parser(subparser):
|
||||||
subparser.add_argument(
|
subparser.add_argument(
|
||||||
'-a', '--all', action='store_true', default=False,
|
'-i', '--installed', action='store_true', default=False,
|
||||||
help="List all potential dependents of the package instead of actual "
|
help="List installed dependents of an installed spec, "
|
||||||
"dependents of an installed spec")
|
"instead of possible dependents of a package.")
|
||||||
subparser.add_argument(
|
subparser.add_argument(
|
||||||
'spec', nargs=argparse.REMAINDER,
|
'spec', nargs=argparse.REMAINDER,
|
||||||
help="specs to list dependencies of")
|
help="spec to list dependents for")
|
||||||
|
|
||||||
|
|
||||||
def inverted_dag():
|
def inverted_dependencies():
|
||||||
"""Returns inverted package DAG as adjacency lists."""
|
"""Iterate through all packages and return a dictionary mapping package
|
||||||
|
names to possible dependnecies.
|
||||||
|
|
||||||
|
Virtual packages are included as sources, so that you can query
|
||||||
|
dependents of, e.g., `mpi`, but virtuals are not included as
|
||||||
|
actual dependents.
|
||||||
|
"""
|
||||||
dag = {}
|
dag = {}
|
||||||
for pkg in spack.repo.all_packages():
|
for pkg in spack.repo.all_packages():
|
||||||
dag.setdefault(pkg.name, set())
|
dag.setdefault(pkg.name, set())
|
||||||
@ -56,24 +62,30 @@ def inverted_dag():
|
|||||||
|
|
||||||
# expand virtuals if necessary
|
# expand virtuals if necessary
|
||||||
if spack.repo.is_virtual(dep):
|
if spack.repo.is_virtual(dep):
|
||||||
deps = [s.name for s in spack.repo.providers_for(dep)]
|
deps += [s.name for s in spack.repo.providers_for(dep)]
|
||||||
|
|
||||||
for d in deps:
|
for d in deps:
|
||||||
dag.setdefault(d, set()).add(pkg.name)
|
dag.setdefault(d, set()).add(pkg.name)
|
||||||
return dag
|
return dag
|
||||||
|
|
||||||
|
|
||||||
def all_dependents(name, inverted_dag, dependents=None):
|
def get_dependents(pkg_name, ideps, dependents=None):
|
||||||
|
"""Get all dependents for a package.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
pkg_name (str): name of the package whose dependents should be returned
|
||||||
|
ideps (dict): dictionary of dependents, from inverted_dependencies()
|
||||||
|
"""
|
||||||
if dependents is None:
|
if dependents is None:
|
||||||
dependents = set()
|
dependents = set()
|
||||||
|
|
||||||
if name in dependents:
|
if pkg_name in dependents:
|
||||||
return set()
|
return set()
|
||||||
dependents.add(name)
|
dependents.add(pkg_name)
|
||||||
|
|
||||||
direct = inverted_dag[name]
|
direct = ideps[pkg_name]
|
||||||
for dname in direct:
|
for dep_name in direct:
|
||||||
all_dependents(dname, inverted_dag, dependents)
|
get_dependents(dep_name, ideps, dependents)
|
||||||
dependents.update(direct)
|
dependents.update(direct)
|
||||||
return dependents
|
return dependents
|
||||||
|
|
||||||
@ -83,18 +95,7 @@ def dependents(parser, args):
|
|||||||
if len(specs) != 1:
|
if len(specs) != 1:
|
||||||
tty.die("spack dependents takes only one spec.")
|
tty.die("spack dependents takes only one spec.")
|
||||||
|
|
||||||
if args.all:
|
if args.installed:
|
||||||
spec = specs[0]
|
|
||||||
idag = inverted_dag()
|
|
||||||
|
|
||||||
dependents = all_dependents(spec.name, idag)
|
|
||||||
dependents.remove(spec.name)
|
|
||||||
if dependents:
|
|
||||||
colify(sorted(dependents))
|
|
||||||
else:
|
|
||||||
print("No dependents")
|
|
||||||
|
|
||||||
else:
|
|
||||||
spec = spack.cmd.disambiguate_spec(specs[0])
|
spec = spack.cmd.disambiguate_spec(specs[0])
|
||||||
|
|
||||||
tty.msg("Dependents of %s" % spec.cformat('$_$@$%@$/'))
|
tty.msg("Dependents of %s" % spec.cformat('$_$@$%@$/'))
|
||||||
@ -103,3 +104,14 @@ def dependents(parser, args):
|
|||||||
spack.cmd.display_specs(deps)
|
spack.cmd.display_specs(deps)
|
||||||
else:
|
else:
|
||||||
print("No dependents")
|
print("No dependents")
|
||||||
|
|
||||||
|
else:
|
||||||
|
spec = specs[0]
|
||||||
|
ideps = inverted_dependencies()
|
||||||
|
|
||||||
|
dependents = get_dependents(spec.name, ideps)
|
||||||
|
dependents.remove(spec.name)
|
||||||
|
if dependents:
|
||||||
|
colify(sorted(dependents))
|
||||||
|
else:
|
||||||
|
print("No dependents")
|
||||||
|
Loading…
Reference in New Issue
Block a user