From 593260a5ed3e87f55f3878579e82635ab60e5984 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Thu, 5 Nov 2026 11:59:33 +0100 Subject: [PATCH] fix: name orphaned pins on the triage line needs_review counts an orphaned pin and a moved repository, but the triage line only added stale prose and unchecked refs, so pcem read "1 to review" for an upstream_commit outside its branch history. --- scripts/profile_sync.py | 31 ++++++++++++++++++++++++------- tests/test_profile_sync.py | 13 +++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/scripts/profile_sync.py b/scripts/profile_sync.py index 9b9448a93..818e7bb54 100644 --- a/scripts/profile_sync.py +++ b/scripts/profile_sync.py @@ -1065,6 +1065,29 @@ class ProfileReport: ) +def triage_state(report: ProfileReport) -> str: + """One triage line: what to review, the pin to set again named first. + + A pin outside its branch's history or a repository answering under + another name is fixed before any ref is read: pcem showed as "1 to + review" for an upstream_commit off the dev branch. + """ + if report.skipped: + return report.skipped + state = f"{report.needs_review()} to review" + if report.orphaned: + state += f", {len(report.orphaned)} orphaned pin" + if report.moved_repos: + state += f", {len(report.moved_repos)} repository moved" + stale = len(report.stale_prose or ()) + if stale: + state += f", {stale} prose under an older pin" + unchecked = (report.counts or {}).get("UNCHECKED", 0) + if unchecked: + state += f", {unchecked} unchecked" + return state + + def select_repo(profile: dict) -> upstream.Repo | None: """Repository the profile was read from: source first, then upstream.""" for field in ("source", "upstream"): @@ -4909,13 +4932,7 @@ def _print_triage( print(f"{'score':>5s} {'profile':30s} state (worst first)") pending = 0 for score, report, refused in sorted(ranked, key=lambda item: -item[0]): - state = report.skipped or f"{report.needs_review()} to review" - stale = len(report.stale_prose or ()) - if stale and not report.skipped: - state += f", {stale} prose under an older pin" - unchecked = (report.counts or {}).get("UNCHECKED", 0) - if unchecked and not report.skipped: - state += f", {unchecked} unchecked" + state = triage_state(report) if refused: state += f", {refused}" pending += bool(report.needs_review()) diff --git a/tests/test_profile_sync.py b/tests/test_profile_sync.py index 025a56fe2..b05218b45 100644 --- a/tests/test_profile_sync.py +++ b/tests/test_profile_sync.py @@ -333,6 +333,19 @@ class TestGoneUpstreamIsNotAnError(unittest.TestCase): self.assertIn("upstream gone", out) self.assertIn("upstream error", out) + def test_triage_names_an_orphaned_pin_and_a_moved_repository(self): + """pcem's only problem was an upstream_commit off its dev branch, and + the triage line read "1 to review" like any drift.""" + report = ProfileReport( + name="pcem", entries=[], counts={"UNCHECKED": 2}, + orphaned=["sarah-walker-pcem/pcem: pin 25b54e3f is no ancestor of 4606fb1e"], + moved_repos=["a/b answers as c/b (renamed or transferred)"], + ) + self.assertEqual( + profile_sync.triage_state(report), + "2 to review, 1 orphaned pin, 1 repository moved, 2 unchecked", + ) + class TestWorstStatus(unittest.TestCase): def test_gone_beats_everything(self):