Gentoo Archives: gentoo-portage-dev

From: Adam Mills <adam@×××××××.info>
To: gentoo-portage-dev@l.g.o
Cc: Adam Mills <adam@×××××××.info>
Subject: [gentoo-portage-dev] [PATCH v5] Colorize packages in user sets (bug 577720)
Date: Wed, 20 Apr 2016 12:56:02
Message-Id: 1461156925-29612-1-git-send-email-adam@armills.info
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

Replies