From: Eric Wong Date: Sat, 15 Aug 2015 23:41:21 +0000 (+0000) Subject: thread: common sorting code X-Git-Tag: v1.0.0~1066^2~7 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=f79d00b03dfa4f3f3c13bee4654d243c1d2fcd97;p=public-inbox.git thread: common sorting code 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 --- diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm index f7c2f329..b5325597 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 7dabf243..58efb8dc 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 fcc98ab8..dcdb3109 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;