|
20 | 20 | from pkgcore.ebuild.ebuild_src import package |
21 | 21 | from pkgcore.ebuild.errors import MalformedAtom |
22 | 22 | from pkgcore.ebuild.misc import sort_keywords |
| 23 | +from pkgcore.ebuild.repo_objs import LocalMetadataXml |
23 | 24 | from pkgcore.repository import multiplex |
24 | 25 | from pkgcore.restrictions import boolean, packages, values |
25 | 26 | from pkgcore.test.misc import FakePkg |
26 | 27 | from pkgcore.util import commandline, parserestrict |
27 | 28 | from snakeoil.cli import arghparse |
28 | 29 | from snakeoil.cli.input import userquery |
29 | 30 | from snakeoil.formatters import Formatter |
| 31 | +from snakeoil.osutils import pjoin |
30 | 32 |
|
31 | 33 | from ..cli import ArgumentParser |
32 | 34 | from .argparsers import _determine_cwd_repo, cwd_repo_argparser, BugzillaApiKey |
|
62 | 64 | package is maintainer-needed, always add CC-ARCHES. |
63 | 65 | """, |
64 | 66 | ) |
| 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 | +) |
65 | 80 | bugs.add_argument( |
66 | 81 | "--blocks", |
67 | 82 | metavar="BUG", |
@@ -309,6 +324,20 @@ def extend_targets_stable_groups(self, groups): |
309 | 324 | except (ValueError, IndexError): |
310 | 325 | self.err.write(f"Unable to find match for {pkg.unversioned_atom}") |
311 | 326 |
|
| 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 | + |
312 | 341 | def _find_dependencies(self, pkg: package, keywords: set[str]): |
313 | 342 | check = visibility.VisibilityCheck(self.options, profile_addon=self.profile_addon) |
314 | 343 |
|
@@ -551,6 +580,7 @@ def main(options, out: Formatter, err: Formatter): |
551 | 580 | search_repo = options.search_repo |
552 | 581 | options.targets = options.targets or [] |
553 | 582 | d = DependencyGraph(out, err, options) |
| 583 | + options.targets.extend(d.extend_maintainers()) |
554 | 584 | options.targets.extend(d.extend_targets_stable_groups(options.sets or ())) |
555 | 585 | if not options.targets: |
556 | 586 | options.targets = list(_load_from_stdin(out, err)) |
|
0 commit comments