summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHarmen Stoppels <harmenstoppels@gmail.com>2021-03-09 01:47:00 +0100
committerGitHub <noreply@github.com>2021-03-08 16:47:00 -0800
commit1659beb220bde672ff50a47af934e8ba3b7323e5 (patch)
tree8e6d2e5e981a254d2ca822c0879d180187767a0c /lib
parentccc7ed0af9c9f7f0a5c503f97ce41bfaa0ca1631 (diff)
downloadspack-1659beb220bde672ff50a47af934e8ba3b7323e5.tar.gz
spack-1659beb220bde672ff50a47af934e8ba3b7323e5.tar.bz2
spack-1659beb220bde672ff50a47af934e8ba3b7323e5.tar.xz
spack-1659beb220bde672ff50a47af934e8ba3b7323e5.zip
Fix `spack graph` when deptypes are filtered (#22121)
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/graph.py13
-rw-r--r--lib/spack/spack/test/directory_layout.py2
-rw-r--r--lib/spack/spack/test/graph.py9
3 files changed, 16 insertions, 8 deletions
diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py
index 2ddc10ac7a..87ad51e030 100644
--- a/lib/spack/spack/graph.py
+++ b/lib/spack/spack/graph.py
@@ -62,17 +62,16 @@ def topological_sort(spec, reverse=False, deptype='all'):
"""
deptype = canonical_deptype(deptype)
- if not reverse:
- parents = lambda s: s.dependents()
- children = lambda s: s.dependencies()
- else:
- parents = lambda s: s.dependencies()
- children = lambda s: s.dependents()
-
# Work on a copy so this is nondestructive.
spec = spec.copy(deps=deptype)
nodes = spec.index(deptype=deptype)
+ parents = lambda s: [p for p in s.dependents() if p.name in nodes]
+ children = lambda s: s.dependencies()
+
+ if reverse:
+ parents, children = children, parents
+
topo_order = []
par = dict((name, parents(nodes[name])) for name in nodes.keys())
remaining = [name for name in nodes.keys() if not parents(nodes[name])]
diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py
index 04e42549d6..73446714ba 100644
--- a/lib/spack/spack/test/directory_layout.py
+++ b/lib/spack/spack/test/directory_layout.py
@@ -120,7 +120,7 @@ def test_read_and_write_spec(temporary_store, config, mock_packages):
# TODO: fix this when we can concretize more loosely based on
# TODO: what is installed. We currently omit these to
# TODO: increase reuse of build dependencies.
- stored_deptypes = ('link', 'run')
+ stored_deptypes = spack.hash_types.full_hash
expected = spec.copy(deps=stored_deptypes)
expected._mark_concrete()
diff --git a/lib/spack/spack/test/graph.py b/lib/spack/spack/test/graph.py
index 9242cd2717..76c9524728 100644
--- a/lib/spack/spack/test/graph.py
+++ b/lib/spack/spack/test/graph.py
@@ -122,3 +122,12 @@ o dyninst
|/
o libelf
'''
+
+
+def test_topo_sort_filtered(mock_packages):
+ """Test topo sort gives correct order when filtering link deps."""
+ s = Spec('both-link-and-build-dep-a').normalized()
+
+ topo = topological_sort(s, deptype=('link',))
+
+ assert topo == ['both-link-and-build-dep-a', 'both-link-and-build-dep-c']