commit:     58d0b46877dc0bd307b0b2766a74a530d13555f2
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Tue Jan 17 17:44:41 2023 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Tue Jan 17 17:44:41 2023 +0000
URL:        https://gitweb.gentoo.org/proj/gentoopm.git/commit/?id=58d0b468

repo: Support getting a dict of USE_EXPAND

The API is a bit weird because it needs to combine profile context
(USE_EXPAND* variables) and repo context (profiles/desc).  I've figured
out it fits more cleanly in the repo context because of the latter.

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 gentoopm/basepm/repo.py    | 44 +++++++++++++++++++++++++++++++++++++++++++-
 gentoopm/pkgcorepm/repo.py | 30 +++++++++++++++++++++++++++++-
 gentoopm/portagepm/repo.py | 31 +++++++++++++++++++++++++++++--
 3 files changed, 101 insertions(+), 4 deletions(-)

diff --git a/gentoopm/basepm/repo.py b/gentoopm/basepm/repo.py
index 4a15e51..ccc6dc5 100644
--- a/gentoopm/basepm/repo.py
+++ b/gentoopm/basepm/repo.py
@@ -85,7 +85,25 @@ class GlobalUseFlag(typing.NamedTuple):
     """Global USE flag (as defined by use.desc)"""
 
     name: str
-    description: str
+    description: typing.Optional[str]
+
+
+class UseExpand(typing.NamedTuple):
+    """USE_EXPAND group"""
+
+    name: str
+    prefixed: bool
+    visible: bool
+    values: dict[str, GlobalUseFlag]
+
+    @property
+    def prefixed_values(self) -> dict[str, GlobalUseFlag]:
+        return {
+            f"{self.name.lower()}_{flag}":
+            GlobalUseFlag(f"{self.name.lower()}_{flag}",
+                          details.description)
+            for flag, details in self.values.items()
+        }
 
 
 class PMEbuildRepository(PMRepository, FillMissingComparisons):
@@ -134,6 +152,30 @@ class PMEbuildRepository(PMRepository, 
FillMissingComparisons):
         except FileNotFoundError:
             return {}
 
+    def _use_expand_desc(self, k: str) -> dict[str, GlobalUseFlag]:
+        """Read USE_EXPAND descriptions for given key"""
+
+        filename = k.lower() + ".desc"
+        try:
+            with open(Path(self.path) / "profiles/desc" / filename, "r") as f:
+                def inner() -> typing.Generator[tuple[str, str], None, None]:
+                    for line in f:
+                        line = line.strip()
+                        if not line or line[0] == "#":
+                            continue
+                        name, desc = line.split(" - ", 1)
+                        yield (name, desc)
+                return {
+                    name: GlobalUseFlag(name, desc) for name, desc in inner()
+                }
+
+        except FileNotFoundError:
+            return {}
+
+    @abstractproperty
+    def use_expand(self) -> dict[str, UseExpand]:
+        """Get dict of USE_EXPAND groups"""
+
     @abstractmethod
     def __lt__(self, other):
         pass

diff --git a/gentoopm/pkgcorepm/repo.py b/gentoopm/pkgcorepm/repo.py
index bd2c7b1..257c4bc 100644
--- a/gentoopm/pkgcorepm/repo.py
+++ b/gentoopm/pkgcorepm/repo.py
@@ -3,6 +3,9 @@
 # (c) 2017-2021 Michał Górny <[email protected]>
 # Released under the terms of the 2-clause BSD license.
 
+import itertools
+import typing
+
 from abc import abstractproperty
 
 import pkgcore.restrictions.boolean as br
@@ -13,7 +16,7 @@ except ImportError:
     from pkgcore.ebuild.repository import _UnconfiguredTree as UnconfiguredTree
 
 from ..basepm.repo import (PMRepository, PMRepositoryDict, PMEbuildRepository,
-                           GlobalUseFlag,
+                           GlobalUseFlag, UseExpand,
                            )
 from ..util import FillMissingComparisons
 
