Remove spack.repo.PATH.is_virtual call from SpecBuildInterface.(#48984)

This PR is effectively a breaking change extracted from #45189, which removes 
support for spec["mpi"] if spec itself is openmpi / mpich that could provide mpi; 
from the Spec instance we don't have any parent it provides it to, 
hence it's a KeyError.
This commit is contained in:
Harmen Stoppels 2025-02-12 17:17:45 +01:00 committed by GitHub
parent 9a7a3d2743
commit 03e972314f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 18 additions and 17 deletions

View File

@ -209,7 +209,7 @@ def provides(self):
# All the other tokens in the hierarchy must be virtual dependencies # All the other tokens in the hierarchy must be virtual dependencies
for x in self.hierarchy_tokens: for x in self.hierarchy_tokens:
if self.spec.package.provides(x): if self.spec.package.provides(x):
provides[x] = self.spec[x] provides[x] = self.spec
return provides return provides
@property @property

View File

@ -1337,14 +1337,20 @@ class SpecBuildInterface(lang.ObjectWrapper):
"command", default_handler=_command_default_handler, _indirect=True "command", default_handler=_command_default_handler, _indirect=True
) )
def __init__(self, spec: "Spec", name: str, query_parameters: List[str], _parent: "Spec"): def __init__(
self,
spec: "Spec",
name: str,
query_parameters: List[str],
_parent: "Spec",
is_virtual: bool,
):
super().__init__(spec) super().__init__(spec)
# Adding new attributes goes after super() call since the ObjectWrapper # Adding new attributes goes after super() call since the ObjectWrapper
# resets __dict__ to behave like the passed object # resets __dict__ to behave like the passed object
original_spec = getattr(spec, "wrapped_obj", spec) original_spec = getattr(spec, "wrapped_obj", spec)
self.wrapped_obj = original_spec self.wrapped_obj = original_spec
self.token = original_spec, name, query_parameters, _parent self.token = original_spec, name, query_parameters, _parent, is_virtual
is_virtual = spack.repo.PATH.is_virtual(name)
self.last_query = QueryState( self.last_query = QueryState(
name=name, extra_parameters=query_parameters, isvirtual=is_virtual name=name, extra_parameters=query_parameters, isvirtual=is_virtual
) )
@ -3772,21 +3778,16 @@ def __getitem__(self, name: str):
# Consider runtime dependencies and direct build/test deps before transitive dependencies, # Consider runtime dependencies and direct build/test deps before transitive dependencies,
# and prefer matches closest to the root. # and prefer matches closest to the root.
try: try:
child: Spec = next( edge = next((e for e in order() if e.spec.name == name or name in e.virtuals))
e.spec
for e in itertools.chain(
(e for e in order() if e.spec.name == name or name in e.virtuals),
# for historical reasons
(e for e in order() if e.spec.concrete and e.spec.package.provides(name)),
)
)
except StopIteration: except StopIteration:
raise KeyError(f"No spec with name {name} in {self}") raise KeyError(f"No spec with name {name} in {self}")
if self._concrete: if self._concrete:
return SpecBuildInterface(child, name, query_parameters, _parent=self) return SpecBuildInterface(
edge.spec, name, query_parameters, _parent=self, is_virtual=name in edge.virtuals
)
return child return edge.spec
def __contains__(self, spec): def __contains__(self, spec):
"""True if this spec or some dependency satisfies the spec. """True if this spec or some dependency satisfies the spec.

View File

@ -1243,7 +1243,7 @@ def test_transitive_conditional_virtual_dependency(self, mutable_config):
def test_conditional_provides_or_depends_on(self): def test_conditional_provides_or_depends_on(self):
# Check that we can concretize correctly a spec that can either # Check that we can concretize correctly a spec that can either
# provide a virtual or depend on it based on the value of a variant # provide a virtual or depend on it based on the value of a variant
s = spack.concretize.concretize_one("conditional-provider +disable-v1") s = spack.concretize.concretize_one("v1-consumer ^conditional-provider +disable-v1")
assert "v1-provider" in s assert "v1-provider" in s
assert s["v1"].name == "v1-provider" assert s["v1"].name == "v1-provider"
assert s["v2"].name == "conditional-provider" assert s["v2"].name == "conditional-provider"

View File

@ -259,7 +259,7 @@ def test_develop(self):
def test_external_mpi(self): def test_external_mpi(self):
# make sure this doesn't give us an external first. # make sure this doesn't give us an external first.
spec = spack.concretize.concretize_one("mpi") spec = spack.concretize.concretize_one("mpi")
assert not spec["mpi"].external assert not spec.external and spec.package.provides("mpi")
# load config # load config
conf = syaml.load_config( conf = syaml.load_config(
@ -293,7 +293,7 @@ def mock_module(cmd, module):
monkeypatch.setattr(spack.util.module_cmd, "module", mock_module) monkeypatch.setattr(spack.util.module_cmd, "module", mock_module)
spec = spack.concretize.concretize_one("mpi") spec = spack.concretize.concretize_one("mpi")
assert not spec["mpi"].external assert not spec.external and spec.package.provides("mpi")
# load config # load config
conf = syaml.load_config( conf = syaml.load_config(