Linux maintainer tooling and workflows
 help / color / mirror / Atom feed
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


  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