about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-08-20 02:30:25 +0000
committerEric Wong <e@80x24.org>2015-08-20 02:31:31 +0000
commit15782f34be59578fbec95c01f057bcf2d133414f (patch)
tree78be7f071e199751a7e073af0fe5636bb3fa0aa1 /lib
parentc23a40e9f6ee1af2feeb0275f14dd9f5b7e91f8c (diff)
downloadpublic-inbox-15782f34be59578fbec95c01f057bcf2d133414f.tar.gz
We'll be making the index smarter for people with search
support enabled.  Otherwise, it'll be chronological and
a bit dumb.  At least it'll use less memory.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/Feed.pm72
1 files changed, 23 insertions, 49 deletions
diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm
index 95bde4f5..253eed2a 100644
--- a/lib/PublicInbox/Feed.pm
+++ b/lib/PublicInbox/Feed.pm
@@ -40,7 +40,7 @@ sub generate {
 
         my $git = PublicInbox::GitCatFile->new($ctx->{git_dir});
         each_recent_blob($ctx, sub {
-                my ($add) = @_;
+                my ($add, undef) = @_;
                 add_to_feed($feed_opts, $feed, $add, $git);
         });
         $git = undef; # destroy pipes
@@ -50,7 +50,6 @@ sub generate {
 
 sub generate_html_index {
         my ($class, $ctx) = @_;
-        require PublicInbox::Thread;
 
         my $max = $ctx->{max} || MAX_PER_PAGE;
         my $feed_opts = get_feedopts($ctx);
@@ -58,30 +57,27 @@ sub generate_html_index {
         my $title = $feed_opts->{description} || '';
         $title = PublicInbox::Hval->new_oneline($title)->as_html;
 
-        my @messages;
-        my $git_dir = $ctx->{git_dir};
-        my $git = PublicInbox::GitCatFile->new($git_dir);
-        my ($first, $last) = each_recent_blob($ctx, sub {
-                mime_load_for_sort($git, $_[0], \@messages);
-        });
-        $git = undef; # destroy pipes.
-
-        my $th = PublicInbox::Thread->new(@messages);
-        $th->thread;
         my $html = "<html><head><title>$title</title>" .
                 '<link rel="alternate" title="Atom feed"' . "\nhref=\"" .
                 $feed_opts->{atomurl} . "\"\ntype=\"application/atom+xml\"/>" .
                 '</head><body>' . PRE_WRAP;
 
-        # sort child messages in chronological order
-        $th->order(*PublicInbox::Thread::sort_ts);
-
-        # except we sort top-level messages reverse chronologically
-        my $state = [ $ctx->{srch}, {}, $first, 0 ];
-        for (PublicInbox::Thread::rsort_ts($th->rootset)) {
-                dump_msg($_, 0, \$html, $state)
-        }
+        my $state;
+        my $git = PublicInbox::GitCatFile->new($ctx->{git_dir});
+        my (undef, $last) = each_recent_blob($ctx, sub {
+                my ($path, $commit) = @_;
+                unless (defined $state) {
+                        $state = [ $ctx->{srch}, {}, $commit, 0 ];
+                }
+                my $mime = do_cat_mail($git, $_[0]) or return 0;
+                my $t = eval { str2time($mime->header('Date')) };
+                defined($t) or $t = 0;
+                $mime->header_set('X-PI-TS', $t);
+                $html .= PublicInbox::View->index_entry($mime, 0, $state);
+                1;
+        });
         Email::Address->purge_cache;
+        $git = undef; # destroy pipes.
 
         my $footer = nav_footer($ctx->{cgi}, $last, $feed_opts, $state);
         if ($footer) {
@@ -144,12 +140,12 @@ sub each_recent_blob {
         my %deleted; # only an optimization at this point
         my $last;
         my $nr = 0;
-        my @commits = ();
+        my ($cur_commit, $first_commit, $last_commit);
         while (my $line = <$log>) {
                 if ($line =~ /$addmsg/o) {
                         my $add = $1;
-                        next if $deleted{$add};
-                        $nr += $cb->($add);
+                        next if $deleted{$add}; # optimization-only
+                        $nr += $cb->($add, $cur_commit);
                         if ($nr >= $max) {
                                 $last = 1;
                                 last;
@@ -157,24 +153,23 @@ sub each_recent_blob {
                 } elsif ($line =~ /$delmsg/o) {
                         $deleted{$1} = 1;
                 } elsif ($line =~ /^commit (${hex}{7,40})/o) {
-                        push @commits, $1;
+                        $cur_commit = $1;
+                        $first_commit = $1 unless defined $first_commit;
                 }
         }
 
         if ($last) {
                 while (my $line = <$log>) {
                         if ($line =~ /^commit (${hex}{7,40})/o) {
-                                push @commits, $1;
+                                $last_commit = $1;
                                 last;
                         }
                 }
-        } else {
-                push @commits, undef;
         }
 
         close $log; # we may EPIPE here
         # for pagination
-        ($commits[0], $commits[-1]);
+        ($first_commit, $last_commit);
 }
 
 # private functions below
@@ -279,16 +274,6 @@ sub add_to_feed {
         1;
 }
 
-sub dump_msg {
-        my ($self, $level, $html, $state) = @_;
-        my $mime = $self->message;
-        if ($mime) {
-                $$html .= PublicInbox::View->index_entry($mime, $level, $state);
-        }
-        dump_msg($self->child, $level+1, $html, $state) if $self->child;
-        dump_msg($self->next, $level, $html, $state) if $self->next;
-}
-
 sub do_cat_mail {
         my ($git, $path) = @_;
         my $mime = eval {
@@ -298,15 +283,4 @@ sub do_cat_mail {
         $@ ? undef : $mime;
 }
 
-sub mime_load_for_sort {
-        my ($git, $path, $messages) = @_;
-        my $mime = do_cat_mail($git, $path) or return 0;
-
-        my $t = eval { str2time($mime->header('Date')) };
-        defined($t) or $t = 0;
-        $mime->header_set('X-PI-TS', $t);
-        push @$messages, $mime;
-        1;
-}
-
 1;