aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Zamarin <arthurzam@gentoo.org>2023-08-28 20:43:08 +0300
committerArthur Zamarin <arthurzam@gentoo.org>2023-08-28 20:43:08 +0300
commitd00711f2d6cbae14a57088ef78caa3daf72069aa (patch)
treec57987668a3db7bfe48e9c46ff51d474d4aeab8c
parentoperations.format.fetch_base: fix for when no proxy (diff)
downloadpkgcore-d00711f2d6cbae14a57088ef78caa3daf72069aa.tar.gz
pkgcore-d00711f2d6cbae14a57088ef78caa3daf72069aa.tar.bz2
pkgcore-d00711f2d6cbae14a57088ef78caa3daf72069aa.zip
ebuild.repository: add support for stabilization groups
This is a special metadata files that can be used to group packages for stabilization bugs. Resolves: https://github.com/pkgcore/pkgcore/issues/411 Signed-off-by: Arthur Zamarin <arthurzam@gentoo.org>
-rw-r--r--src/pkgcore/ebuild/repository.py24
-rw-r--r--tests/ebuild/test_repository.py25
2 files changed, 49 insertions, 0 deletions
diff --git a/src/pkgcore/ebuild/repository.py b/src/pkgcore/ebuild/repository.py
index 164aa0c97..50f115cc1 100644
--- a/src/pkgcore/ebuild/repository.py
+++ b/src/pkgcore/ebuild/repository.py
@@ -16,6 +16,7 @@ from snakeoil import chksum, klass
from snakeoil.bash import read_dict
from snakeoil.containers import InvertedContains
from snakeoil.data_source import local_source
+from snakeoil.fileutils import readlines_utf8
from snakeoil.mappings import ImmutableDict
from snakeoil.obj import make_kls
from snakeoil.osutils import listdir_dirs, listdir_files, pjoin
@@ -34,7 +35,9 @@ from ..restrictions import packages
from ..util import packages as pkgutils
from . import cpv, digest, ebd, ebuild_src
from . import eclass_cache as eclass_cache_mod
+from . import errors as ebuild_errors
from . import processor, repo_objs, restricts
+from .atom import atom
from .eapi import get_eapi
@@ -670,6 +673,27 @@ class UnconfiguredTree(prototype.tree):
pkg_deprecated.update(repo.config.pkg_deprecated)
return packages.OrRestriction(*pkg_deprecated)
+ @klass.jit_attr
+ def stabilization_groups(self):
+ """Return a mapping of stabilization groups to packages."""
+ stabilization_groups = {}
+ base_dir = pjoin(self.location, "metadata", "stabilization-groups")
+ for dirname, _dirs, files in os.walk(base_dir):
+ dirbase = dirname.removeprefix(base_dir)
+ for file in files:
+ pkgs = set()
+ for lineno, line in enumerate(readlines_utf8(pjoin(dirname, file)), 1):
+ try:
+ if line := line.split("#", maxsplit=1)[0].strip():
+ pkgs.add(atom(line))
+ except ebuild_errors.MalformedAtom as exc:
+ logger.error(
+ f"{dirname.removeprefix(self.location)}/{file}, line {lineno}: parsing error: {exc}"
+ )
+ group = f"{dirbase}/{file}".removeprefix("/")
+ stabilization_groups[group] = frozenset(pkgs)
+ return ImmutableDict(stabilization_groups)
+
def _regen_operation_helper(self, **kwds):
return _RegenOpHelper(
self,
diff --git a/tests/ebuild/test_repository.py b/tests/ebuild/test_repository.py
index 85a248d8d..fceb70b37 100644
--- a/tests/ebuild/test_repository.py
+++ b/tests/ebuild/test_repository.py
@@ -199,6 +199,31 @@ class TestUnconfiguredTree:
atom("<just/newer-than-42"),
}
+ def test_stabilization_groups(self, tmp_path, caplog):
+ base = tmp_path / "metadata/stabilization-groups"
+ (base / "pkgcore").mkdir(parents=True)
+ (base / "gentoo").write_text(
+ textwrap.dedent(
+ """\
+ # some text here
+ dev-python/pkgcore
+ dev-python/pytest # comment
+ @bad_atom@
+ """
+ )
+ )
+ (base / "pkgcore" / "snakeoil").write_text("""dev-python/snakeoil # comment""")
+ mirrors = self.mk_tree(tmp_path).stabilization_groups
+ assert set(mirrors.keys()) == {"gentoo", "pkgcore/snakeoil"}
+ assert set(mirrors["gentoo"]) == {
+ atom("dev-python/pkgcore"),
+ atom("dev-python/pytest"),
+ }
+ assert set(mirrors["pkgcore/snakeoil"]) == {
+ atom("dev-python/snakeoil"),
+ }
+ assert "line 4: parsing error:" in caplog.text
+
class TestSlavedTree(TestUnconfiguredTree):
def mk_tree(self, path, *args, **kwds):