This is unfortunately needed for scalability to long histories.
The design of git requires it to traverse full history to walk
forward in time, since commits can only record past history.
Instead, replace "prev" with a "head" link to zip us back to
the most recent page. Users who wish to go backwards can use
browser history, which should always work on our old-fashioned
HTML pages.
my @messages;
my $git = try_git_pm($args->{git_dir});
my @messages;
my $git = try_git_pm($args->{git_dir});
- my ($first, $last) = each_recent_blob($args, sub {
+ my $last = each_recent_blob($args, sub {
my $mime = do_cat_mail($git, $_[0])
or return 0;
if ($top && ($mime->header('In-Reply-To') ||
my $mime = do_cat_mail($git, $_[0])
or return 0;
if ($top && ($mime->header('In-Reply-To') ||
});
dump_html_line($_, 0, \@out) for $th->rootset;
});
dump_html_line($_, 0, \@out) for $th->rootset;
- my $footer = nav_footer($args->{cgi}, $first, $last);
+ my $footer = nav_footer($args->{cgi}, $last);
$footer = "<hr /><pre>$footer</pre>" if $footer;
$out[0] . "</pre>$footer</html>";
}
$footer = "<hr /><pre>$footer</pre>" if $footer;
$out[0] . "</pre>$footer</html>";
}
# private subs
sub nav_footer {
# private subs
sub nav_footer {
- my ($cgi, $first, $last) = @_;
$cgi or return '';
my $old_r = $cgi->param('r');
$cgi or return '';
my $old_r = $cgi->param('r');
my $next = ' ';
if ($last) {
$next = $cgi->path_info . "?r=$last";
$next = qq!<a href="$next">next</a>!;
}
my $next = ' ';
if ($last) {
$next = $cgi->path_info . "?r=$last";
$next = qq!<a href="$next">next</a>!;
}
- if ($first && $old_r) {
- $prev = $cgi->path_info . "?r=$first..";
- $prev = qq!<a href="$prev">prev</a>!;
+ if ($old_r) {
+ $head = $cgi->path_info;
+ $head = qq!<a href="$head">head</a>!;
my $cgi = $args->{cgi};
# revision ranges may be specified
my $cgi = $args->{cgi};
# revision ranges may be specified
my $range = 'HEAD';
my $r = $cgi->param('r') if $cgi;
my $range = 'HEAD';
my $r = $cgi->param('r') if $cgi;
- if ($r) {
- if ($r =~ /\A(?:$refhex\.\.)?$refhex\z/o) {
- $range = $r;
- } elsif ($r =~ /\A(?:$refhex\.\.)\z/o) {
- $reverse = 1;
- $range = $r;
- }
+ if ($r && ($r =~ /\A(?:$refhex\.\.)?$refhex\z/o)) {
+ $range = $r;
}
# 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 @cmd = qw/git log --no-notes --no-color --raw -r/;
}
# 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 @cmd = qw/git log --no-notes --no-color --raw -r/;
- push @cmd, '--reverse' if $reverse;
my $pid = open(my $log, '-|', @cmd) or
die('open `'.join(' ', @cmd) . " pipe failed: $!\n");
my $pid = open(my $log, '-|', @cmd) or
die('open `'.join(' ', @cmd) . " pipe failed: $!\n");
- } elsif ($reverse) {
- unshift @commits, undef
} else {
push @commits, undef;
}
close $log; # we may EPIPE here
# for pagination
} else {
push @commits, undef;
}
close $log; # we may EPIPE here
# for pagination
- $reverse ? ($commits[-1],$commits[0]) : ($commits[0],$commits[-1]);
}
# private functions below
}
# private functions below