commit:     d3387bec035cd0ff15298893cbab3e756611a122
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jan 18 13:26:22 2023 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jan 18 13:26:22 2023 +0000
URL:        https://gitweb.gentoo.org/proj/gentoopm.git/commit/?id=d3387bec

repo: Support getting license groups

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

 gentoopm/basepm/repo.py  | 33 +++++++++++++++++++++++++++++++++
 gentoopm/basepm/stack.py | 10 +++++++++-
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/gentoopm/basepm/repo.py b/gentoopm/basepm/repo.py
index d10e81e..98d39ed 100644
--- a/gentoopm/basepm/repo.py
+++ b/gentoopm/basepm/repo.py
@@ -120,6 +120,14 @@ class LicenseDesc(typing.NamedTuple):
     name: str
 
 
+class LicenseGroup(typing.NamedTuple):
+    """License group"""
+
+    name: str
+    nested_groups: list[str]
+    licenses: list[str]
+
+
 class PMEbuildRepository(PMRepository, FillMissingComparisons):
     """
     Base abstract class for an ebuild repository (on livefs).
@@ -230,6 +238,31 @@ class PMEbuildRepository(PMRepository, 
FillMissingComparisons):
         except FileNotFoundError:
             return {}
 
+    @property
+    def license_groups(self) -> dict[str, LicenseGroup]:
+        """Get dict of license groups"""
+        def inner(f: typing.IO[str],
+                  ) -> typing.Generator[tuple[str, LicenseGroup], None, None]:
+            for line in f:
+                line = line.strip()
+                if not line or line[0] == "#":
+                    continue
+
+                group, *members = line.split()
+                yield (group,
+                       LicenseGroup(name=group,
+                                    nested_groups=[member[1:] for member
+                                                   in members
+                                                   if member.startswith("@")],
+                                    licenses=[member for member in members
+                                              if not member.startswith("@")]))
+
+        try:
+            with open(Path(self.path) / "profiles/license_groups", "r") as f:
+                return dict(inner(f))
+        except FileNotFoundError:
+            return {}
+
     @abstractmethod
     def __lt__(self, other):
         pass

diff --git a/gentoopm/basepm/stack.py b/gentoopm/basepm/stack.py
index 864af37..29bb345 100644
--- a/gentoopm/basepm/stack.py
+++ b/gentoopm/basepm/stack.py
@@ -4,7 +4,7 @@
 # Released under the terms of the 2-clause BSD license.
 
 from .repo import (PMRepository, GlobalUseFlag, UseExpand, ArchDesc,
-                   LicenseDesc,
+                   LicenseDesc, LicenseGroup,
                    )
 from .pkgset import PMPackageSet
 
@@ -57,6 +57,14 @@ class PMRepoStackWrapper(PMRepository):
             ret.update(r.licenses)
         return ret
 
+    @property
+    def license_groups(self) -> dict[str, LicenseGroup]:
+        """Get dict of license groups"""
+        ret = {}
+        for r in self._repos:
+            ret.update(r.license_groups)
+        return ret
+
 
 class PMFilteredStackPackageSet(PMPackageSet):
     """

Reply via email to