From: Mark Brown <broonie@kernel.org>
To: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Cc: tools@kernel.org, Mark Brown <broonie@kernel.org>
Subject: [PATCH b4 1/2] review: tui: Share review ordering between note displays
Date: Wed, 11 Nov 2026 13:12:42 +0000 [thread overview]
Message-ID: <20261111-notes-no-cover-v1-1-b9b0d883742b@kernel.org> (raw)
In-Reply-To: <20261111-notes-no-cover-v1-0-b9b0d883742b@kernel.org>
The review summary and notes viewer both order the current user's
review before other reviewers. Extract that ordering into a shared
helper which also retains the target each review belongs to, keeping the
displayed reviews and note actions unchanged.
Signed-off-by: Mark Brown <broonie@kernel.org>
---
src/b4/review_tui/_review_app.py | 44 ++++++++++++++++------------------------
1 file changed, 17 insertions(+), 27 deletions(-)
diff --git a/src/b4/review_tui/_review_app.py b/src/b4/review_tui/_review_app.py
index 1e70bc6..455a73a 100644
--- a/src/b4/review_tui/_review_app.py
+++ b/src/b4/review_tui/_review_app.py
@@ -36,7 +36,6 @@ from b4.review_tui._common import (
_chain_has_additional_patch,
_fix_ansi_theme,
_get_followup_depth,
- _has_review_data,
_make_initials,
_quiet_worker,
_render_email_to_viewer,
@@ -896,24 +895,11 @@ class ReviewApp(LoreNodeShutdownMixin, CheckRunnerMixin, App[None]):
overlay.display = False
return
- all_reviews = target.get('reviews', {})
- if not all_reviews or not _has_review_data(all_reviews):
- overlay.display = False
- return
-
ts = resolve_styles(self)
my_email = str(self._usercfg.get('email', ''))
- # Build ordered list: current user first, then others sorted by email
- ordered: List[Tuple[str, Dict[str, Any]]] = []
- if my_email in all_reviews:
- ordered.append((my_email, all_reviews[my_email]))
- for addr in sorted(all_reviews):
- if addr != my_email:
- ordered.append((addr, all_reviews[addr]))
-
text = Text()
has_content = False
- for rev_email, review in ordered:
+ for rev_email, review, review_target in self._get_display_reviews(target):
if not (
review.get('trailers')
or review.get('reply', '')
@@ -922,7 +908,7 @@ class ReviewApp(LoreNodeShutdownMixin, CheckRunnerMixin, App[None]):
):
continue
- colour = self._reviewer_colour(rev_email, target, ts)
+ colour = self._reviewer_colour(rev_email, review_target, ts)
if rev_email == my_email:
header = 'Your review'
else:
@@ -1024,6 +1010,17 @@ class ReviewApp(LoreNodeShutdownMixin, CheckRunnerMixin, App[None]):
return self._patches[patch_idx]
return {}
+ def _get_display_reviews(
+ self, target: Dict[str, Any]
+ ) -> List[Tuple[str, Dict[str, Any], Dict[str, Any]]]:
+ """Return reviews and their targets, with the current user's review first."""
+ reviews = target.get('reviews', {})
+ my_email = str(self._usercfg.get('email', ''))
+ return [
+ (addr, reviews[addr], target)
+ for addr in sorted(reviews, key=lambda addr: (addr != my_email, addr))
+ ]
+
def _ensure_review(self, target: Dict[str, Any]) -> Dict[str, Any]:
"""Return the current user's review sub-dict, creating it if needed."""
return b4.review._ensure_my_review(target, self._usercfg)
@@ -1528,8 +1525,8 @@ class ReviewApp(LoreNodeShutdownMixin, CheckRunnerMixin, App[None]):
if not target:
return
- all_reviews = target.get('reviews', {})
- has_any_notes = any(r.get('note', '') for r in all_reviews.values())
+ display_reviews = self._get_display_reviews(target)
+ has_any_notes = any(r.get('note', '') for _addr, r, _target in display_reviews)
if not has_any_notes:
# No notes at all — go straight to the external editor
@@ -1538,16 +1535,9 @@ class ReviewApp(LoreNodeShutdownMixin, CheckRunnerMixin, App[None]):
# Build formatted text showing all reviewers' notes
my_email = str(self._usercfg.get('email', ''))
- ordered: List[Tuple[str, Dict[str, Any]]] = []
- if my_email in all_reviews:
- ordered.append((my_email, all_reviews[my_email]))
- for addr in sorted(all_reviews):
- if addr != my_email:
- ordered.append((addr, all_reviews[addr]))
-
ts = resolve_styles(self)
note_entries: List[Tuple[str, str, str]] = []
- for rev_email, review in ordered:
+ for rev_email, review, review_target in display_reviews:
note = review.get('note', '')
if not note:
continue
@@ -1556,7 +1546,7 @@ class ReviewApp(LoreNodeShutdownMixin, CheckRunnerMixin, App[None]):
else:
name = review.get('name', rev_email)
header = name
- colour = self._reviewer_colour(rev_email, target, ts)
+ colour = self._reviewer_colour(rev_email, review_target, ts)
note_entries.append((header, colour, note))
def _on_note(result: Optional[str]) -> None:
--
2.47.3
next prev parent reply other threads:[~2026-11-11 13:12 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-11 13:12 [PATCH b4 0/2] review: tui: Make series level reviews visible with no cover letter Mark Brown
2026-11-11 13:12 ` Mark Brown [this message]
2026-11-11 13:12 ` [PATCH b4 2/2] review: tui: Show series notes when there is " Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261111-notes-no-cover-v1-1-b9b0d883742b@kernel.org \
--to=broonie@kernel.org \
--cc=konstantin@linuxfoundation.org \
--cc=tools@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox