commit:     c33468ba1d8ddd5a69516e8a39796db8de08ff63
Author:     Oskari Pirhonen <xxc3ncoredxx <AT> gmail <DOT> com>
AuthorDate: Wed Jun  8 05:51:35 2022 +0000
Commit:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Sat Jul  9 02:40:24 2022 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=c33468ba

Add -f/--forced-masked to equery uses

Option to include forced and masked USE flags in `equery uses` output.

- Marked with F / M in verbose/normal output
- Marked with (+flag) / (-flag) in non-verbose/piped output

Signed-off-by: Oskari Pirhonen <xxc3ncoredxx <AT> gmail.com>
Signed-off-by: Brian Dolbec <dolsen <AT> gentoo.org>

 pym/gentoolkit/equery/uses.py | 62 ++++++++++++++++++++++++++++++++++---------
 pym/gentoolkit/flag.py        | 36 +++++++++++++++++++------
 2 files changed, 77 insertions(+), 21 deletions(-)

diff --git a/pym/gentoolkit/equery/uses.py b/pym/gentoolkit/equery/uses.py
index 7c90b90..7af7f43 100644
--- a/pym/gentoolkit/equery/uses.py
+++ b/pym/gentoolkit/equery/uses.py
@@ -31,7 +31,11 @@ from gentoolkit.flag import get_flags, reduce_flags
 # Globals
 # =======
 
-QUERY_OPTS = {"all_versions": False, "ignore_l10n": False}
+QUERY_OPTS = {
+    "all_versions": False,
+    "forced_masked": False,
+    "ignore_l10n": False,
+}
 
 # =========
 # Functions
@@ -56,6 +60,7 @@ def print_help(with_description=True):
             (
                 (" -h, --help", "display this help message"),
                 (" -a, --all", "include all package versions"),
+                (" -f, --forced-masked", "include forced/masked USE flags"),
                 (" -i, --ignore-l10n", "don't show l10n USE flags"),
             )
         )
@@ -67,8 +72,14 @@ def display_useflags(output):
 
     @type output: list
     @param output: [(inuse, inused, flag, desc, restrict), ...]
-            inuse (int) = 0 or 1; if 1, flag is set in make.conf
-            inused (int) = 0 or 1; if 1, package is installed with flag enabled
+            inuse (int) = 0, 1, 2, 3;
+                    if 1, flag is set in make.conf;
+                    if 2, flag is masked;
+                    if 3, flag is forced
+            inused (int) = 0, 1, 2, 3;
+                    if 1, package is installed with flag enabled;
+                    if 2, flag is masked;
+                    if 3, flag is forced
             flag (str) = the name of the USE flag
             desc (str) = the flag's description
             restrict (str) = corresponds to the text of restrict in metadata
@@ -80,7 +91,8 @@ def display_useflags(output):
     twrap.width = CONFIG["termWidth"]
     twrap.subsequent_indent = " " * (maxflag_len + 8)
 
-    markers = ("-", "+")
+    markers = ("-", "+", "M", "F")
+    # Colors for masked/forced = unset/set (mod 2)
     color = (partial(pp.useflag, enabled=False), partial(pp.useflag, 
enabled=True))
     for in_makeconf, in_installed, flag, desc, restrict in output:
         if CONFIG["verbose"]:
@@ -92,7 +104,7 @@ def display_useflags(output):
             else:
                 flag_name += " %s %s" % (markers[in_makeconf], 
markers[in_installed])
 
-            flag_name += " " + color[in_makeconf](flag.ljust(maxflag_len))
+            flag_name += " " + color[in_makeconf % 2](flag.ljust(maxflag_len))
             flag_name += " : "
 
             # Strip initial whitespace at the start of the description
@@ -119,7 +131,11 @@ def display_useflags(output):
                     twrap.initial_indent = flag_name
                     print(twrap.fill("<unknown>"))
         else:
-            pp.uprint(markers[in_makeconf] + flag)
+            # Match emerge -v output for forced/masked flags
+            if in_makeconf > 1:
+                pp.uprint("(" + markers[in_makeconf % 2] + flag + ")")
+            else:
+                pp.uprint(markers[in_makeconf] + flag)
 
 
 def get_global_useflags():
@@ -184,7 +200,16 @@ def get_output_descriptions(pkg, global_usedesc):
     else:
         local_usedesc = pkg.metadata.use()
 
