From 86981fde2691288ff77d4356fef565a1f0689a84 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Sun, 4 May 2025 19:18:23 -0400 Subject: [PATCH] Print out log directory at the end of the run This is helpful when running with --no-shell where there's no "paused" context of nix-shell to assume. The link is clickable. (Yes, the user sees git workspace removed at the end of the run but it's not very convenient to copy the root of nixpkgs checkout, then append `logs` manually.) Signed-off-by: Ihar Hrachyshka --- nixpkgs_review/report.py | 18 +++++++++++++++--- nixpkgs_review/review.py | 2 +- nixpkgs_review/utils.py | 9 ++++----- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/nixpkgs_review/report.py b/nixpkgs_review/report.py index 373c3fd9..1833b57f 100644 --- a/nixpkgs_review/report.py +++ b/nixpkgs_review/report.py @@ -1,5 +1,6 @@ import json import os +import socket import subprocess from collections.abc import Callable from concurrent.futures import ThreadPoolExecutor @@ -8,7 +9,7 @@ from typing import Literal from .nix import Attr -from .utils import System, info, link, skipped, system_order_key, warn +from .utils import System, info, link, skipped, system_order_key, to_link, warn def print_number( @@ -208,6 +209,12 @@ def order_reports(reports: dict[System, SystemReport]) -> dict[System, SystemRep ) +# https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda +def to_file_uri(path: Path) -> str: + """Convert a path to a file URI, including hostname.""" + return f"file://{socket.gethostname()}{path.absolute()}" + + class Report: def __init__( self, @@ -324,11 +331,11 @@ def markdown(self, pr: int | None) -> str: return msg - def print_console(self, pr: int | None) -> None: + def print_console(self, root: Path, pr: int | None) -> None: if pr is not None: pr_url = f"https://github.com/NixOS/nixpkgs/pull/{pr}" info("\nLink to currently reviewing PR:") - link(pr_url) + link(to_link(pr_url, pr_url)) for system, report in self.system_reports.items(): info(f"--------- Report for '{system}' ---------") @@ -342,3 +349,8 @@ def print_console(self, pr: int | None) -> None: print_number(report.failed, "failed to build") print_number(report.tests, "built", what="test", log=print) print_number(report.built, "built", log=print) + + logs_dir = root / "logs" + info("Logs can be found under:") + link(to_link(to_file_uri(logs_dir), str(logs_dir))) + info("") diff --git a/nixpkgs_review/review.py b/nixpkgs_review/review.py index 2010301e..e7fddf1d 100644 --- a/nixpkgs_review/review.py +++ b/nixpkgs_review/review.py @@ -412,7 +412,7 @@ def start_review( # is mainly capped by available RAM max_workers=min(32, os.cpu_count() or 1), # 'None' assumes IO tasks ) - report.print_console(pr) + report.print_console(path, pr) report.write(path, pr) success = report.succeeded() diff --git a/nixpkgs_review/utils.py b/nixpkgs_review/utils.py index d3b134f2..1bb27500 100644 --- a/nixpkgs_review/utils.py +++ b/nixpkgs_review/utils.py @@ -26,14 +26,13 @@ def wrapper(text: str) -> None: warn = color_text(31, file=sys.stderr) info = color_text(32) skipped = color_text(33) +link = color_text(34) -def link(text: str) -> None: - f = color_text(34) +def to_link(uri: str, text: str) -> str: if HAS_TTY: - f(f"\u001b]8;;{text}\u001b\\{text}\u001b]8;;\u001b\\\n") - else: - f(text) + return f"\u001b]8;;{uri}\u001b\\{text}\u001b]8;;\u001b\\" + return text def sh(