Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] find_smallest_cycle: don't merge satisfied PDEPEND too early
Date: Wed, 02 Dec 2020 08:33:44
Message-Id: 20201202083332.78037-1-zmedico@gentoo.org
1 After PDEPENDs have been neglected by the find_smallest_cycle function,
2 do not try to merge them too early if they are already satisfied by
3 an installed package. This fixes incorrect merge order for PDEPEND
4 cycles involving xorg-server and xorg-drivers, which was triggered
5 by commit 5095c2023595a75e2848f1ad3dbe25b5fb451a44 because it gave
6 PDEPEND higher priority than satisfied buildtime dependencies.
7
8 Fixes: 5095c2023595 ("find_smallest_cycle: enhance search prioritization")
9 Reported-by: josef64 in #gentoo-portage
10 Bug: https://bugs.gentoo.org/754903
11 Signed-off-by: Zac Medico <zmedico@g.o>
12 ---
13 lib/_emerge/DepPrioritySatisfiedRange.py | 1 +
14 lib/_emerge/depgraph.py | 8 +++---
15 .../tests/resolver/test_merge_order.py | 27 +++++++++++++++++--
16 3 files changed, 30 insertions(+), 6 deletions(-)
17
18 diff --git a/lib/_emerge/DepPrioritySatisfiedRange.py b/lib/_emerge/DepPrioritySatisfiedRange.py
19 index fb0d7db4e..f546590e0 100644
20 --- a/lib/_emerge/DepPrioritySatisfiedRange.py
21 +++ b/lib/_emerge/DepPrioritySatisfiedRange.py
22 @@ -93,6 +93,7 @@ class DepPrioritySatisfiedRange:
23 ignore_medium = _ignore_runtime
24 ignore_medium_soft = _ignore_satisfied_buildtime_slot_op
25 ignore_medium_post = _ignore_runtime_post
26 + ignore_medium_post_satisifed = _ignore_satisfied_runtime_post
27 ignore_soft = _ignore_optional
28
29
30 diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py
31 index 1271bda3e..0450291d4 100644
32 --- a/lib/_emerge/depgraph.py
33 +++ b/lib/_emerge/depgraph.py
34 @@ -8052,18 +8052,18 @@ class depgraph:
35 (selected_nodes[0],), noiselevel=-1)
36
37 if selected_nodes and ignore_priority is not None:
38 - # Try to merge ignored medium_post deps as soon as possible
39 + # Try to merge neglected medium_post deps as soon as possible
40 # if they're not satisfied by installed packages.
41 for node in selected_nodes:
42 children = set(mygraph.child_nodes(node))
43 - soft = children.difference(
44 + medium_post_satisifed = children.difference(
45 mygraph.child_nodes(node,
46 ignore_priority = \
47 - DepPrioritySatisfiedRange.ignore_soft))
48 + DepPrioritySatisfiedRange.ignore_medium_post_satisifed))
49 medium_post = children.difference(
50 mygraph.child_nodes(node,
51 ignore_priority=DepPrioritySatisfiedRange.ignore_medium_post))
52 - medium_post -= soft
53 + medium_post -= medium_post_satisifed
54 for child in medium_post:
55 if child in selected_nodes:
56 continue
57 diff --git a/lib/portage/tests/resolver/test_merge_order.py b/lib/portage/tests/resolver/test_merge_order.py
58 index f81fd2f6f..0510a0636 100644
59 --- a/lib/portage/tests/resolver/test_merge_order.py
60 +++ b/lib/portage/tests/resolver/test_merge_order.py
61 @@ -217,12 +217,23 @@ class MergeOrderTestCase(TestCase):
62 "IUSE" : "X +encode",
63 "RDEPEND" : "|| ( >=media-video/ffmpeg-0.6.90_rc0-r2[X=,encode=] >=media-video/libav-0.6.90_rc[X=,encode=] )",
64 },
65 + "x11-base/xorg-drivers-1.20-r2": {
66 + "EAPI": "7",
67 + "IUSE": "+video_cards_fbdev",
68 + "PDEPEND": "x11-base/xorg-server video_cards_fbdev? ( x11-drivers/xf86-video-fbdev )",
69 + },
70 "x11-base/xorg-server-1.14.1" : {
71 "EAPI" : "5",
72 "SLOT": "0/1.14.1",
73 "DEPEND" : "media-libs/mesa",
74 "RDEPEND" : "media-libs/mesa",
75 + "PDEPEND": "x11-base/xorg-drivers",
76 },
77 + "x11-drivers/xf86-video-fbdev-0.5.0-r1": {
78 + "EAPI": "7",
79 + "DEPEND": "x11-base/xorg-server:=",
80 + "RDEPEND": "x11-base/xorg-server",
81 + }
82 }
83
84 installed = {
85 @@ -299,12 +310,24 @@ class MergeOrderTestCase(TestCase):
86 "USE" : "encode",
87 "RDEPEND" : "|| ( >=media-video/ffmpeg-0.6.90_rc0-r2[X=,encode=] >=media-video/libav-0.6.90_rc[X=,encode=] )",
88 },
89 + "x11-base/xorg-drivers-1.20-r2": {
90 + "EAPI": "7",
91 + "IUSE": "+video_cards_fbdev",
92 + "USE": "video_cards_fbdev",
93 + "PDEPEND": "x11-base/xorg-server x11-drivers/xf86-video-fbdev",
94 + },
95 "x11-base/xorg-server-1.14.1" : {
96 "EAPI" : "5",
97 "SLOT": "0/1.14.1",
98 "DEPEND" : "media-libs/mesa",
99 "RDEPEND" : "media-libs/mesa",
100 + "PDEPEND": "x11-base/xorg-drivers",
101 },
102 + "x11-drivers/xf86-video-fbdev-0.5.0-r1": {
103 + "EAPI": "7",
104 + "DEPEND": "x11-base/xorg-server:0/1.14.1=",
105 + "RDEPEND": "x11-base/xorg-server",
106 + }
107 }
108
109 test_cases = (
110 @@ -486,10 +509,10 @@ class MergeOrderTestCase(TestCase):
111 # Both deps are already satisfied by installed packages, but
112 # the := dep is given higher priority in merge order.
113 ResolverPlaygroundTestCase(
114 - ["media-libs/mesa", "x11-base/xorg-server"],
115 + ["media-libs/mesa", "x11-drivers/xf86-video-fbdev", "x11-base/xorg-server"],
116 success=True,
117 all_permutations = True,
118 - mergelist = ['x11-base/xorg-server-1.14.1', 'media-libs/mesa-9.1.3']),
119 + mergelist = ['x11-base/xorg-server-1.14.1', 'media-libs/mesa-9.1.3', 'x11-drivers/xf86-video-fbdev-0.5.0-r1']),
120 # Test prioritization of the find_smallest_cycle function, which should
121 # minimize the use of installed packages to break cycles. If installed
122 # packages must be used to break cycles, then it should prefer to do this
123 --
124 2.26.2