[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