Skip to content

Commit 8fa5b21

Browse files
committed
py3query: Allow querying multiple repositories
This allows passing more repositories using multiple --qrepo flags. It also adds an option to write out a groups file detailing which package comes from which repository.
1 parent 9d3a7ad commit 8fa5b21

File tree

1 file changed

+29
-8
lines changed

1 file changed

+29
-8
lines changed

dnf-plugins/py3query.py

+29-8
Original file line numberDiff line numberDiff line change
@@ -206,14 +206,23 @@ def set_argparser(parser):
206206
parser.add_argument('--no-bz', dest='fetch_bugzilla', action='store_false',
207207
default=True, help=_("Don't get Bugzilla links"))
208208

209-
parser.add_argument('--qrepo', dest='py3query_repo', default='rawhide',
210-
help=_("Repo to use for the query"))
209+
parser.add_argument('--qrepo', dest='py3query_repo', action='append',
210+
help=_("Repo(s) to use for the query"))
211+
212+
parser.add_argument('--repo-groups', dest='repo_groups_file',
213+
default=None, metavar='FILE', action='store',
214+
help=_("Optional filename of a 'groups.json' file "
215+
"that will record which package comes from "
216+
"which repositories"))
211217

212218
def run(self):
213-
reponame = self.opts.py3query_repo
219+
reponames = self.opts.py3query_repo
220+
if not reponames:
221+
reponames = ['rawhide']
214222
self.base_query = self.base.sack.query()
215-
self.pkg_query = self.base_query.filter(reponame=reponame)
216-
self.src_query = self.base_query.filter(reponame=reponame + '-source').filter(arch=['src'])
223+
self.pkg_query = self.base_query.filter(reponame=list(reponames))
224+
source_reponames = [n + '-source' for n in reponames]
225+
self.src_query = self.base_query.filter(reponame=source_reponames).filter(arch=['src'])
217226

218227
# python_versions: {package: set of Python versions}
219228
python_versions = collections.defaultdict(set)
@@ -222,7 +231,7 @@ def run(self):
222231
# dep_versions: {dep name: Python version}
223232
dep_versions = collections.defaultdict(set)
224233
for n, seeds in SEED_PACKAGES.items():
225-
provides = sorted(self.all_provides(reponame, seeds), key=str)
234+
provides = sorted(self.all_provides(reponames, seeds), key=str)
226235

227236
# This effectively includes packages that still need
228237
# Python 3.4 while Rawhide only provides Python 3.5
@@ -238,10 +247,13 @@ def run(self):
238247
# by_srpm_name: {srpm name: set of packages}
239248
srpm_names = {}
240249
by_srpm_name = collections.defaultdict(set)
250+
# repo_srpms: {repo name: set of srpm names}
251+
repo_srpms = {}
241252
for pkg in progressbar(python_versions.keys(), 'Getting SRPMs'):
242253
srpm_name = get_srpm_name(pkg)
243254
srpm_names[pkg] = srpm_name
244255
by_srpm_name[srpm_name].add(pkg)
256+
repo_srpms.setdefault(pkg.reponame, set()).add(srpm_name)
245257

246258
# deps_of_pkg: {package: set of packages}
247259
deps_of_pkg = collections.defaultdict(set)
@@ -387,12 +399,21 @@ def key(bug):
387399
json.dump(json_output, sys.stdout, indent=2, sort_keys=True)
388400
sys.stdout.flush()
389401

390-
def all_provides(self, reponame, seeds):
402+
# Write out a groups.json
403+
if self.opts.repo_groups_file:
404+
output = {repo_name: {'name': repo_name,
405+
'packages': sorted(srpm_names)}
406+
for repo_name, srpm_names in repo_srpms.items()}
407+
with open(self.opts.repo_groups_file, 'w') as f:
408+
json.dump(output, f, indent=2, sort_keys=True)
409+
410+
411+
def all_provides(self, reponames, seeds):
391412
pkgs = set()
392413
for seed in seeds:
393414
query = dnf.subject.Subject(seed, ignore_case=True).get_best_query(
394415
self.base.sack, with_provides=False)
395-
query = query.filter(reponame=reponame)
416+
query = query.filter(reponame=list(reponames))
396417
pkgs.update(query.run())
397418
provides = set()
398419
for pkg in sorted(pkgs):

0 commit comments

Comments
 (0)