From 7c9c486d075e0a8d3d1a8cf5d8f29fafaf7b79c8 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 9 Aug 2020 15:33:31 -0700 Subject: deptypes: move deptype formatting code from Spec.format to dependency.py (#17843) - This simplifies Spec.format somewhat - Makes code to generate deptype strings (e.g., '[blrt]') reusable --- lib/spack/spack/dependency.py | 25 +++++++++++++++++++++++++ lib/spack/spack/spec.py | 16 ++++++---------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/lib/spack/spack/dependency.py b/lib/spack/spack/dependency.py index e6b6c9cedc..fe7d6b5983 100644 --- a/lib/spack/spack/dependency.py +++ b/lib/spack/spack/dependency.py @@ -17,6 +17,26 @@ all_deptypes = ('build', 'link', 'run', 'test') default_deptype = ('build', 'link') +def deptype_chars(*type_tuples): + """Create a string representing deptypes for many dependencies. + + The string will be some subset of 'blrt', like 'bl ', 'b t', or + ' lr ' where each letter in 'blrt' stands for 'build', 'link', + 'run', and 'test' (the dependency types). + + For a single dependency, this just indicates that the dependency has + the indicated deptypes. For a list of dependnecies, this shows + whether ANY dpeendency in the list has the deptypes (so the deptypes + are merged). + """ + types = set() + for t in type_tuples: + if t: + types.update(t) + + return ''.join(t[0] if t in types else ' ' for t in all_deptypes) + + def canonical_deptype(deptype): """Convert deptype to a canonical sorted tuple, or raise ValueError. @@ -108,3 +128,8 @@ class Dependency(object): self.patches[cond].extend(other.patches[cond]) else: self.patches[cond] = other.patches[cond] + + def __repr__(self): + types = deptype_chars(self.type) + return ' %s [%s]>' % ( + self.pkg.name, self.spec, types) diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 175d160855..227652168c 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -3877,22 +3877,18 @@ class Spec(object): '@K{%s} ', color=color) % node.dag_hash(hlen) if show_types: - types = set() if cover == 'nodes': # when only covering nodes, we merge dependency types # from all dependents before showing them. - for name, ds in node.dependents_dict().items(): - if ds.deptypes: - types.update(set(ds.deptypes)) - elif dep_spec.deptypes: + types = [ + ds.deptypes for ds in node.dependents_dict().values()] + else: # when covering edges or paths, we show dependency # types only for the edge through which we visited - types = set(dep_spec.deptypes) + types = [dep_spec.deptypes] - out += '[' - for t in dp.all_deptypes: - out += ''.join(t[0] if t in types else ' ') - out += '] ' + type_chars = dp.deptype_chars(*types) + out += '[%s] ' % type_chars out += (" " * d) if d > 0: -- cgit v1.2.3-70-g09d2