'; $ctx->{-upfx} = ''; - PublicInbox::WwwStream->response($ctx, 200, sub { - while (my $path = shift @paths) { - my $m = do_cat_mail($ctx->{-inbox}, $path) or next; - my $more = scalar @paths; - my $s = PublicInbox::View::index_entry($m, $ctx, $more); - $s .= '' unless $more; - return $s; - } - new_html_footer($ctx, $last); - }); + $ctx->{-hr} = 1; + PublicInbox::WwwStream->response($ctx, 200, \&new_html_i); } # private subs -sub title_tag { - my ($title) = @_; - $title =~ tr/\t\n / /s; # squeeze spaces - # try to avoid the type attribute in title: - $title = ascii_html($title); - my $type = index($title, '&') >= 0 ? "\ntype=\"html\"" : ''; - "
page: $next$latest"; -} -sub each_recent_blob { - my ($ctx, $cb) = @_; - my $max = $ctx->{max} || MAX_PER_PAGE; my $hex = '[a-f0-9]'; - my $addmsg = qr!^:000000 100644 \S+ \S+ A\t(${hex}{2}/${hex}{38})$!; - my $delmsg = qr!^:100644 000000 \S+ \S+ D\t(${hex}{2}/${hex}{38})$!; - my $refhex = qr/(?:HEAD|${hex}{4,40})(?:~\d+)?/; - my $qp = $ctx->{qp}; + my $addmsg = qr!^:000000 100644 \S+ (\S+) A\t${hex}{2}/${hex}{38}$!; + my $delmsg = qr!^:100644 000000 (\S+) \S+ D\t(${hex}{2}/${hex}{38})$!; + my $refhex = qr/(?:HEAD|${hex}{4,40})(?:~[0-9]+)?/; # revision ranges may be specified my $range = 'HEAD'; @@ -184,130 +108,41 @@ sub each_recent_blob { # get recent messages # we could use git log -z, but, we already know ssoma will not # leave us with filenames with spaces in them.. - my $log = $ctx->{-inbox}->git->popen(qw/log + my $log = $ibx->git->popen(qw/log --no-notes --no-color --raw -r - --abbrev=16 --abbrev-commit/, - "--format=%h%x00%ct%x00%an%x00%s%x00", - $range); + --no-abbrev --abbrev-commit/, + "--format=%H", $range); my %deleted; # only an optimization at this point my $last; - my $nr = 0; - my ($cur_commit, $first_commit, $last_commit); - my ($ts, $subj, $u); + my $last_commit; local $/ = "\n"; + my @oids; while (defined(my $line = <$log>)) { if ($line =~ /$addmsg/o) { my $add = $1; next if $deleted{$add}; # optimization-only - $nr += $cb->($add, $cur_commit, $ts, $u, $subj); - if ($nr >= $max) { + push @oids, $add; + if (scalar(@oids) >= $max) { $last = 1; last; } } elsif ($line =~ /$delmsg/o) { $deleted{$1} = 1; - } elsif ($line =~ /^${hex}{7,40}/o) { - ($cur_commit, $ts, $u, $subj) = split("\0", $line); - unless (defined $first_commit) { - $first_commit = $cur_commit; - } } } if ($last) { local $/ = "\n"; while (my $line = <$log>) { - if ($line =~ /^(${hex}{7,40})/o) { + if ($line =~ /^(${hex}{7,40})/) { $last_commit = $1; last; } } } - # for pagination - ($first_commit, $last_commit); -} - -# private functions below -sub get_feedopts { - my ($ctx) = @_; - my $inbox = $ctx->{inbox}; - my $obj = $ctx->{-inbox}; - my %rv = ( description => $obj->description ); - - $rv{address} = $obj->{address}; - $rv{id_addr} = $obj->{-primary_address}; - my $url_base = $obj->base_url($ctx->{env}); - if (my $mid = $ctx->{mid}) { # per-thread feed: - $rv{atomurl} = "$url_base$mid/t.atom"; - } else { - $rv{atomurl} = $url_base."new.atom"; - } - $rv{url} ||= $url_base; - $rv{midurl} = $url_base; - - \%rv; -} - -sub feed_updated { - my ($date, $ts) = @_; - my @t = eval { strptime($date) } if defined $date; - @t = gmtime($ts || time) unless scalar @t; - - '
) . - PublicInbox::View::multipart_text_as_html($mime, $href) . - ''; - - $add =~ tr!/!!d; - my $h = '[a-f0-9]'; - my (@uuid5) = ($add =~ m!\A($h{8})($h{4})($h{4})($h{4})($h{12})!o); - my $id = 'urn:uuid:' . join('-', @uuid5); - $s .= qq!