Fix spack graph
when deptypes are filtered (#22121)
This commit is contained in:
parent
ccc7ed0af9
commit
1659beb220
@ -62,17 +62,16 @@ def topological_sort(spec, reverse=False, deptype='all'):
|
|||||||
"""
|
"""
|
||||||
deptype = canonical_deptype(deptype)
|
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.
|
# Work on a copy so this is nondestructive.
|
||||||
spec = spec.copy(deps=deptype)
|
spec = spec.copy(deps=deptype)
|
||||||
nodes = spec.index(deptype=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 = []
|
topo_order = []
|
||||||
par = dict((name, parents(nodes[name])) for name in nodes.keys())
|
par = dict((name, parents(nodes[name])) for name in nodes.keys())
|
||||||
remaining = [name for name in nodes.keys() if not parents(nodes[name])]
|
remaining = [name for name in nodes.keys() if not parents(nodes[name])]
|
||||||
|
@ -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: fix this when we can concretize more loosely based on
|
||||||
# TODO: what is installed. We currently omit these to
|
# TODO: what is installed. We currently omit these to
|
||||||
# TODO: increase reuse of build dependencies.
|
# TODO: increase reuse of build dependencies.
|
||||||
stored_deptypes = ('link', 'run')
|
stored_deptypes = spack.hash_types.full_hash
|
||||||
expected = spec.copy(deps=stored_deptypes)
|
expected = spec.copy(deps=stored_deptypes)
|
||||||
expected._mark_concrete()
|
expected._mark_concrete()
|
||||||
|
|
||||||
|
@ -122,3 +122,12 @@ def test_ascii_graph_mpileaks(mock_packages):
|
|||||||
|/
|
|/
|
||||||
o libelf
|
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']
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
from spack import *
|
||||||
|
|
||||||
|
|
||||||
|
class BothLinkAndBuildDepA(Package):
|
||||||
|
"""
|
||||||
|
Structure where c occurs as a build dep down the line and as a direct
|
||||||
|
link dep. Useful for testing situations where you copy the parent spec
|
||||||
|
just with link deps, and you want to make sure b is not part of that.
|
||||||
|
a <--build-- b <-link-- c
|
||||||
|
a <--link--- c
|
||||||
|
"""
|
||||||
|
|
||||||
|
homepage = "http://www.example.com"
|
||||||
|
url = "http://www.example.com/1.0.tar.gz"
|
||||||
|
|
||||||
|
version('1.0', '0123456789abcdef0123456789abcdef')
|
||||||
|
|
||||||
|
depends_on('both-link-and-build-dep-b', type='build')
|
||||||
|
depends_on('both-link-and-build-dep-c', type='link')
|
@ -0,0 +1,23 @@
|
|||||||
|
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
from spack import *
|
||||||
|
|
||||||
|
|
||||||
|
class BothLinkAndBuildDepB(Package):
|
||||||
|
"""
|
||||||
|
Structure where c occurs as a build dep down the line and as a direct
|
||||||
|
link dep. Useful for testing situations where you copy the parent spec
|
||||||
|
just with link deps, and you want to make sure b is not part of that.
|
||||||
|
a <--build-- b <-link-- c
|
||||||
|
a <--link--- c
|
||||||
|
"""
|
||||||
|
|
||||||
|
homepage = "http://www.example.com"
|
||||||
|
url = "http://www.example.com/1.0.tar.gz"
|
||||||
|
|
||||||
|
version('1.0', '0123456789abcdef0123456789abcdef')
|
||||||
|
|
||||||
|
depends_on('both-link-and-build-dep-c', type='link')
|
@ -0,0 +1,21 @@
|
|||||||
|
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
from spack import *
|
||||||
|
|
||||||
|
|
||||||
|
class BothLinkAndBuildDepC(Package):
|
||||||
|
"""
|
||||||
|
Structure where c occurs as a build dep down the line and as a direct
|
||||||
|
link dep. Useful for testing situations where you copy the parent spec
|
||||||
|
just with link deps, and you want to make sure b is not part of that.
|
||||||
|
a <--build-- b <-link-- c
|
||||||
|
a <--link--- c
|
||||||
|
"""
|
||||||
|
|
||||||
|
homepage = "http://www.example.com"
|
||||||
|
url = "http://www.example.com/1.0.tar.gz"
|
||||||
|
|
||||||
|
version('1.0', '0123456789abcdef0123456789abcdef')
|
Loading…
Reference in New Issue
Block a user