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