-sub tdump_ent {
- my ($git, $state, $node, $level) = @_;
- return unless $node;
- my $mime = $node->message;
-
- if ($mime) {
- # lazy load the full message from mini_mime:
- my $mid = mid_mime($mime);
- $mime = eval {
- my $path = mid2path(mid_clean($mid));
- Email::MIME->new($git->cat_file('HEAD:'.$path));
- };
- }
- if ($mime) {
- my $end = PublicInbox::View::thread_adj_level($state, $level);
- PublicInbox::View::index_entry($mime, $level, $state);
- $state->{fh}->write($end) if $end;
- } else {
- my $mid = $node->messageid;
- PublicInbox::View::ghost_flush($state, '', $mid, $level);
- }
- tdump_ent($git, $state, $node->child, $level + 1);
- tdump_ent($git, $state, $node->next, $level);
+sub sort_relevance {
+ [ sort {
+ (eval { $b->topmost->{pct} } // 0) <=>
+ (eval { $a->topmost->{pct} } // 0)
+ } @{$_[0]} ]
+}
+
+sub get_pct ($) {
+ # Capped at "99%" since "100%" takes an extra column in the
+ # thread skeleton view. <xapian/mset.h> says the value isn't
+ # very meaningful, anyways.
+ my $n = $_[0]->get_percent;
+ $n > 99 ? 99 : $n;
+}
+
+sub load_msgs {
+ my ($mset) = @_;
+ [ map {
+ my $mi = $_;
+ my $smsg = PublicInbox::Smsg::from_mitem($mi);
+ $smsg->{pct} = get_pct($mi);
+ $smsg;
+ } ($mset->items) ]
+}
+
+sub mset_thread {
+ my ($ctx, $mset, $q) = @_;
+ my $ibx = $ctx->{-inbox};
+ my $msgs = $ibx->search->retry_reopen(\&load_msgs, $mset);
+ my $r = $q->{r};
+ my $rootset = PublicInbox::SearchThread::thread($msgs,
+ $r ? \&sort_relevance : \&PublicInbox::View::sort_ds,
+ $ctx);
+ my $skel = search_nav_bot($mset, $q). "<pre>";
+ $ctx->{-upfx} = '';
+ $ctx->{anchor_idx} = 1;
+ $ctx->{cur_level} = 0;
+ $ctx->{skel} = \$skel;
+ $ctx->{mapping} = {};
+ $ctx->{searchview} = 1;
+ $ctx->{prev_attr} = '';
+ $ctx->{prev_level} = 0;
+ $ctx->{s_nr} = scalar(@$msgs).'+ results';
+
+ # reduce hash lookups in skel_dump
+ $ctx->{-obfs_ibx} = $ibx->{obfuscate} ? $ibx : undef;
+ PublicInbox::View::walk_thread($rootset, $ctx,
+ \&PublicInbox::View::pre_thread);
+
+ @$msgs = reverse @$msgs if $r;
+ $ctx->{msgs} = $msgs;
+ PublicInbox::WwwStream::response($ctx, 200, \&mset_thread_i);