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 |