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