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 v4] Colorize packages in user sets (bug 577720)
Date: Wed, 20 Apr 2016 01:40:49
Message-Id: 1461116431-13632-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 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

Replies