1 |
Three new settings were added to /etc/portage/color.map: |
2 |
PKG_MERGE_USER_SET, PKG_BINARY_MERGE_USER_SET, and |
3 |
PKG_NOMERGE_USER_SET. These colors are applied when the package is |
4 |
selected from a set in /etc/portage/sets/ |
5 |
|
6 |
X-Gentoo-bug: 577720 |
7 |
X-Gentoo-bug-url: https://bugs.gentoo.org/show_bug.cgi?id=577720 |
8 |
--- |
9 |
|
10 |
[PATCH v5] Final touches. Almost there! |
11 |
[PATCH v4] Created one InternalPackageSet for each root |
12 |
[PATCH v3] Updates based on feedback from IRC meeting |
13 |
[PATCH v2] Simplification of check_sets ref Alexander Berntsen's feedback_ |
14 |
|
15 |
cnf/sets/portage.conf | 1 + |
16 |
doc/config/sets.docbook | 4 +++- |
17 |
man/color.map.5 | 11 ++++++++++ |
18 |
man/portage.5 | 1 + |
19 |
pym/_emerge/resolver/output.py | 25 +++++++++++++++------- |
20 |
pym/_emerge/resolver/output_helpers.py | 17 ++++++++++++--- |
21 |
pym/portage/_sets/__init__.py | 8 +++++++ |
22 |
pym/portage/_sets/base.py | 1 + |
23 |
pym/portage/output.py | 39 ++++++++++++++++++---------------- |
24 |
9 files changed, 77 insertions(+), 30 deletions(-) |
25 |
|
26 |
diff --git a/cnf/sets/portage.conf b/cnf/sets/portage.conf |
27 |
index ac282d9..e990620 100644 |
28 |
--- a/cnf/sets/portage.conf |
29 |
+++ b/cnf/sets/portage.conf |
30 |
@@ -49,6 +49,7 @@ class = portage.sets.files.StaticFileSet |
31 |
multiset = true |
32 |
directory = %(PORTAGE_CONFIGROOT)setc/portage/sets |
33 |
world-candidate = True |
34 |
+user-set = True |
35 |
|
36 |
# Set to rebuild all packages that need a preserved lib that only remains due |
37 |
# to FEATURES=preserve-libs |
38 |
diff --git a/doc/config/sets.docbook b/doc/config/sets.docbook |
39 |
index 749b775..02135d6 100644 |
40 |
--- a/doc/config/sets.docbook |
41 |
+++ b/doc/config/sets.docbook |
42 |
@@ -57,6 +57,8 @@ |
43 |
is missing)</para></listitem> |
44 |
<listitem><para><varname>world-candidate</varname>, which determines if |
45 |
given package should be added to the <varname>world</varname> set</para></listitem> |
46 |
+ <listitem><para><varname>user-set</varname>, which determines if |
47 |
+ given package should be colorized as a user set</para></listitem> |
48 |
</itemizedlist> |
49 |
<para> |
50 |
Some handler classes might require additional options for their configuration, |
51 |
@@ -93,7 +95,7 @@ |
52 |
but to indicate that the section should generate multiple sets it's |
53 |
also necessary to set the <varname>multiset</varname> option to |
54 |
<parameter>true</parameter>. The <varname>world-candidate</varname> |
55 |
- option also supported like with |
56 |
+ and <varname>user-set</varname> options are also supported like with |
57 |
single sets (they'll apply to all sets generated by the section). |
58 |
</para> |
59 |
<para> |
60 |
diff --git a/man/color.map.5 b/man/color.map.5 |
61 |
index 5543628..39f23f7 100644 |
62 |
--- a/man/color.map.5 |
63 |
+++ b/man/color.map.5 |
64 |
@@ -46,6 +46,9 @@ Defines color used for satisfied blockers. |
65 |
\fBPKG_MERGE\fR = \fI"darkgreen"\fR |
66 |
Defines color used for packages planned to be merged. |
67 |
.TP |
68 |
+\fBPKG_MERGE_USER_SET\fR = \fI"darkgreen"\fR |
69 |
+Defines color used for packages planned to be merged from a user defined set. |
70 |
+.TP |
71 |
\fBPKG_MERGE_SYSTEM\fR = \fI"darkgreen"\fR |
72 |
Defines color used for system packages planned to be merged. |
73 |
.TP |
74 |
@@ -55,6 +58,10 @@ Defines color used for world packages planned to be merged. |
75 |
\fBPKG_BINARY_MERGE\fR = \fI"purple"\fR |
76 |
Defines color used for packages planned to be merged using a binary package. |
77 |
.TP |
78 |
+\fBPKG_BINARY_MERGE_USER_SET\fR = \fI"purple"\fR |
79 |
+Defines color used for packages planned to be merged using a binary package |
80 |
+from a user defined set. |
81 |
+.TP |
82 |
\fBPKG_BINARY_MERGE_SYSTEM\fR = \fI"purple"\fR |
83 |
Defines color used for system packages planned to be merged using a binary |
84 |
package. |
85 |
@@ -66,6 +73,10 @@ package. |
86 |
\fBPKG_NOMERGE\fR = \fI"darkblue"\fR |
87 |
Defines color used for packages not planned to be merged. |
88 |
.TP |
89 |
+\fBPKG_NOMERGE_USER_SET\fR = \fI"darkblue"\fR |
90 |
+Defines color used for packages not planned to be merged from a user defined |
91 |
+set. |
92 |
+.TP |
93 |
\fBPKG_NOMERGE_SYSTEM\fR = \fI"darkblue"\fR |
94 |
Defines color used for system packages not planned to be merged. |
95 |
.TP |
96 |
diff --git a/man/portage.5 b/man/portage.5 |
97 |
index 7c2a8f7..3cc1f07 100644 |
98 |
--- a/man/portage.5 |
99 |
+++ b/man/portage.5 |
100 |
@@ -1114,6 +1114,7 @@ class = portage.sets.files.StaticFileSet |
101 |
multiset = true |
102 |
directory = %(PORTAGE_CONFIGROOT)setc/portage/sets |
103 |
world-candidate = True |
104 |
+user-set = True |
105 |
|
106 |
[module-rebuild] |
107 |
class = portage.sets.dbapi.OwnerSet |
108 |
diff --git a/pym/_emerge/resolver/output.py b/pym/_emerge/resolver/output.py |
109 |
index 400617d..7c70a3e 100644 |
110 |
--- a/pym/_emerge/resolver/output.py |
111 |
+++ b/pym/_emerge/resolver/output.py |
112 |
@@ -271,6 +271,8 @@ class Display(object): |
113 |
return colorize("PKG_BINARY_MERGE_SYSTEM", pkg_str) |
114 |
elif pkg_info.world: |
115 |
return colorize("PKG_BINARY_MERGE_WORLD", pkg_str) |
116 |
+ elif pkg_info.user_set: |
117 |
+ return colorize("PKG_BINARY_MERGE_USER_SET", pkg_str) |
118 |
else: |
119 |
return colorize("PKG_BINARY_MERGE", pkg_str) |
120 |
else: |
121 |
@@ -278,6 +280,8 @@ class Display(object): |
122 |
return colorize("PKG_MERGE_SYSTEM", pkg_str) |
123 |
elif pkg_info.world: |
124 |
return colorize("PKG_MERGE_WORLD", pkg_str) |
125 |
+ elif pkg_info.user_set: |
126 |
+ return colorize("PKG_MERGE_USER_SET", pkg_str) |
127 |
else: |
128 |
return colorize("PKG_MERGE", pkg_str) |
129 |
elif pkg_info.operation == "uninstall": |
130 |
@@ -287,6 +291,8 @@ class Display(object): |
131 |
return colorize("PKG_NOMERGE_SYSTEM", pkg_str) |
132 |
elif pkg_info.world: |
133 |
return colorize("PKG_NOMERGE_WORLD", pkg_str) |
134 |
+ elif pkg_info.user_set: |
135 |
+ return colorize("PKG_NOMERGE_USER_SET", pkg_str) |
136 |
else: |
137 |
return colorize("PKG_NOMERGE", pkg_str) |
138 |
|
139 |
@@ -699,18 +705,21 @@ class Display(object): |
140 |
return |
141 |
|
142 |
|
143 |
- def check_system_world(self, pkg): |
144 |
- """Checks for any occurances of the package in the system or world sets |
145 |
+ def check_sets(self, pkg): |
146 |
+ """Checks for any occurances of the package in portage sets |
147 |
|
148 |
@param pkg: _emerge.Package.Package instance |
149 |
- @rtype system and world booleans |
150 |
+ @rtype user_set, system, and world booleans |
151 |
""" |
152 |
root_config = self.conf.roots[pkg.root] |
153 |
system_set = root_config.sets["system"] |
154 |
world_set = root_config.sets["selected"] |
155 |
- system = False |
156 |
- world = False |
157 |
+ user_set = None |
158 |
+ system = None |
159 |
+ world = None |
160 |
try: |
161 |
+ user_set = self.conf.user_sets[pkg.root].findAtomForPackage( |
162 |
+ pkg, modified_use=self.conf.pkg_use_enabled(pkg)) |
163 |
system = system_set.findAtomForPackage( |
164 |
pkg, modified_use=self.conf.pkg_use_enabled(pkg)) |
165 |
world = world_set.findAtomForPackage( |
166 |
@@ -726,7 +735,7 @@ class Display(object): |
167 |
except InvalidDependString: |
168 |
# This is reported elsewhere if relevant. |
169 |
pass |
170 |
- return system, world |
171 |
+ return user_set, system, world |
172 |
|
173 |
|
174 |
@staticmethod |
175 |
@@ -863,8 +872,8 @@ class Display(object): |
176 |
self.oldlp = self.conf.columnwidth - 30 |
177 |
self.newlp = self.oldlp - 30 |
178 |
pkg_info.oldbest = self.convert_myoldbest(pkg, pkg_info) |
179 |
- pkg_info.system, pkg_info.world = \ |
180 |
- self.check_system_world(pkg) |
181 |
+ pkg_info.user_set, pkg_info.system, pkg_info.world = \ |
182 |
+ self.check_sets(pkg) |
183 |
if 'interactive' in pkg.properties and \ |
184 |
pkg.operation == 'merge': |
185 |
pkg_info.attr_display.interactive = True |
186 |
diff --git a/pym/_emerge/resolver/output_helpers.py b/pym/_emerge/resolver/output_helpers.py |
187 |
index 70f7bc0..f3b2abc 100644 |
188 |
--- a/pym/_emerge/resolver/output_helpers.py |
189 |
+++ b/pym/_emerge/resolver/output_helpers.py |
190 |
@@ -13,6 +13,7 @@ __all__ = ( |
191 |
import io |
192 |
import re |
193 |
import sys |
194 |
+from itertools import chain |
195 |
|
196 |
from portage import os |
197 |
from portage import _encodings, _unicode_encode |
198 |
@@ -213,6 +214,14 @@ class _DisplayConfig(object): |
199 |
self.running_root = frozen_config._running_root |
200 |
self.roots = frozen_config.roots |
201 |
|
202 |
+ # Create a single merged user set for each root |
203 |
+ self.user_sets = {} |
204 |
+ for root_name, root in self.roots.items(): |
205 |
+ self.user_sets[root_name] = InternalPackageSet(initial_atoms= \ |
206 |
+ chain.from_iterable(pkgset.getAtoms() \ |
207 |
+ for pkgset in root.sets.values() \ |
208 |
+ if pkgset.user_set)) |
209 |
+ |
210 |
self.blocker_parents = dynamic_config._blocker_parents |
211 |
self.reinstall_nodes = dynamic_config._reinstall_nodes |
212 |
self.digraph = dynamic_config.digraph |
213 |
@@ -596,7 +605,8 @@ class PkgInfo(object): |
214 |
__slots__ = ("attr_display", "built", "cp", |
215 |
"ebuild_path", "fetch_symbol", "merge", |
216 |
"oldbest", "oldbest_list", "operation", "ordered", "previous_pkg", |
217 |
- "repo_name", "repo_path_real", "slot", "sub_slot", "system", "use", "ver", "world") |
218 |
+ "repo_name", "repo_path_real", "user_set", "slot", "sub_slot", |
219 |
+ "system", "use", "ver", "world") |
220 |
|
221 |
|
222 |
def __init__(self): |
223 |
@@ -612,12 +622,13 @@ class PkgInfo(object): |
224 |
self.previous_pkg = None |
225 |
self.repo_path_real = '' |
226 |
self.repo_name = '' |
227 |
+ self.user_set = None |
228 |
self.slot = '' |
229 |
self.sub_slot = '' |
230 |
- self.system = False |
231 |
+ self.system = None |
232 |
self.use = '' |
233 |
self.ver = '' |
234 |
- self.world = False |
235 |
+ self.world = None |
236 |
self.attr_display = PkgAttrDisplay() |
237 |
|
238 |
class PkgAttrDisplay(SlotObject): |
239 |
diff --git a/pym/portage/_sets/__init__.py b/pym/portage/_sets/__init__.py |
240 |
index 91f9dd1..3203521 100644 |
241 |
--- a/pym/portage/_sets/__init__.py |
242 |
+++ b/pym/portage/_sets/__init__.py |
243 |
@@ -148,6 +148,7 @@ class SetConfig(object): |
244 |
parser.set("usersets", "multiset", "true") |
245 |
parser.set("usersets", "directory", "%(PORTAGE_CONFIGROOT)setc/portage/sets") |
246 |
parser.set("usersets", "world-candidate", "true") |
247 |
+ parser.set("usersets", "user-set", "true") |
248 |
|
249 |
parser.remove_section("live-rebuild") |
250 |
parser.add_section("live-rebuild") |
251 |
@@ -176,6 +177,7 @@ class SetConfig(object): |
252 |
if not setname in self.psets: |
253 |
options["name"] = setname |
254 |
options["world-candidate"] = "False" |
255 |
+ options["user-set"] = "False" |
256 |
|
257 |
# for the unlikely case that there is already a section with the requested setname |
258 |
import random |
259 |
@@ -244,6 +246,9 @@ class SetConfig(object): |
260 |
if parser.has_option(sname, "world-candidate") and \ |
261 |
parser.getboolean(sname, "world-candidate"): |
262 |
newsets[x].world_candidate = True |
263 |
+ if parser.has_option(sname, "user-set") and \ |
264 |
+ parser.getboolean(sname, "user-set"): |
265 |
+ newsets[x].user_set = True |
266 |
self.psets.update(newsets) |
267 |
else: |
268 |
self.errors.append(_("Section '%(section)s' is configured as multiset, but '%(class)s' " |
269 |
@@ -263,6 +268,9 @@ class SetConfig(object): |
270 |
if parser.has_option(sname, "world-candidate") and \ |
271 |
parser.getboolean(sname, "world-candidate"): |
272 |
self.psets[setname].world_candidate = True |
273 |
+ if parser.has_option(sname, "user-set") and \ |
274 |
+ parser.getboolean(sname, "user-set"): |
275 |
+ self.psets[setname].user_set = True |
276 |
except SetConfigError as e: |
277 |
self.errors.append(_("Configuration error in section '%s': %s") % (sname, str(e))) |
278 |
continue |
279 |
diff --git a/pym/portage/_sets/base.py b/pym/portage/_sets/base.py |
280 |
index ee20d36..7be9aab 100644 |
281 |
--- a/pym/portage/_sets/base.py |
282 |
+++ b/pym/portage/_sets/base.py |
283 |
@@ -28,6 +28,7 @@ class PackageSet(object): |
284 |
self.errors = [] |
285 |
self._nonatoms = set() |
286 |
self.world_candidate = False |
287 |
+ self.user_set = False |
288 |
self._allow_wildcard = allow_wildcard |
289 |
self._allow_repo = allow_repo |
290 |
|
291 |
diff --git a/pym/portage/output.py b/pym/portage/output.py |
292 |
index bb7542b..80c67e8 100644 |
293 |
--- a/pym/portage/output.py |
294 |
+++ b/pym/portage/output.py |
295 |
@@ -128,24 +128,27 @@ _styles["HILITE"] = ( "teal", ) |
296 |
_styles["BRACKET"] = ( "blue", ) |
297 |
|
298 |
# Portage functions |
299 |
-_styles["INFORM"] = ( "darkgreen", ) |
300 |
-_styles["UNMERGE_WARN"] = ( "red", ) |
301 |
-_styles["SECURITY_WARN"] = ( "red", ) |
302 |
-_styles["MERGE_LIST_PROGRESS"] = ( "yellow", ) |
303 |
-_styles["PKG_BLOCKER"] = ( "red", ) |
304 |
-_styles["PKG_BLOCKER_SATISFIED"] = ( "darkblue", ) |
305 |
-_styles["PKG_MERGE"] = ( "darkgreen", ) |
306 |
-_styles["PKG_MERGE_SYSTEM"] = ( "darkgreen", ) |
307 |
-_styles["PKG_MERGE_WORLD"] = ( "green", ) |
308 |
-_styles["PKG_BINARY_MERGE"] = ( "purple", ) |
309 |
-_styles["PKG_BINARY_MERGE_SYSTEM"] = ( "purple", ) |
310 |
-_styles["PKG_BINARY_MERGE_WORLD"] = ( "fuchsia", ) |
311 |
-_styles["PKG_UNINSTALL"] = ( "red", ) |
312 |
-_styles["PKG_NOMERGE"] = ( "darkblue", ) |
313 |
-_styles["PKG_NOMERGE_SYSTEM"] = ( "darkblue", ) |
314 |
-_styles["PKG_NOMERGE_WORLD"] = ( "blue", ) |
315 |
-_styles["PROMPT_CHOICE_DEFAULT"] = ( "green", ) |
316 |
-_styles["PROMPT_CHOICE_OTHER"] = ( "red", ) |
317 |
+_styles["INFORM"] = ( "darkgreen", ) |
318 |
+_styles["UNMERGE_WARN"] = ( "red", ) |
319 |
+_styles["SECURITY_WARN"] = ( "red", ) |
320 |
+_styles["MERGE_LIST_PROGRESS"] = ( "yellow", ) |
321 |
+_styles["PKG_BLOCKER"] = ( "red", ) |
322 |
+_styles["PKG_BLOCKER_SATISFIED"] = ( "darkblue", ) |
323 |
+_styles["PKG_MERGE"] = ( "darkgreen", ) |
324 |
+_styles["PKG_MERGE_USER_SET"] = ( "darkgreen", ) |
325 |
+_styles["PKG_MERGE_SYSTEM"] = ( "darkgreen", ) |
326 |
+_styles["PKG_MERGE_WORLD"] = ( "green", ) |
327 |
+_styles["PKG_BINARY_MERGE"] = ( "purple", ) |
328 |
+_styles["PKG_BINARY_MERGE_USER_SET"] = ( "purple", ) |
329 |
+_styles["PKG_BINARY_MERGE_SYSTEM"] = ( "purple", ) |
330 |
+_styles["PKG_BINARY_MERGE_WORLD"] = ( "fuchsia", ) |
331 |
+_styles["PKG_UNINSTALL"] = ( "red", ) |
332 |
+_styles["PKG_NOMERGE"] = ( "darkblue", ) |
333 |
+_styles["PKG_NOMERGE_USER_SET"] = ( "darkblue", ) |
334 |
+_styles["PKG_NOMERGE_SYSTEM"] = ( "darkblue", ) |
335 |
+_styles["PKG_NOMERGE_WORLD"] = ( "blue", ) |
336 |
+_styles["PROMPT_CHOICE_DEFAULT"] = ( "green", ) |
337 |
+_styles["PROMPT_CHOICE_OTHER"] = ( "red", ) |
338 |
|
339 |
def _parse_color_map(config_root='/', onerror=None): |
340 |
""" |
341 |
-- |
342 |
2.7.3 |