diff --git a/scripts/summarize.py b/scripts/summarize.py index 2e9e84754d3dd4b2cd892073536ca4971b3d7600..deec097ff4a3724278f09c5007dc74e666597770 100755 --- a/scripts/summarize.py +++ b/scripts/summarize.py @@ -55,7 +55,9 @@ def export_dot(summary): for pkg, dep in edges: s += f' "{pkg}" -> "{dep}";\n' - for pkg in summary['pkgs']: + # Deduplicate + pkgs = {pkg['drvPath']: pkg for pkg in summary['pkgs']} + for pkg in pkgs.values(): color = 'lightblue' if pkg['failed']: color = 'indianred' @@ -67,9 +69,9 @@ def export_dot(summary): return s def show_failures(summary, log_excerpt=100): - failed = [pkg + failed = {pkg['drvPath']: pkg for pkg in summary['pkgs'] - if pkg['failed']] + if pkg['failed']} if len(failed) == 0: print('='*80) print('No issues encountered.') @@ -78,33 +80,40 @@ def show_failures(summary, log_excerpt=100): print('='*80) print('These packages failed to build:') print() - for pkg in failed: + for pkg in failed.values(): print(f"* {pkg['name']} ({pkg['drvPath']})") - print() - proc = subprocess.run(['nix', 'log', '--quiet', pkg['drvPath']], - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - encoding='UTF-8') - if proc.returncode != 0: - print(f' Error: Failed to fetch log') - continue - - print(f' ---- Last {log_excerpt} lines of log follow ----') - lines = proc.stdout.split('\n') - if len(lines) > log_excerpt: - print(' â‹®') - - print('\n '.join(lines[-log_excerpt:])) - print(' ---- End of log ----------------------------') - print() - print() + if log_excerpt is not None: + print() + proc = subprocess.run(['nix', 'log', '--quiet', pkg['drvPath']], + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + encoding='UTF-8') + if proc.returncode != 0: + print(f' Error: Failed to fetch log') + continue + + print(f' ---- Last {log_excerpt} lines of log follow ----') + lines = proc.stdout.split('\n') + if len(lines) > log_excerpt: + print(' â‹®') + + print('\n '.join(lines[-log_excerpt:])) + print(' ---- End of log ----------------------------') + print() + print() print('='*80) if __name__ == "__main__": assert os.environ['GHC_TARBALL'] != None + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('--no-logs', action='store_true', help="Don't export logs (useful when logs are unavailable as nix remote builds were used)") + args = parser.parse_args() + summary = read_summary() - export_logs(summary) + if not args.no_logs: + export_logs(summary) json.dump(summary, Path('summary.json').open('w')) - show_failures(summary) + show_failures(summary, log_excerpt=None if args.no_logs else 100) Path('summary.dot').write_text(export_dot(summary))