[PATCH RFC 05/11] review-tui: guarantee the tracked revision in revision lists

Christian Brauner <[email protected]> Sat, 18 Jul 2026 00:37:41 +0200
Newsgroups org.kernel.linux.tools
Message-ID <[email protected]>
The revisions catalog is not guaranteed a row for the tracked revision
(manual linking can record only newer versions), so per-version views
built from series['_revisions'] could silently omit the version the
maintainer is actually tracking.  Add _merge_tracked_revision(), which
appends a synthesized entry built from the series row when the catalog
lacks it.

Assisted-by: LLM
Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 src/b4/review_tui/_tracking_app.py | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/src/b4/review_tui/_tracking_app.py b/src/b4/review_tui/_tracking_app.py
index 7bf9530..3057367 100644
--- a/src/b4/review_tui/_tracking_app.py
+++ b/src/b4/review_tui/_tracking_app.py
@@ -1561,6 +1561,41 @@ class TrackingApp(LoreNodeShutdownMixin, CheckRunnerMixin, App[Optional[str]]):
             )
         )
 
+    def _merge_tracked_revision(self, series: Dict[str, Any]) -> List[Dict[str, Any]]:
+        """Known revisions of a series, guaranteed to include the tracked one.
+
+        The revisions catalog is not guaranteed a row for the tracked
+        revision (manual linking can record only newer versions), so a
+        synthesized entry built from the series row is appended when it
+        is missing.
+        """
+        revs = list(series.get('_revisions') or [])
+        tracked = series.get('revision', 1)
+        if any(r.get('revision') == tracked for r in revs):
+            return revs
+        if not series.get('message_id'):
+            return revs
+        revs.append(
+            {
+                'change_id': series.get('change_id', ''),
+                'revision': tracked,
+                'message_id': series.get('message_id', ''),
+                'subject': series.get('subject'),
+                'link': '',
+                'found_at': series.get('added_at') or '',
+                'thread_blob': '',
+                'fingerprint': series.get('fingerprint'),
+                'source': 'tracked',
+                'is_rethreaded': bool(series.get('is_rethreaded')),
+                'message_count': series.get('message_count'),
+                'seen_message_count': series.get('seen_message_count'),
+                'last_update_check': series.get('last_update_check'),
+                'last_activity_at': series.get('last_activity_at'),
+            }
+        )
+        revs.sort(key=lambda r: r.get('revision') or 0)
+        return revs
+
     def _checkout_new_series(self) -> None:
         """Retrieve series, build am-ready mbox, and show base selection."""
         series = self._selected_series

-- 
2.53.0