-sub tdump {
- my ($cb, $res, $mset, $q, $ctx) = @_;
- my $fh = $cb->([200, ['Content-Type'=>'text/html; charset=UTF-8']]);
- $fh->write($res);
- my %pct;
- my @m = map {
- my $i = $_;
- my $m = PublicInbox::SearchMsg->load_doc($i->get_document);
- $pct{$m->mid} = $i->get_percent;
- $m = $m->mini_mime;
- $m;
- } ($mset->items);
-
- require PublicInbox::Thread;
- my $th = PublicInbox::Thread->new(@m);
- {
- no warnings 'once';
- $Mail::Thread::nosubject = 0;
- }
- $th->thread;
- if ($q->{r}) {
- $th->order(sub {
- sort { (eval { $pct{$b->topmost->messageid} } || 0)
- <=>
- (eval { $pct{$a->topmost->messageid} } || 0)
- } @_;
- });
- } else {
- no warnings 'once';
- $th->order(*PublicInbox::View::rsort_ts);
- }
-
- require PublicInbox::GitCatFile;
- my $git = PublicInbox::GitCatFile->new($ctx->{git_dir});
- my $state = { ctx => $ctx, anchor_idx => 0, pct => \%pct };
- $ctx->{searchview} = 1;
- tdump_ent($fh, $git, $state, $_, 0) for $th->rootset;
- $git = undef;
- Email::Address->purge_cache;
-
- $fh->write(search_nav_bot($mset, $q). "\n\n" .
- foot($ctx). '</pre></body></html>');
-
- $fh->close;
-}
-
-sub tdump_ent {
- my ($fh, $git, $state, $node, $level) = @_;
- return unless $node;
- my $mime = $node->message;
-
- if ($mime) {
- # lazy load the full message from mini_mime:
- my $mid = $mime->header('Message-ID');
- $mime = eval {
- my $path = mid2path(mid_clean($mid));
- Email::MIME->new($git->cat_file('HEAD:'.$path));
- };
- }
- if ($mime) {
- PublicInbox::View::index_entry($fh, $mime, $level, $state);
- } else {
- my $mid = $node->messageid;
- $fh->write(PublicInbox::View::ghost_table('', $mid, $level));
- }
- tdump_ent($fh, $git, $state, $node->child, $level + 1);
- tdump_ent($fh, $git, $state, $node->next, $level);