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