|
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 | +from pkgcore.ebuild.repo_objs import LocalMetadataXml, ProjectsXml |
24 | 24 | from pkgcore.repository import multiplex |
25 | 25 | from pkgcore.restrictions import boolean, packages, values |
26 | 26 | from pkgcore.test.misc import FakePkg |
27 | 27 | from pkgcore.util import commandline, parserestrict |
28 | 28 | from snakeoil.cli import arghparse |
29 | 29 | from snakeoil.cli.input import userquery |
| 30 | +from snakeoil.data_source import bytes_data_source |
30 | 31 | from snakeoil.formatters import Formatter |
31 | 32 | from snakeoil.osutils import pjoin |
32 | 33 |
|
|
77 | 78 | to find matches, which can be slow (between 1 to 3 seconds). |
78 | 79 | """, |
79 | 80 | ) |
| 81 | +bugs.add_argument( |
| 82 | + "--projects", |
| 83 | + action="store_true", |
| 84 | + help="include packages maintained by projects", |
| 85 | + docs=""" |
| 86 | + Include packages maintained by projects, whose members include the |
| 87 | + emails of maintainers passed to ``--find-by-maintainer``. |
| 88 | +
|
| 89 | + Note that this flag requires to fetch the ``projects.xml`` file from |
| 90 | + ``https://api.gentoo.org``. |
| 91 | + """, |
| 92 | +) |
80 | 93 | bugs.add_argument( |
81 | 94 | "--filter-stablereqs", |
82 | 95 | action="store_true", |
@@ -340,8 +353,23 @@ def extend_targets_stable_groups(self, groups): |
340 | 353 | except (ValueError, IndexError): |
341 | 354 | self.err.write(f"Unable to find match for {pkg.unversioned_atom}") |
342 | 355 |
|
| 356 | + def _extend_projects(self, disabled, enabled): |
| 357 | + members = defaultdict(set) |
| 358 | + self.out.write("Fetching projects.xml") |
| 359 | + self.out.flush() |
| 360 | + with urllib.urlopen("https://api.gentoo.org/metastructure/projects.xml", timeout=30) as f: |
| 361 | + for email, project in ProjectsXml(bytes_data_source(f.read())).projects.items(): |
| 362 | + for member in project.members: |
| 363 | + members[member.email].add(email) |
| 364 | + |
| 365 | + disabled = frozenset(disabled).union(*(members[email] for email in disabled)) |
| 366 | + enabled = frozenset(enabled).union(*(members[email] for email in enabled)) |
| 367 | + return disabled, enabled |
| 368 | + |
343 | 369 | def extend_maintainers(self): |
344 | 370 | disabled, enabled = self.options.find_by_maintainer |
| 371 | + if self.options.projects: |
| 372 | + disabled, enabled = self._extend_projects(disabled, enabled) |
345 | 373 | emails = frozenset(enabled).difference(disabled) |
346 | 374 | if not emails: |
347 | 375 | return |
|
0 commit comments