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=-2.9 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=unavailable version=3.3.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 0FD6D2045C for ; Mon, 2 May 2016 18:01:30 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 2/5] view: disable subject threading Date: Mon, 2 May 2016 18:01:22 +0000 Message-Id: <20160502180125.21277-3-e@80x24.org> In-Reply-To: <20160502180125.21277-1-e@80x24.org> References: <20160502180125.21277-1-e@80x24.org> List-Id: Broken threads should be exposed to hopefully encourage people to use proper mail clients which set In-Reply-To headers. --- lib/PublicInbox/SearchView.pm | 17 +++++++---------- lib/PublicInbox/Thread.pm | 14 ++++++++++++++ lib/PublicInbox/View.pm | 16 +++------------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm index 41d3200..c0cd1ff 100644 --- a/lib/PublicInbox/SearchView.pm +++ b/lib/PublicInbox/SearchView.pm @@ -11,6 +11,7 @@ use PublicInbox::View; use PublicInbox::MID qw(mid2path mid_clean mid_mime); use Email::MIME; require PublicInbox::Git; +require PublicInbox::Thread; our $LIM = 50; sub sres_top_html { @@ -151,23 +152,19 @@ sub tdump { } ($mset->items); my @rootset; - my $th = PublicInbox::View::thread_results(\@m, 0, $q->{r}); - if ($q->{r}) { + my $th = PublicInbox::Thread->new(@m); + $th->thread; + if ($q->{r}) { # order by relevance $th->order(sub { sort { (eval { $pct{$b->topmost->messageid} } || 0) <=> (eval { $pct{$a->topmost->messageid} } || 0) } @_; }); - @rootset = $th->rootset; - } else { - @rootset = sort { - (eval { $b->topmost->message->header('X-PI-TS') } || 0) - <=> - (eval { $a->topmost->message->header('X-PI-TS') } || 0) - } $th->rootset; + } else { # order by time (default for threaded view) + $th->order(*PublicInbox::View::sort_ts); } - + @rootset = $th->rootset; my $git = $ctx->{git} ||= PublicInbox::Git->new($ctx->{git_dir}); my $state = { ctx => $ctx, diff --git a/lib/PublicInbox/Thread.pm b/lib/PublicInbox/Thread.pm index 781ffff..44a565a 100644 --- a/lib/PublicInbox/Thread.pm +++ b/lib/PublicInbox/Thread.pm @@ -12,6 +12,20 @@ package PublicInbox::Thread; use strict; use warnings; use base qw(Mail::Thread); +# WARNING! both these Mail::Thread knobs were found by inspecting +# the Mail::Thread 2.55 source code, and we have some monkey patches +# in PublicInbox::Thread to fix memory leaks. Since Mail::Thread +# appears unmaintained, I suppose it's safe to depend on these +# variables for now: +{ + no warnings 'once'; + # we want strict threads to expose (and hopefully discourage) + # use of broken email clients + $Mail::Thread::nosubject = 1; + # Keep ghosts with only a single direct child, + # don't hide that there may be missing messages. + $Mail::Thread::noprune = 1; +} if ($Mail::Thread::VERSION <= 2.55) { eval q(sub _container_class { 'PublicInbox::Thread::Container' }); diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 63810dc..70eb44e 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -670,21 +670,11 @@ sub msg_timestamp { } sub thread_results { - my ($msgs, $nosubject, $nosort) = @_; + my ($msgs) = @_; require PublicInbox::Thread; my $th = PublicInbox::Thread->new(@$msgs); - - # WARNING! both these Mail::Thread knobs were found by inspecting - # the Mail::Thread 2.55 source code, and we have some monkey patches - # in PublicInbox::Thread to fix memory leaks. Since Mail::Thread - # appears unmaintained, I suppose it's safe to depend on these - # variables for now: - no warnings 'once'; - $Mail::Thread::nosubject = $nosubject; - # Keep ghosts with only a single direct child: - $Mail::Thread::noprune = 1; $th->thread; - $th->order(*sort_ts) unless $nosort; + $th->order(*sort_ts); $th } @@ -879,7 +869,7 @@ sub emit_index_topics { my $sres = $state->{srch}->query('', \%opts); my $nr = scalar @{$sres->{msgs}} or last; - for (thread_results(load_results($sres), 1)->rootset) { + for (thread_results(load_results($sres))->rootset) { add_topic($state, $_, 0); } $opts{offset} += $nr;