concretize.lp: fix issue with reuse of conditional variants (#43676)
Currently if you request pkg +example where example is a conditional variant, and you have a pkg in the database for which the condition did not hold (so no +example nor ~example), the solver would reuse it regardless, not imposing +example. The change rules out exactly one thing: variant_set without variant_value, which in practice could only happen when not node_has_variant (i.e. when under the current package.py rules the variant's when condition did not trigger).
This commit is contained in:
parent
9a6c013365
commit
9ff5a30574
2 changed files with 18 additions and 6 deletions
|
@ -891,12 +891,8 @@ error(100, "{0} variant '{1}' cannot have values '{2}' and '{3}' as they come fr
|
||||||
Set1 < Set2, % see[1]
|
Set1 < Set2, % see[1]
|
||||||
build(node(ID, Package)).
|
build(node(ID, Package)).
|
||||||
|
|
||||||
% variant_set is an explicitly set variant value. If it's not 'set',
|
:- attr("variant_set", node(ID, Package), Variant, Value),
|
||||||
% we revert to the default value. If it is set, we force the set value
|
not attr("variant_value", node(ID, Package), Variant, Value).
|
||||||
attr("variant_value", PackageNode, Variant, Value)
|
|
||||||
:- attr("node", PackageNode),
|
|
||||||
node_has_variant(PackageNode, Variant),
|
|
||||||
attr("variant_set", PackageNode, Variant, Value).
|
|
||||||
|
|
||||||
% The rules below allow us to prefer default values for variants
|
% The rules below allow us to prefer default values for variants
|
||||||
% whenever possible. If a variant is set in a spec, or if it is
|
% whenever possible. If a variant is set in a spec, or if it is
|
||||||
|
|
|
@ -1350,6 +1350,22 @@ def test_reuse_installed_packages_when_package_def_changes(
|
||||||
# Structure and package hash will be different without reuse
|
# Structure and package hash will be different without reuse
|
||||||
assert root.dag_hash() != new_root_without_reuse.dag_hash()
|
assert root.dag_hash() != new_root_without_reuse.dag_hash()
|
||||||
|
|
||||||
|
@pytest.mark.only_clingo("Use case not supported by the original concretizer")
|
||||||
|
@pytest.mark.regression("43663")
|
||||||
|
def test_no_reuse_when_variant_condition_does_not_hold(self, mutable_database, mock_packages):
|
||||||
|
spack.config.set("concretizer:reuse", True)
|
||||||
|
|
||||||
|
# Install a spec for which the `version_based` variant condition does not hold
|
||||||
|
old = Spec("conditional-variant-pkg @1").concretized()
|
||||||
|
old.package.do_install(fake=True, explicit=True)
|
||||||
|
|
||||||
|
# Then explicitly require a spec with `+version_based`, which shouldn't reuse previous spec
|
||||||
|
new1 = Spec("conditional-variant-pkg +version_based").concretized()
|
||||||
|
assert new1.satisfies("@2 +version_based")
|
||||||
|
|
||||||
|
new2 = Spec("conditional-variant-pkg +two_whens").concretized()
|
||||||
|
assert new2.satisfies("@2 +two_whens +version_based")
|
||||||
|
|
||||||
@pytest.mark.only_clingo("Use case not supported by the original concretizer")
|
@pytest.mark.only_clingo("Use case not supported by the original concretizer")
|
||||||
def test_reuse_with_flags(self, mutable_database, mutable_config):
|
def test_reuse_with_flags(self, mutable_database, mutable_config):
|
||||||
spack.config.set("concretizer:reuse", True)
|
spack.config.set("concretizer:reuse", True)
|
||||||
|
|
Loading…
Reference in a new issue