Skip to content

Commit ca88efc

Browse files
committed
Generate most common blocking components report
1 parent 3cc8b41 commit ca88efc

1 file changed

Lines changed: 51 additions & 5 deletions

File tree

jobs.py

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import collections
22
from dataclasses import dataclass, field
33
import functools
4+
import json
45
import os
56
import sys
67

@@ -291,6 +292,7 @@ def report_blocking_components(loop_detector):
291292
log('\nDetected dependency loops:')
292293
for loop in sorted(loops, key=lambda t: -len(t)):
293294
log(' • ' + ' → '.join(loop))
295+
return loops
294296

295297

296298
def get_component_status_info(component, missing_packages, components, unresolvable_components, prerel_abi_blocked_components=None):
@@ -543,31 +545,75 @@ def process_component(component, ctx):
543545
def generate_reports(ctx):
544546
"""
545547
Generate and print all summary reports.
546-
548+
Also saves the report data to commonly-needed-report.json.
549+
547550
Args:
548551
ctx: RebuildContext with statistics and component data
549552
"""
553+
# Build structured data for JSON export
554+
report_data = {
555+
'most_commonly_needed': [],
556+
'most_commonly_last_blocking': [],
557+
'most_commonly_last_blocking_combinations': [],
558+
'dependency_loops': []
559+
}
560+
550561
log('\nThe 50 most commonly needed components are:')
551562
for component, count in ctx.blocker_counter['general'].most_common(50):
552563
status_info = get_component_status_info(
553564
component, ctx.missing_packages, ctx.components,
554565
ctx.unresolvable_components, ctx.prerel_abi_blocked_components
555566
)
556567
log(f'{count:>5} {component:<35} {status_info}')
557-
568+
569+
entry = {
570+
'component': component,
571+
'count': count,
572+
}
573+
if component in ctx.unresolvable_components:
574+
entry['unresolvable'] = True
575+
if component in ctx.prerel_abi_blocked_components:
576+
entry['prerel_abi_blocked'] = True
577+
if component in ctx.missing_packages:
578+
entry['blocked_by'] = sorted(ctx.missing_packages[component])
579+
report_data['most_commonly_needed'].append(entry)
580+
558581
log('\nThe 20 most commonly last-blocking components are:')
559582
for component, count in ctx.blocker_counter['single'].most_common(20):
560583
status_info = get_component_status_info(
561584
component, ctx.missing_packages, ctx.components,
562585
ctx.unresolvable_components, ctx.prerel_abi_blocked_components
563586
)
564587
log(f'{count:>5} {component:<35} {status_info}')
565-
588+
589+
entry = {
590+
'component': component,
591+
'count': count,
592+
}
593+
if component in ctx.unresolvable_components:
594+
entry['unresolvable'] = True
595+
if component in ctx.prerel_abi_blocked_components:
596+
entry['prerel_abi_blocked'] = True
597+
if component in ctx.missing_packages:
598+
entry['blocked_by'] = sorted(ctx.missing_packages[component])
599+
report_data['most_commonly_last_blocking'].append(entry)
600+
566601
log('\nThe 20 most commonly last-blocking small combinations of components are:')
567602
for components_tuple, count in ctx.blocker_counter['combinations'].most_common(20):
568603
log(f'{count:>5} {", ".join(components_tuple)}')
569-
570-
report_blocking_components(ctx.loop_detector)
604+
605+
report_data['most_commonly_last_blocking_combinations'].append({
606+
'components': list(components_tuple),
607+
'count': count
608+
})
609+
610+
loops = report_blocking_components(ctx.loop_detector)
611+
for loop in loops:
612+
report_data['dependency_loops'].append(list(loop))
613+
614+
with open('commonly-needed-report.json', 'w') as f:
615+
json.dump(report_data, f, indent=2)
616+
log('\nReport saved to commonly-needed-report.json')
571617

572618

573619
def main():

0 commit comments

Comments
 (0)