repos.recursive_build_report: Refactor

Use BuildReporter.recursive_closure for the first stage
of report generation. This leads to nice code cleanup.
This commit is contained in:
Ivan A. Melnikov 2023-12-05 15:03:43 +04:00
parent 1c0903b9dc
commit 94458d44ce

View File

@ -369,9 +369,14 @@ class TripletReport:
return False
return True
def sources_set(self):
def sources_for_deps(self):
return set(p.source_name for k, d, p in self.triplets)
def sources_for_build(self):
return set(p.source_name
for k, d, p in self.triplets
if _is_build_kind(k))
def basic_format(self, title=None, to=None):
"""Format a report
@ -536,7 +541,7 @@ class BuildReporter:
while queue:
cur = queue.pop()
missing = self.report(cur).sources_set()
missing = self.report(cur).sources_for_deps()
unseen = missing.difference(seen)
seen.extend(unseen)
# don't recur into packages from stop_names
@ -556,7 +561,7 @@ class BuildReporter:
if name in stop_names:
result.append('not going deeper (stop_names)')
else:
result.append(self._build_report(name).basic_format().strip())
result.append(self.report(name).basic_format().strip())
return to('\n'.join(result)) if to else '\n'.join(result)
@ -590,52 +595,23 @@ def missing_rating_report(from_repo, to_repo):
def recursive_build_report(from_repo, to_repo, *source_names,
ignore=(), ignore_sort=(), summary=True):
reports = []
build_source_deps = {}
pkg_source_deps = {}
requested_source_names = set(_src_name(s) for s in source_names)
reporter = BuildReporter(from_repo, to_repo, ignore=ignore,
prefer=requested_source_names)
stack = list(requested_source_names)
seen = set(stack)
while stack:
cur = stack.pop()
report = reporter.report(cur)
cur_in_to = to_repo.sources.get(cur)
cur_source_srpm = cur_in_to.source_rpm if cur_in_to else b'NONE'
reports.append('\n== %s ==\n%s has %s\n' % (
cur.decode(), to_repo.name, cur_source_srpm.decode()))
reports.append(report.basic_format())
# find all sources in the report
bld_deps = set(p.source_name
for k, _d, p in report.triplets
if _is_build_kind(k))
pkg_deps = set(p.source_name
for k, _d, p in report.triplets
if not _is_build_kind(k))
pkg_deps -= bld_deps
build_source_deps[cur] = sorted(bld_deps)
pkg_source_deps[cur] = sorted(pkg_deps)
unseen = bld_deps.union(pkg_deps) - seen
seen.update(unseen)
stack.extend(unseen)
names = reporter.recursive_closure(requested_source_names)
reports = [reporter.format_reports(names), '']
if not summary:
return '\n'.join(reports)
# expand the build requires with the pkg reqs of dependencies:
full_req = {}
names = set(build_source_deps)
for source in build_source_deps:
for source in names:
chroot = from_repo.chroot_for(from_repo.sources[source].requires,
prefer=names)
dep_sources = set()
for b in chroot.binaries.values():
if b.source_name not in build_source_deps:
if b.source_name not in names:
continue
if (b.source_name, source) in ignore_sort:
continue
@ -668,11 +644,15 @@ def recursive_build_report(from_repo, to_repo, *source_names,
reports.append('\n== SUMMARY ==\n')
for source in order:
br = reporter.report(source)
before = br.sources_for_build()
after = br.sources_for_deps() - before
reports.append('{} {:60} {} :: {}'.format(
letter(source),
from_repo.sources[source].source_rpm.decode(),
b' '.join(build_source_deps[source]).decode(),
b' '.join(pkg_source_deps[source]).decode()))
b' '.join(sorted(before)).decode(),
b' '.join(sorted(after)).decode()))
if cycles:
reports.append('\nCycles:')