Skip to content

Commit 0177cb2

Browse files
committed
bugs: add --find-by-maintainer option
Scan over the whole repository to find packages maintained by passed emails. It would try to find best stable candidate from that package. Resolves: #157 Signed-off-by: Arthur Zamarin <arthurzam@gentoo.org>
1 parent ab02bcd commit 0177cb2

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

data/share/bash-completion/completions/pkgdev

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,14 +246,15 @@ _pkgdev() {
246246
subcmd_options="
247247
--api-key
248248
--auto-cc-arches
249+
--find-by-maintainer
249250
--blocks
250251
--dot
251252
-s --stablereq
252253
-k --keywording
253254
"
254255

255256
case "${prev}" in
256-
--api-key | --auto-cc-arches | --blocks)
257+
--api-key | --auto-cc-arches | --blocks | --find-by-maintainer)
257258
COMPREPLY=()
258259
;;
259260
--dot)

src/pkgdev/scripts/pkgdev_bugs.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020
from pkgcore.ebuild.ebuild_src import package
2121
from pkgcore.ebuild.errors import MalformedAtom
2222
from pkgcore.ebuild.misc import sort_keywords
23+
from pkgcore.ebuild.repo_objs import LocalMetadataXml
2324
from pkgcore.repository import multiplex
2425
from pkgcore.restrictions import boolean, packages, values
2526
from pkgcore.test.misc import FakePkg
2627
from pkgcore.util import commandline, parserestrict
2728
from snakeoil.cli import arghparse
2829
from snakeoil.cli.input import userquery
2930
from snakeoil.formatters import Formatter
31+
from snakeoil.osutils import pjoin
3032

3133
from ..cli import ArgumentParser
3234
from .argparsers import _determine_cwd_repo, cwd_repo_argparser, BugzillaApiKey
@@ -62,6 +64,19 @@
6264
package is maintainer-needed, always add CC-ARCHES.
6365
""",
6466
)
67+
bugs.add_argument(
68+
"--find-by-maintainer",
69+
action=arghparse.CommaSeparatedNegationsAppend,
70+
default=([], []),
71+
help="collect all packages maintained by the listed email addresses",
72+
docs="""
73+
Comma separated list of email addresses, for which pkgdev will collect
74+
all packages maintained by.
75+
76+
Note that this flag requires to go over all packages in the repository
77+
to find matches, which can be slow (between 1 to 3 seconds).
78+
""",
79+
)
6580
bugs.add_argument(
6681
"--blocks",
6782
metavar="BUG",
@@ -309,6 +324,20 @@ def extend_targets_stable_groups(self, groups):
309324
except (ValueError, IndexError):
310325
self.err.write(f"Unable to find match for {pkg.unversioned_atom}")
311326

327+
def extend_maintainers(self):
328+
disabled, enabled = self.options.find_by_maintainer
329+
emails = frozenset(enabled).difference(disabled)
330+
if not emails:
331+
return
332+
search_repo = self.options.search_repo
333+
self.out.write("Searching for packages maintained by: ", ", ".join(emails))
334+
self.out.flush()
335+
for cat, pkgs in search_repo.packages.items():
336+
for pkg in pkgs:
337+
xml = LocalMetadataXml(pjoin(search_repo.location[0], cat, pkg, "metadata.xml"))
338+
if emails.intersection(m.email for m in xml.maintainers):
339+
yield None, parserestrict.parse_match(f"{cat}/{pkg}")
340+
312341
def _find_dependencies(self, pkg: package, keywords: set[str]):
313342
check = visibility.VisibilityCheck(self.options, profile_addon=self.profile_addon)
314343

@@ -551,6 +580,7 @@ def main(options, out: Formatter, err: Formatter):
551580
search_repo = options.search_repo
552581
options.targets = options.targets or []
553582
d = DependencyGraph(out, err, options)
583+
options.targets.extend(d.extend_maintainers())
554584
options.targets.extend(d.extend_targets_stable_groups(options.sets or ()))
555585
if not options.targets:
556586
options.targets = list(_load_from_stdin(out, err))

0 commit comments

Comments
 (0)