]> Sergey Matveev's repositories - public-inbox.git/commitdiff
feed: sort child messages (forward) chronologically
authorEric Wong <e@80x24.org>
Sun, 7 Sep 2014 22:53:15 +0000 (22:53 +0000)
committerEric Wong <e@80x24.org>
Sun, 7 Sep 2014 22:57:58 +0000 (22:57 +0000)
Only root messages should be sorted in reverse chronological order,
child messages should be chronological.  This gives precedence to
_topics_, but also for initial replies.

This improves readability when several messages appear at the same
nesting level, and helps git patch series' appear correctly as:

[PATCH 0/3] ...
[PATCH 1/3] ...
[PATCH 2/3] ...
[PATCH 3/3] ...

Instead of (what it was previously):

[PATCH 0/3] ...
[PATCH 3/3] ...
[PATCH 2/3] ...
[PATCH 1/3] ...

lib/PublicInbox/Feed.pm

index 646c85c9977480498d592401d45327aa60643863..1f1c0d6bd98fe5e63be21ca764e5be35cd14acd8 100644 (file)
@@ -77,15 +77,21 @@ sub generate_html_index {
                $feed_opts->{atomurl} . '" type="application/atom+xml"/>' .
                '</head><body>' . PRE_WRAP;
 
-       # sort by date, most recent at top
+       # sort child messages in chronological order
        $th->order(sub {
                sort {
-                       $b->topmost->message->header('X-PI-Date') <=>
-                       $a->topmost->message->header('X-PI-Date')
+                       $a->topmost->message->header('X-PI-Date') <=>
+                       $b->topmost->message->header('X-PI-Date')
                } @_;
        });
+
        my %seen;
-       dump_msg($_, 0, \$html, time, \%seen) for $th->rootset;
+       # except we sort top-level messages reverse chronologically
+       for (sort { (eval { $b->message->header('X-PI-Date') } || 0) <=>
+                   (eval { $a->message->header('X-PI-Date') } || 0)
+                 } $th->rootset) {
+               dump_msg($_, 0, \$html, time, \%seen);
+       }
 
        Email::Address->purge_cache;