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