ASP-based solver: fix for unsplittable providers (#40859)
Some providers must provide virtuals "together", i.e. if they provide one virtual of a set, they must be the providers also of the others. There was a bug though, where we were not checking if the other virtuals in the set were needed at all in the DAG. This commit fixes the bug.
This commit is contained in:

committed by
GitHub

parent
3082ce6a22
commit
db16335aec
@@ -492,7 +492,9 @@ error(100, "Package '{0}' needs to provide both '{1}' and '{2}' together, but pr
|
||||
pkg_fact(Package, provided_together(ID, SetID, Virtual2)),
|
||||
Virtual1 != Virtual2,
|
||||
attr("virtual_on_incoming_edges", node(X, Package), Virtual1),
|
||||
not attr("virtual_on_incoming_edges", node(X, Package), Virtual2).
|
||||
not attr("virtual_on_incoming_edges", node(X, Package), Virtual2),
|
||||
attr("virtual_node", node(_, Virtual1)),
|
||||
attr("virtual_node", node(_, Virtual2)).
|
||||
|
||||
% if a package depends on a virtual, it's not external and we have a
|
||||
% provider for that virtual then it depends on the provider
|
||||
|
@@ -2360,3 +2360,16 @@ def test_condition_triggered_by_edge_property(
|
||||
|
||||
for not_expected in expected_not_satisfies:
|
||||
assert not s.satisfies(not_expected), str(not_expected)
|
||||
|
||||
def test_virtuals_provided_together_but_only_one_required_in_dag(self):
|
||||
"""Tests that we can use a provider that provides more than one virtual together,
|
||||
and is providing only one, iff the others are not needed in the DAG.
|
||||
|
||||
o blas-only-client
|
||||
| [virtual=blas]
|
||||
o openblas (provides blas and lapack together)
|
||||
|
||||
"""
|
||||
s = Spec("blas-only-client ^openblas").concretized()
|
||||
assert s.satisfies("^[virtuals=blas] openblas")
|
||||
assert not s.satisfies("^[virtuals=blas,lapack] openblas")
|
||||
|
Reference in New Issue
Block a user