Only consider the shared solvables in transactions to determine newest

If a module is being built and buildrequires a module that was built
with no requires once and multiple requires the second time, we need
MBS to pick the second build as a buildrequire. This change makes it
so that only the same buildrequires are considered.
This commit is contained in:
mprahl
2020-07-02 17:55:31 -04:00
parent d6c42882aa
commit ad15f4931d
2 changed files with 92 additions and 1 deletions

View File

@@ -556,6 +556,7 @@ class MMDResolver(object):
# We will check all the alternatives and keep just the "first" one.
for transactions in alternatives.values():
min_trans_length = min(len(t) for t in transactions.values())
for ns, trans in transactions.items():
# Each transaction in trans lists all the possible working
# combination of solvables. Our goal here is to find out the
@@ -585,7 +586,10 @@ class MMDResolver(object):
index = self.solvables[name_stream].index(s)
idx.append(index)
sorted_trans.append([i, idx])
sorted_trans.sort(key=lambda i: sum(i[1]))
# Sort the list of indexes of solvables only based on the shared common length
# so that only the shared solvables for each transaction are considered for which
# is newest
sorted_trans.sort(key=lambda x: sum(x[1][:min_trans_length]))
if sorted_trans:
transactions[ns] = [trans[sorted_trans[0][0]]]

View File

@@ -142,6 +142,93 @@ class TestMMDResolver:
assert expanded == expected
def test_solve_reproduce_rhelbld_1665(self):
modules = (
("python27:2.7:8010020190903182548:51c94b97", [
{
"buildrequires": {"platform": ["el8.1.0"]},
"requires": {"platform": ["el8"]},
},
]),
("python27:2.7:8030020200617145106:851f4228", [
{
"buildrequires": {"platform": ["el8.3.0"]},
"requires": {"platform": ["el8"]},
},
]),
("python36:3.6:8030020200515150628:24f1489c", [
{
"buildrequires": {"platform": ["el8.3.0"]},
"requires": {"platform": ["el8"]},
},
]),
("python36:3.6:8010020190724083915:a920e634", [
{
"buildrequires": {"platform": ["el8.1.0"]},
"requires": {"platform": ["el8"]},
},
]),
("platform:el8.1.0:2:00000000", []),
("flatpak-runtime:el8:8030020200604154928:73699f59", [
{
"buildrequires": {
"platform": ["el8.3.0"],
"python27": ["2.7"],
"python36": ["3.6"],
},
"requires": {
"platform": ["el8"],
"python27": ["2.7"],
"python36": ["3.6"],
},
},
]),
("flatpak-runtime:el8:8010020190926143916:cdc1202b", [
{
"buildrequires": {"platform": ["el8.1.0"]},
"requires": {"platform": ["el8"]},
},
]),
("platform:el8.3.0:2:00000000", []),
)
for nsvc, deps in modules:
if nsvc.startswith("platform"):
xmd = {"mbs": {"buildrequires": {}, "virtual_streams": ["el8"]}}
else:
platform_stream = deps[0]["buildrequires"]["platform"][0]
xmd = {"mbs": {"buildrequires": {"platform": platform_stream}}}
mmd = make_module(nsvc, dependencies=deps, xmd=xmd)
self.mmd_resolver.add_modules(mmd)
dependencies = [{
"buildrequires": {
"platform": ["el8.3.0"],
"flatpak-runtime": ["el8"],
},
"requires": {
"platform": ["el8"],
"flatpak-runtime": ["el8"],
}
}]
inkscape = make_module("inkscape:1:0", dependencies=dependencies)
expanded = self.mmd_resolver.solve(inkscape)
expected = set(
[
frozenset(
[
"flatpak-runtime:el8:8030020200604154928:73699f59:x86_64",
"inkscape:1:0:0:src",
"platform:el8.3.0:2:00000000:x86_64",
"python27:2.7:8010020190903182548:51c94b97:x86_64",
"python36:3.6:8010020190724083915:a920e634:x86_64",
],
),
],
)
assert expanded == expected
@pytest.mark.parametrize(
"dependencies, expected",
(