From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id B4E8359CB4 for ; Wed, 20 Apr 2016 01:40:49 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 6EB2421C012; Wed, 20 Apr 2016 01:40:44 +0000 (UTC) Received: from mail-ig0-f195.google.com (mail-ig0-f195.google.com [209.85.213.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id DAD7A21C00E for ; Wed, 20 Apr 2016 01:40:43 +0000 (UTC) Received: by mail-ig0-f195.google.com with SMTP id qu10so4751108igc.1 for ; Tue, 19 Apr 2016 18:40:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armills-info.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=ZBAxAGEmixLdOevNIpqlYJmGzi8JSDA8lZj9gG1C/6U=; b=htXijsze3jC+3J5irxqqvRSWrEl3yJjqMUj5/QaDBgiw3CobQAB7ceLhhaubLFFQol +E+IdB/MhaHmxiqPlIakIM2jK6ZHVanEX2W6CFAjJfsRu4oOusVMJ1tFNfBcUJd3rDRS DttAsEoz5h1P9Zg0y8E+06iOT026g/iphVdE/vFAs4V5v/i/d4CBTnkgBbS2wgfME/M6 5RRBI+wiB7JpPiw565im7+9kvv9yT6B50R5ghVZWMhzn5VAfmukjBUUR8Nv8pwWsXVdC FXxhOaSoJTMY6b+pFZCaCBLOB787h9ey3BGOiZPDTlAqcNEVtvaIWav2l9lSvMD6QJhq QFIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=ZBAxAGEmixLdOevNIpqlYJmGzi8JSDA8lZj9gG1C/6U=; b=DI6sCm0HmZOfStMzUqtojz7lFroGtuP1Ofq7oNGr2kjNGLo+c0k75NT44h8uyq5c+q o8PadG0s3Ik/Uj7ZTb90BOUZQScBTlVt1xFj8eqey/bP8LudrDzX8/a2cjofkWmeQ5Vq SIfxq8Gwb/NgapRSwVtq97Xym85zmZ/VxaucjWLZJQgokCPGDtWirHXapPWf5wBxd/nd oLtmRoY05G/aKbOtXx+Ulf2Si2ZkMLy+skBDvFQKax7rxGeHFwXVzonnfCnyJk3N2cfv WKrGMSVnjmU9i0JaejpqUSjb36j4EVn/o4foH1pGfLTVmKZ/mGkksoU8N7iFqXx78gTH CsHA== X-Gm-Message-State: AOPr4FUYrGXLWvcAn1Jaw7W/7xZCbAFEhoA4ViTj3AU/tD0m0eGLdUDzIBLWMLAW25u1gw== X-Received: by 10.50.56.114 with SMTP id z18mr576245igp.44.1461116442649; Tue, 19 Apr 2016 18:40:42 -0700 (PDT) Received: from localhost.localdomain (c-68-32-79-16.hsd1.mi.comcast.net. [68.32.79.16]) by smtp.gmail.com with ESMTPSA id u3sm3477581igq.15.2016.04.19.18.40.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 19 Apr 2016 18:40:41 -0700 (PDT) From: Adam Mills To: gentoo-portage-dev@lists.gentoo.org Cc: Adam Mills Subject: [gentoo-portage-dev] [PATCH v4] Colorize packages in user sets (bug 577720) Date: Tue, 19 Apr 2016 21:40:31 -0400 Message-Id: <1461116431-13632-1-git-send-email-adam@armills.info> X-Mailer: git-send-email 2.7.3 Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-portage-dev@lists.gentoo.org Reply-to: gentoo-portage-dev@lists.gentoo.org X-Archives-Salt: 9f0dad1e-32a4-4698-927b-3bfa9a70d797 X-Archives-Hash: c04949a61420003c29d37fb83ce7ddff Three new settings were added to /etc/portage/color.map: PKG_MERGE_USER_SET, PKG_BINARY_MERGE_USER_SET, and PKG_NOMERGE_USER_SET. These colors are applied when the package is selected from a set in /etc/portage/sets/ X-Gentoo-bug: 577720 X-Gentoo-bug-url: https://bugs.gentoo.org/show_bug.cgi?id=577720 --- [PATCH v4] Created one InternalPackageSet for each root [PATCH v3] Updates based on feedback from IRC meeting [PATCH v2] Simplification of check_sets ref Alexander Berntsen's feedback_ cnf/sets/portage.conf | 1 + doc/config/sets.docbook | 4 +++- man/color.map.5 | 11 ++++++++++ man/portage.5 | 1 + pym/_emerge/resolver/output.py | 25 +++++++++++++++------- pym/_emerge/resolver/output_helpers.py | 17 ++++++++++++--- pym/portage/_sets/__init__.py | 8 +++++++ pym/portage/_sets/base.py | 1 + pym/portage/output.py | 39 ++++++++++++++++++---------------- 9 files changed, 77 insertions(+), 30 deletions(-) diff --git a/cnf/sets/portage.conf b/cnf/sets/portage.conf index ac282d9..e990620 100644 --- a/cnf/sets/portage.conf +++ b/cnf/sets/portage.conf @@ -49,6 +49,7 @@ class = portage.sets.files.StaticFileSet multiset = true directory = %(PORTAGE_CONFIGROOT)setc/portage/sets world-candidate = True +user-set = True # Set to rebuild all packages that need a preserved lib that only remains due # to FEATURES=preserve-libs diff --git a/doc/config/sets.docbook b/doc/config/sets.docbook index 749b775..02135d6 100644 --- a/doc/config/sets.docbook +++ b/doc/config/sets.docbook @@ -57,6 +57,8 @@ is missing) world-candidate, which determines if given package should be added to the world set + user-set, which determines if + given package should be colorized as a user set Some handler classes might require additional options for their configuration, @@ -93,7 +95,7 @@ but to indicate that the section should generate multiple sets it's also necessary to set the multiset option to true. The world-candidate - option also supported like with + and user-set options are also supported like with single sets (they'll apply to all sets generated by the section). diff --git a/man/color.map.5 b/man/color.map.5 index 5543628..39f23f7 100644 --- a/man/color.map.5 +++ b/man/color.map.5 @@ -46,6 +46,9 @@ Defines color used for satisfied blockers. \fBPKG_MERGE\fR = \fI"darkgreen"\fR Defines color used for packages planned to be merged. .TP +\fBPKG_MERGE_USER_SET\fR = \fI"darkgreen"\fR +Defines color used for packages planned to be merged from a user defined set. +.TP \fBPKG_MERGE_SYSTEM\fR = \fI"darkgreen"\fR Defines color used for system packages planned to be merged. .TP @@ -55,6 +58,10 @@ Defines color used for world packages planned to be merged. \fBPKG_BINARY_MERGE\fR = \fI"purple"\fR Defines color used for packages planned to be merged using a binary package. .TP +\fBPKG_BINARY_MERGE_USER_SET\fR = \fI"purple"\fR +Defines color used for packages planned to be merged using a binary package +from a user defined set. +.TP \fBPKG_BINARY_MERGE_SYSTEM\fR = \fI"purple"\fR Defines color used for system packages planned to be merged using a binary package. @@ -66,6 +73,10 @@ package. \fBPKG_NOMERGE\fR = \fI"darkblue"\fR Defines color used for packages not planned to be merged. .TP +\fBPKG_NOMERGE_USER_SET\fR = \fI"darkblue"\fR +Defines color used for packages not planned to be merged from a user defined +set. +.TP \fBPKG_NOMERGE_SYSTEM\fR = \fI"darkblue"\fR Defines color used for system packages not planned to be merged. .TP diff --git a/man/portage.5 b/man/portage.5 index 7c2a8f7..3cc1f07 100644 --- a/man/portage.5 +++ b/man/portage.5 @@ -1114,6 +1114,7 @@ class = portage.sets.files.StaticFileSet multiset = true directory = %(PORTAGE_CONFIGROOT)setc/portage/sets world-candidate = True +user-set = True [module-rebuild] class = portage.sets.dbapi.OwnerSet diff --git a/pym/_emerge/resolver/output.py b/pym/_emerge/resolver/output.py index 400617d..7c70a3e 100644 --- a/pym/_emerge/resolver/output.py +++ b/pym/_emerge/resolver/output.py @@ -271,6 +271,8 @@ class Display(object): return colorize("PKG_BINARY_MERGE_SYSTEM", pkg_str) elif pkg_info.world: return colorize("PKG_BINARY_MERGE_WORLD", pkg_str) + elif pkg_info.user_set: + return colorize("PKG_BINARY_MERGE_USER_SET", pkg_str) else: return colorize("PKG_BINARY_MERGE", pkg_str) else: @@ -278,6 +280,8 @@ class Display(object): return colorize("PKG_MERGE_SYSTEM", pkg_str) elif pkg_info.world: return colorize("PKG_MERGE_WORLD", pkg_str) + elif pkg_info.user_set: + return colorize("PKG_MERGE_USER_SET", pkg_str) else: return colorize("PKG_MERGE", pkg_str) elif pkg_info.operation == "uninstall": @@ -287,6 +291,8 @@ class Display(object): return colorize("PKG_NOMERGE_SYSTEM", pkg_str) elif pkg_info.world: return colorize("PKG_NOMERGE_WORLD", pkg_str) + elif pkg_info.user_set: + return colorize("PKG_NOMERGE_USER_SET", pkg_str) else: return colorize("PKG_NOMERGE", pkg_str) @@ -699,18 +705,21 @@ class Display(object): return - def check_system_world(self, pkg): - """Checks for any occurances of the package in the system or world sets + def check_sets(self, pkg): + """Checks for any occurances of the package in portage sets @param pkg: _emerge.Package.Package instance - @rtype system and world booleans + @rtype user_set, system, and world booleans """ root_config = self.conf.roots[pkg.root] system_set = root_config.sets["system"] world_set = root_config.sets["selected"] - system = False - world = False + user_set = None + system = None + world = None try: + user_set = self.conf.user_sets[pkg.root].findAtomForPackage( + pkg, modified_use=self.conf.pkg_use_enabled(pkg)) system = system_set.findAtomForPackage( pkg, modified_use=self.conf.pkg_use_enabled(pkg)) world = world_set.findAtomForPackage( @@ -726,7 +735,7 @@ class Display(object): except InvalidDependString: # This is reported elsewhere if relevant. pass - return system, world + return user_set, system, world @staticmethod @@ -863,8 +872,8 @@ class Display(object): self.oldlp = self.conf.columnwidth - 30 self.newlp = self.oldlp - 30 pkg_info.oldbest = self.convert_myoldbest(pkg, pkg_info) - pkg_info.system, pkg_info.world = \ - self.check_system_world(pkg) + pkg_info.user_set, pkg_info.system, pkg_info.world = \ + self.check_sets(pkg) if 'interactive' in pkg.properties and \ pkg.operation == 'merge': pkg_info.attr_display.interactive = True diff --git a/pym/_emerge/resolver/output_helpers.py b/pym/_emerge/resolver/output_helpers.py index 70f7bc0..33ef83c 100644 --- a/pym/_emerge/resolver/output_helpers.py +++ b/pym/_emerge/resolver/output_helpers.py @@ -13,6 +13,7 @@ __all__ = ( import io import re import sys +from itertools import chain from portage import os from portage import _encodings, _unicode_encode @@ -213,6 +214,14 @@ class _DisplayConfig(object): self.running_root = frozen_config._running_root self.roots = frozen_config.roots + # Create a single merged user set for each root + self.user_sets = {} + for root_name, root in self.roots.items(): + self.user_sets[root_name] = InternalPackageSet(initial_atoms= \ + chain.from_iterable(pkgset.getAtoms() \ + for pkgset_name, pkgset in root.sets.items() \ + if pkgset.user_set)) + self.blocker_parents = dynamic_config._blocker_parents self.reinstall_nodes = dynamic_config._reinstall_nodes self.digraph = dynamic_config.digraph @@ -596,7 +605,8 @@ class PkgInfo(object): __slots__ = ("attr_display", "built", "cp", "ebuild_path", "fetch_symbol", "merge", "oldbest", "oldbest_list", "operation", "ordered", "previous_pkg", - "repo_name", "repo_path_real", "slot", "sub_slot", "system", "use", "ver", "world") + "repo_name", "repo_path_real", "user_set", "slot", "sub_slot", + "system", "use", "ver", "world") def __init__(self): @@ -612,12 +622,13 @@ class PkgInfo(object): self.previous_pkg = None self.repo_path_real = '' self.repo_name = '' + self.user_set = None self.slot = '' self.sub_slot = '' - self.system = False + self.system = None self.use = '' self.ver = '' - self.world = False + self.world = None self.attr_display = PkgAttrDisplay() class PkgAttrDisplay(SlotObject): diff --git a/pym/portage/_sets/__init__.py b/pym/portage/_sets/__init__.py index 91f9dd1..3203521 100644 --- a/pym/portage/_sets/__init__.py +++ b/pym/portage/_sets/__init__.py @@ -148,6 +148,7 @@ class SetConfig(object): parser.set("usersets", "multiset", "true") parser.set("usersets", "directory", "%(PORTAGE_CONFIGROOT)setc/portage/sets") parser.set("usersets", "world-candidate", "true") + parser.set("usersets", "user-set", "true") parser.remove_section("live-rebuild") parser.add_section("live-rebuild") @@ -176,6 +177,7 @@ class SetConfig(object): if not setname in self.psets: options["name"] = setname options["world-candidate"] = "False" + options["user-set"] = "False" # for the unlikely case that there is already a section with the requested setname import random @@ -244,6 +246,9 @@ class SetConfig(object): if parser.has_option(sname, "world-candidate") and \ parser.getboolean(sname, "world-candidate"): newsets[x].world_candidate = True + if parser.has_option(sname, "user-set") and \ + parser.getboolean(sname, "user-set"): + newsets[x].user_set = True self.psets.update(newsets) else: self.errors.append(_("Section '%(section)s' is configured as multiset, but '%(class)s' " @@ -263,6 +268,9 @@ class SetConfig(object): if parser.has_option(sname, "world-candidate") and \ parser.getboolean(sname, "world-candidate"): self.psets[setname].world_candidate = True + if parser.has_option(sname, "user-set") and \ + parser.getboolean(sname, "user-set"): + self.psets[setname].user_set = True except SetConfigError as e: self.errors.append(_("Configuration error in section '%s': %s") % (sname, str(e))) continue diff --git a/pym/portage/_sets/base.py b/pym/portage/_sets/base.py index ee20d36..7be9aab 100644 --- a/pym/portage/_sets/base.py +++ b/pym/portage/_sets/base.py @@ -28,6 +28,7 @@ class PackageSet(object): self.errors = [] self._nonatoms = set() self.world_candidate = False + self.user_set = False self._allow_wildcard = allow_wildcard self._allow_repo = allow_repo diff --git a/pym/portage/output.py b/pym/portage/output.py index bb7542b..80c67e8 100644 --- a/pym/portage/output.py +++ b/pym/portage/output.py @@ -128,24 +128,27 @@ _styles["HILITE"] = ( "teal", ) _styles["BRACKET"] = ( "blue", ) # Portage functions -_styles["INFORM"] = ( "darkgreen", ) -_styles["UNMERGE_WARN"] = ( "red", ) -_styles["SECURITY_WARN"] = ( "red", ) -_styles["MERGE_LIST_PROGRESS"] = ( "yellow", ) -_styles["PKG_BLOCKER"] = ( "red", ) -_styles["PKG_BLOCKER_SATISFIED"] = ( "darkblue", ) -_styles["PKG_MERGE"] = ( "darkgreen", ) -_styles["PKG_MERGE_SYSTEM"] = ( "darkgreen", ) -_styles["PKG_MERGE_WORLD"] = ( "green", ) -_styles["PKG_BINARY_MERGE"] = ( "purple", ) -_styles["PKG_BINARY_MERGE_SYSTEM"] = ( "purple", ) -_styles["PKG_BINARY_MERGE_WORLD"] = ( "fuchsia", ) -_styles["PKG_UNINSTALL"] = ( "red", ) -_styles["PKG_NOMERGE"] = ( "darkblue", ) -_styles["PKG_NOMERGE_SYSTEM"] = ( "darkblue", ) -_styles["PKG_NOMERGE_WORLD"] = ( "blue", ) -_styles["PROMPT_CHOICE_DEFAULT"] = ( "green", ) -_styles["PROMPT_CHOICE_OTHER"] = ( "red", ) +_styles["INFORM"] = ( "darkgreen", ) +_styles["UNMERGE_WARN"] = ( "red", ) +_styles["SECURITY_WARN"] = ( "red", ) +_styles["MERGE_LIST_PROGRESS"] = ( "yellow", ) +_styles["PKG_BLOCKER"] = ( "red", ) +_styles["PKG_BLOCKER_SATISFIED"] = ( "darkblue", ) +_styles["PKG_MERGE"] = ( "darkgreen", ) +_styles["PKG_MERGE_USER_SET"] = ( "darkgreen", ) +_styles["PKG_MERGE_SYSTEM"] = ( "darkgreen", ) +_styles["PKG_MERGE_WORLD"] = ( "green", ) +_styles["PKG_BINARY_MERGE"] = ( "purple", ) +_styles["PKG_BINARY_MERGE_USER_SET"] = ( "purple", ) +_styles["PKG_BINARY_MERGE_SYSTEM"] = ( "purple", ) +_styles["PKG_BINARY_MERGE_WORLD"] = ( "fuchsia", ) +_styles["PKG_UNINSTALL"] = ( "red", ) +_styles["PKG_NOMERGE"] = ( "darkblue", ) +_styles["PKG_NOMERGE_USER_SET"] = ( "darkblue", ) +_styles["PKG_NOMERGE_SYSTEM"] = ( "darkblue", ) +_styles["PKG_NOMERGE_WORLD"] = ( "blue", ) +_styles["PROMPT_CHOICE_DEFAULT"] = ( "green", ) +_styles["PROMPT_CHOICE_OTHER"] = ( "red", ) def _parse_color_map(config_root='/', onerror=None): """ -- 2.7.3