Fix spack graph when deptypes are filtered (#22121)

This commit is contained in:
Harmen Stoppels 2021-03-09 01:47:00 +01:00 committed by GitHub
parent ccc7ed0af9
commit 1659beb220
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 84 additions and 8 deletions

View File

@ -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])]

View File

@ -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()

View File

@ -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']

View File

@ -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')

View File

@ -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')

View File

@ -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')