@@ -113,6 +116,7 @@ class PkgCoreEbuildRepo(PkgCoreRepository, 
PMEbuildRepository, FillMissingCompar
 
     def __init__(self, repo_obj, domain, index):
         PkgCoreRepository.__init__(self, repo_obj, domain)
+        self._domain = domain
         self._index = index
 
     @property
@@ -129,6 +133,30 @@ class PkgCoreEbuildRepo(PkgCoreRepository, 
PMEbuildRepository, FillMissingCompar
             k: GlobalUseFlag(k, v) for _, (k, v) in self._repo.config.use_desc
         }
 
+    @property
+    def use_expand(self) -> dict[str, UseExpand]:
+        def inner() -> typing.Generator[tuple[str, UseExpand], None, None]:
+            prefixed = self._domain.profile.use_expand
+            unprefixed = self._domain.profile.use_expand_unprefixed
+            hidden = self._domain.profile.use_expand_hidden
+
+            for k in itertools.chain(prefixed, unprefixed):
+                values = {}
+                for flag in (self._domain.profile.default_env
+                             .get("USE_EXPAND_VALUES_" + k, "").split()):
+                    values[flag] = GlobalUseFlag(flag, None)
+                for flag, desc in (self._repo.use_expand_desc
+                                   .get(k.lower(), [])):
+                    if k not in unprefixed:
+                        flag = flag[len(k)+1:]
+                    values[flag] = GlobalUseFlag(flag, desc)
+
+                yield (k, UseExpand(name=k,
+                                    prefixed=k not in unprefixed,
+                                    visible=k not in hidden,
+                                    values=values))
+        return dict(inner())
+
     def __lt__(self, other):
         return other._index < self._index
 

diff --git a/gentoopm/portagepm/repo.py b/gentoopm/portagepm/repo.py
index bb5ec3b..e829487 100644
--- a/gentoopm/portagepm/repo.py
+++ b/gentoopm/portagepm/repo.py
@@ -1,15 +1,20 @@
 #!/usr/bin/python
 #      vim:fileencoding=utf-8
-# (c) 2011 Michał Górny <[email protected]>
+# (c) 2011-2023 Michał Górny <[email protected]>
 # Released under the terms of the 2-clause BSD license.
 
+import itertools
 import os.path
+import typing
+
 from abc import abstractproperty
 
 import portage.exception as pe
 from portage.versions import catsplit
 
-from ..basepm.repo import PMRepositoryDict, PMEbuildRepository, PMRepository
+from ..basepm.repo import (PMRepositoryDict, PMEbuildRepository, PMRepository,
+                           UseExpand, GlobalUseFlag,
+                           )
 from ..util import FillMissingComparisons
 
 from .atom import PortageAtom, CompletePortageAtom
@@ -198,6 +203,28 @@ class PortageRepository(PortDBRepository, 
PMEbuildRepository, FillMissingCompari
     def path(self):
         return self._repo.location
 
+    @property
+    def use_expand(self) -> dict[str, UseExpand]:
+        def inner() -> typing.Generator[tuple[str, UseExpand], None, None]:
+            def getconf(k: str) -> list[str]:
+                return self._dbapi.settings.get(k, "").split()
+
+            prefixed = getconf("USE_EXPAND")
+            unprefixed = getconf("USE_EXPAND_UNPREFIXED")
+            hidden = getconf("USE_EXPAND_HIDDEN")
+
+            for k in itertools.chain(prefixed, unprefixed):
+                values = {}
+                for flag in getconf("USE_EXPAND_VALUES_" + k):
+                    values[flag] = GlobalUseFlag(flag, None)
+                values.update(self._use_expand_desc(k))
+
+                yield (k, UseExpand(name=k,
+                                    prefixed=k not in unprefixed,
+                                    visible=k not in hidden,
+                                    values=values))
+        return dict(inner())
+
     def __lt__(self, other):
         return self._repo.priority < other._repo.priority
 

Reply via email to