blob: 0487d3ac988e1e554b9ff11f80f81f2717bd6f9e [file] [log] [blame]
# Copyright 1999-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
import collections
from itertools import chain
from portage.output import red
from portage.util import cmp_sort_key
from portage.output import blue
class UseFlagDisplay:
__slots__ = ("name", "enabled", "forced")
def __init__(self, name, enabled, forced):
self.name = name
self.enabled = enabled
self.forced = forced
def __str__(self):
s = self.name
if self.enabled:
s = red(s)
else:
s = "-" + s
s = blue(s)
if self.forced:
s = "(%s)" % s
return s
def _cmp_combined(a, b):
"""
Sort by name, combining enabled and disabled flags.
"""
return (a.name > b.name) - (a.name < b.name)
sort_combined = cmp_sort_key(_cmp_combined)
del _cmp_combined
def _cmp_separated(a, b):
"""
Sort by name, separating enabled flags from disabled flags.
"""
enabled_diff = b.enabled - a.enabled
if enabled_diff:
return enabled_diff
return (a.name > b.name) - (a.name < b.name)
sort_separated = cmp_sort_key(_cmp_separated)
del _cmp_separated
_flag_info = collections.namedtuple("_flag_info", ("flag", "display"))
def pkg_use_display(pkg, opts, modified_use=None):
settings = pkg.root_config.settings
use_expand = pkg.use.expand
use_expand_hidden = pkg.use.expand_hidden
alphabetical_use = "--alphabetical" in opts
forced_flags = set(chain(pkg.use.force, pkg.use.mask))
if modified_use is None:
use = set(pkg.use.enabled)
else:
use = set(modified_use)
use.discard(settings.get("ARCH"))
use_expand_flags = set()
use_enabled = {}
use_disabled = {}
for varname in use_expand:
flag_prefix = varname.lower() + "_"
for f in use:
if f.startswith(flag_prefix):
use_expand_flags.add(f)
use_enabled.setdefault(varname.upper(), []).append(
_flag_info(f, f[len(flag_prefix) :])
)
for f in pkg.iuse.all:
if f.startswith(flag_prefix):
use_expand_flags.add(f)
if f not in use:
use_disabled.setdefault(varname.upper(), []).append(
_flag_info(f, f[len(flag_prefix) :])
)
var_order = set(use_enabled)
var_order.update(use_disabled)
var_order = sorted(var_order)
var_order.insert(0, "USE")
use.difference_update(use_expand_flags)
use_enabled["USE"] = list(_flag_info(f, f) for f in use)
use_disabled["USE"] = []
for f in pkg.iuse.all:
if f not in use and f not in use_expand_flags:
use_disabled["USE"].append(_flag_info(f, f))
flag_displays = []
for varname in var_order:
if varname.lower() in use_expand_hidden:
continue
flags = []
for f in use_enabled.get(varname, []):
flags.append(UseFlagDisplay(f.display, True, f.flag in forced_flags))
for f in use_disabled.get(varname, []):
flags.append(UseFlagDisplay(f.display, False, f.flag in forced_flags))
if alphabetical_use:
flags.sort(key=UseFlagDisplay.sort_combined)
else:
flags.sort(key=UseFlagDisplay.sort_separated)
flag_displays.append(
'%s="%s"' % (varname, " ".join("%s" % (f,) for f in flags))
)
return " ".join(flag_displays)