bugfix for dot graphs of virtual packages.

This commit is contained in:
Todd Gamblin 2015-01-03 17:58:37 -08:00
parent 0a0291678e
commit b4b8339d0d
2 changed files with 17 additions and 11 deletions

View File

@ -39,7 +39,7 @@ def setup_parser(subparser):
'--dot', action='store_true', '--dot', action='store_true',
help="Generate graph in dot format and print to stdout.") help="Generate graph in dot format and print to stdout.")
method.add_argument( subparser.add_argument(
'--concretize', action='store_true', help="Concretize specs before graphing.") '--concretize', action='store_true', help="Concretize specs before graphing.")
subparser.add_argument( subparser.add_argument(

View File

@ -46,6 +46,7 @@
from llnl.util.tty.color import * from llnl.util.tty.color import *
import spack import spack
from spack.spec import Spec
def topological_sort(spec, **kwargs): def topological_sort(spec, **kwargs):
@ -455,23 +456,28 @@ def quote(string):
return '"%s"' % string return '"%s"' % string
if not specs: if not specs:
packages = spack.db.all_packages() specs = [p.name for p in spack.db.all_packages()]
else: else:
packages = [] roots = specs
for spec in specs: specs = set()
packages.extend(s.package for s in spec.normalized().traverse()) for spec in roots:
specs.update(Spec(s.name) for s in spec.normalized().traverse())
deps = [] deps = []
for pkg in packages: for spec in specs:
out.write(' %-30s [label="%s"]\n' % (quote(pkg.name), pkg.name)) out.write(' %-30s [label="%s"]\n' % (quote(spec.name), spec.name))
# Skip virtual specs (we'll find out about them from concrete ones.
if spec.virtual:
continue
# Add edges for each depends_on in the package. # Add edges for each depends_on in the package.
for dep_name, dep in pkg.dependencies.iteritems(): for dep_name, dep in spec.package.dependencies.iteritems():
deps.append((pkg.name, dep_name)) deps.append((spec.name, dep_name))
# If the package provides something, add an edge for that. # If the package provides something, add an edge for that.
for provider in set(p.name for p in pkg.provided): for provider in set(s.name for s in spec.package.provided):
deps.append((provider, pkg.name)) deps.append((provider, spec.name))
out.write('\n') out.write('\n')