From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-3.0 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: meta@public-inbox.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 7AF791F820; Sun, 16 Aug 2015 08:38:05 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Cc: Eric Wong Subject: [RFC 05/11] thread: common sorting code Date: Sun, 16 Aug 2015 08:37:53 +0000 Message-Id: <1439714279-21923-6-git-send-email-e@80x24.org> In-Reply-To: <1439714279-21923-1-git-send-email-e@80x24.org> References: <1439714279-21923-1-git-send-email-e@80x24.org> List-Id: We'll be sharing the same threading, so it makes sense to sort replies using the same code and message headers without repeating ourselves. This also standardizes on sorting on X-PI-TS (Unix epoch in seconds) instead over using X-PI-Date differently in two different places --- lib/PublicInbox/Feed.pm | 25 +++++-------------------- lib/PublicInbox/Thread.pm | 14 ++++++++++++++ lib/PublicInbox/View.pm | 12 ++---------- 3 files changed, 21 insertions(+), 30 deletions(-) diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm index f7c2f32..b532559 100644 --- a/lib/PublicInbox/Feed.pm +++ b/lib/PublicInbox/Feed.pm @@ -73,11 +73,13 @@ sub generate_html_index { '' . PRE_WRAP; # sort child messages in chronological order - $th->order(sub { mime_sort_children(@_) }); + $th->order(*PublicInbox::Thread::sort_ts); # except we sort top-level messages reverse chronologically my $state = [ time, {}, $first, 0 ]; - for (mime_sort_roots($th)) { dump_msg($_, 0, \$html, $state) } + for (PublicInbox::Thread::rsort_ts($th->rootset)) { + dump_msg($_, 0, \$html, $state) + } Email::Address->purge_cache; my $footer = nav_footer($args->{cgi}, $last, $feed_opts, $state); @@ -299,26 +301,9 @@ sub mime_load_for_sort { my $t = eval { str2time($mime->header('Date')) }; defined($t) or $t = 0; - $mime->header_set('X-PI-Date', $t); + $mime->header_set('X-PI-TS', $t); push @$messages, $mime; 1; } -# children are chronological -sub mime_sort_children { - sort { - $a->topmost->message->header('X-PI-Date') <=> - $b->topmost->message->header('X-PI-Date') - } @_; -} - -# parents are reverse chronological -sub mime_sort_roots { - my ($th) = @_; - sort { - (eval { $b->message->header('X-PI-Date') } || 0) <=> - (eval { $a->message->header('X-PI-Date') } || 0) - } $th->rootset; -} - 1; diff --git a/lib/PublicInbox/Thread.pm b/lib/PublicInbox/Thread.pm index 7dabf24..58efb8d 100644 --- a/lib/PublicInbox/Thread.pm +++ b/lib/PublicInbox/Thread.pm @@ -12,6 +12,20 @@ if ($Mail::Thread::VERSION <= 2.55) { eval q(sub _container_class { 'PublicInbox::Thread::Container' }); } +sub sort_ts { + sort { + (eval { $a->topmost->message->header('X-PI-TS') } || 0) <=> + (eval { $b->topmost->message->header('X-PI-TS') } || 0) + } @_; +} + +sub rsort_ts { + sort { + (eval { $b->topmost->message->header('X-PI-TS') } || 0) <=> + (eval { $a->topmost->message->header('X-PI-TS') } || 0) + } @_; +} + package PublicInbox::Thread::Container; use strict; use warnings; diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index fcc98ab..dcdb310 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -67,7 +67,7 @@ sub index_entry { $subj = PublicInbox::Hval->new_oneline($subj)->as_html; my $pfx = (' ' x $level); - my $ts = $mime->header('X-PI-Date'); + my $ts = $mime->header('X-PI-TS'); my $fmt = '%Y-%m-%d %H:%M UTC'; $ts = POSIX::strftime($fmt, gmtime($ts)); @@ -391,14 +391,6 @@ sub anchor_for { 'm' . mid_compressed(mid_clean($msgid)); } -# children are chronological -sub simple_sort_children { - sort { - (eval { $a->topmost->message->header('X-PI-TS') } || 0) <=> - (eval { $b->topmost->message->header('X-PI-TS') } || 0) - } @_; -} - sub simple_dump { my ($dst, $root, $node, $level) = @_; $$dst .= ' ' x $level; @@ -441,7 +433,7 @@ sub thread_replies { $root->header_set('X-PI-TS', '0'); my $th = PublicInbox::Thread->new($root, @msgs); $th->thread; - $th->order(sub { simple_sort_children(@_) }); + $th->order(*PublicInbox::Thread::sort_ts); $root = [ $root->header('Message-ID'), clean_subj($root->header('Subject')) ]; simple_dump($dst, $root, $_, 0) for $th->rootset; -- EW