-    iuse, final_use = get_flags(pkg.cpv, final_setting=True)
+    useforced = []
+    usemasked = []
+    if QUERY_OPTS["forced_masked"]:
+        iuse, final_use, useforced, usemasked = get_flags(
+            pkg.cpv, final_setting=True, include_forced_masked=True
+        )
+    else:
+        iuse, final_use = get_flags(
+            pkg.cpv, final_setting=True, include_forced_masked=False
+        )
     usevar = reduce_flags(iuse)
     usevar.sort()
 
@@ -202,8 +227,8 @@ def get_output_descriptions(pkg, global_usedesc):
     # store (inuse, inused, flag, desc, restrict)
     output = []
     for flag in usevar:
-        inuse = False
-        inused = False
+        inuse = 0
+        inused = 0
 
         local_use = None
         for use in local_usedesc:
@@ -226,9 +251,18 @@ def get_output_descriptions(pkg, global_usedesc):
             restrict = ""
 
         if flag in final_use:
-            inuse = True
+            inuse = 1
+            if flag in useforced:
+                inuse = 3
+        elif flag in usemasked:
+            inuse = 2
+
         if flag in used_flags:
-            inused = True
+            inused = 1
+            if flag in useforced:
+                inused = 3
+        elif flag in usemasked:
+            inused = 2
 
         output.append((inuse, inused, flag, desc, restrict))
 
@@ -245,6 +279,8 @@ def parse_module_options(module_opts):
             sys.exit(0)
         elif opt in ("-a", "--all"):
             QUERY_OPTS["all_versions"] = True
+        elif opt in ("-f", "--forced-masked"):
+            QUERY_OPTS["forced_masked"] = True
         elif opt in ("-i", "--ignore-l10n"):
             QUERY_OPTS["ignore_l10n"] = True
 
@@ -263,8 +299,8 @@ def print_legend():
 def main(input_args):
     """Parse input and run the program"""
 
-    short_opts = "hai"
-    long_opts = ("help", "all", "ignore-l10n")
+    short_opts = "hafi"
+    long_opts = ("help", "all", "forced-masked", "ignore-l10n")
 
     try:
         module_opts, queries = gnu_getopt(input_args, short_opts, long_opts)

diff --git a/pym/gentoolkit/flag.py b/pym/gentoolkit/flag.py
index 20ba855..478eb6d 100644
--- a/pym/gentoolkit/flag.py
+++ b/pym/gentoolkit/flag.py
@@ -163,7 +163,7 @@ def get_all_cpv_use(cpv):
     return use, use_expand_hidden, usemask, useforce
 
 
-def get_flags(cpv, final_setting=False):
+def get_flags(cpv, final_setting=False, include_forced_masked=False):
     """Retrieves all information needed to filter out hidded, masked, etc.
     USE flags for a given package.
 
@@ -172,12 +172,32 @@ def get_flags(cpv, final_setting=False):
     @type final_setting: boolean
     @param final_setting: used to also determine the final
             enviroment USE flag settings and return them as well.
-    @rtype: list or list, list
-    @return IUSE or IUSE, final_flags
+    @type include_forced_masked: boolean
+    @param include_forced_masked: used to toggle the inclusion of forced and
+            masked USE flags in the returned result.
+    @rtype: list
+            or list, list
+            or list, list, list
+            or list, list, list, list
+    @return IUSE
+            or IUSE, final_flags
+            or IUSE, useforced, usemasked
+            or IUSE, final_flags, useforced, usemasked
     """
     final_use, use_expand_hidden, usemasked, useforced = get_all_cpv_use(cpv)
-    iuse_flags = filter_flags(get_iuse(cpv), use_expand_hidden, usemasked, 
useforced)
-    if final_setting:
-        final_flags = filter_flags(final_use, use_expand_hidden, usemasked, 
useforced)
-        return iuse_flags, final_flags
-    return iuse_flags
+    if include_forced_masked:
+        iuse_flags = filter_flags(get_iuse(cpv), use_expand_hidden, [], [])
+        if final_setting:
+            final_flags = filter_flags(final_use, use_expand_hidden, [], [])
+            return iuse_flags, final_flags, useforced, usemasked
+        return iuse_flags, useforced, usemasked
+    else:
+        iuse_flags = filter_flags(
+            get_iuse(cpv), use_expand_hidden, usemasked, useforced
+        )
+        if final_setting:
+            final_flags = filter_flags(
+                final_use, use_expand_hidden, usemasked, useforced
+            )
+            return iuse_flags, final_flags
+        return iuse_flags

Reply via email to