Merge branch 'jn/gitweb-log-history'
* jn/gitweb-log-history: gitweb: Make 'history' view (re)use git_log_generic() gitweb: Refactor common parts of 'log' and 'shortlog' views gitweb: Refactor 'log' action generation, adding git_log_body()
This commit is contained in:
commit
375fe9262b
@ -3363,22 +3363,18 @@ sub git_print_page_nav {
|
||||
}
|
||||
|
||||
sub format_paging_nav {
|
||||
my ($action, $hash, $head, $page, $has_next_link) = @_;
|
||||
my ($action, $page, $has_next_link) = @_;
|
||||
my $paging_nav;
|
||||
|
||||
|
||||
if ($hash ne $head || $page) {
|
||||
$paging_nav .= $cgi->a({-href => href(action=>$action)}, "HEAD");
|
||||
} else {
|
||||
$paging_nav .= "HEAD";
|
||||
}
|
||||
|
||||
if ($page > 0) {
|
||||
$paging_nav .= " ⋅ " .
|
||||
$paging_nav .=
|
||||
$cgi->a({-href => href(-replay=>1, page=>undef)}, "first") .
|
||||
" ⋅ " .
|
||||
$cgi->a({-href => href(-replay=>1, page=>$page-1),
|
||||
-accesskey => "p", -title => "Alt-p"}, "prev");
|
||||
} else {
|
||||
$paging_nav .= " ⋅ prev";
|
||||
$paging_nav .= "first ⋅ prev";
|
||||
}
|
||||
|
||||
if ($has_next_link) {
|
||||
@ -4361,6 +4357,46 @@ sub git_project_list_body {
|
||||
print "</table>\n";
|
||||
}
|
||||
|
||||
sub git_log_body {
|
||||
# uses global variable $project
|
||||
my ($commitlist, $from, $to, $refs, $extra) = @_;
|
||||
|
||||
$from = 0 unless defined $from;
|
||||
$to = $#{$commitlist} if (!defined $to || $#{$commitlist} < $to);
|
||||
|
||||
for (my $i = 0; $i <= $to; $i++) {
|
||||
my %co = %{$commitlist->[$i]};
|
||||
next if !%co;
|
||||
my $commit = $co{'id'};
|
||||
my $ref = format_ref_marker($refs, $commit);
|
||||
my %ad = parse_date($co{'author_epoch'});
|
||||
git_print_header_div('commit',
|
||||
"<span class=\"age\">$co{'age_string'}</span>" .
|
||||
esc_html($co{'title'}) . $ref,
|
||||
$commit);
|
||||
print "<div class=\"title_text\">\n" .
|
||||
"<div class=\"log_link\">\n" .
|
||||
$cgi->a({-href => href(action=>"commit", hash=>$commit)}, "commit") .
|
||||
" | " .
|
||||
$cgi->a({-href => href(action=>"commitdiff", hash=>$commit)}, "commitdiff") .
|
||||
" | " .
|
||||
$cgi->a({-href => href(action=>"tree", hash=>$commit, hash_base=>$commit)}, "tree") .
|
||||
"<br/>\n" .
|
||||
"</div>\n";
|
||||
git_print_authorship(\%co, -tag => 'span');
|
||||
print "<br/>\n</div>\n";
|
||||
|
||||
print "<div class=\"log_body\">\n";
|
||||
git_print_log($co{'comment'}, -final_empty_line=> 1);
|
||||
print "</div>\n";
|
||||
}
|
||||
if ($extra) {
|
||||
print "<div class=\"page_nav\">\n";
|
||||
print "$extra\n";
|
||||
print "</div>\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub git_shortlog_body {
|
||||
# uses global variable $project
|
||||
my ($commitlist, $from, $to, $refs, $extra) = @_;
|
||||
@ -4407,7 +4443,8 @@ sub git_shortlog_body {
|
||||
|
||||
sub git_history_body {
|
||||
# Warning: assumes constant type (blob or tree) during history
|
||||
my ($commitlist, $from, $to, $refs, $hash_base, $ftype, $extra) = @_;
|
||||
my ($commitlist, $from, $to, $refs, $extra,
|
||||
$file_name, $file_hash, $ftype) = @_;
|
||||
|
||||
$from = 0 unless defined $from;
|
||||
$to = $#{$commitlist} unless (defined $to && $to <= $#{$commitlist});
|
||||
@ -4441,7 +4478,7 @@ sub git_history_body {
|
||||
$cgi->a({-href => href(action=>"commitdiff", hash=>$commit)}, "commitdiff");
|
||||
|
||||
if ($ftype eq 'blob') {
|
||||
my $blob_current = git_get_hash_by_path($hash_base, $file_name);
|
||||
my $blob_current = $file_hash;
|
||||
my $blob_parent = git_get_hash_by_path($commit, $file_name);
|
||||
if (defined $blob_current && defined $blob_parent &&
|
||||
$blob_current ne $blob_parent) {
|
||||
@ -5297,22 +5334,57 @@ sub git_snapshot {
|
||||
close $fd;
|
||||
}
|
||||
|
||||
sub git_log {
|
||||
sub git_log_generic {
|
||||
my ($fmt_name, $body_subr, $base, $parent, $file_name, $file_hash) = @_;
|
||||
|
||||
my $head = git_get_head_hash($project);
|
||||
if (!defined $hash) {
|
||||
$hash = $head;
|
||||
if (!defined $base) {
|
||||
$base = $head;
|
||||
}
|
||||
if (!defined $page) {
|
||||
$page = 0;
|
||||
}
|
||||
my $refs = git_get_references();
|
||||
|
||||
my @commitlist = parse_commits($hash, 101, (100 * $page));
|
||||
my $commit_hash = $base;
|
||||
if (defined $parent) {
|
||||
$commit_hash = "$parent..$base";
|
||||
}
|
||||
my @commitlist =
|
||||
parse_commits($commit_hash, 101, (100 * $page),
|
||||
defined $file_name ? ($file_name, "--full-history") : ());
|
||||
|
||||
my $paging_nav = format_paging_nav('log', $hash, $head, $page, $#commitlist >= 100);
|
||||
my $ftype;
|
||||
if (!defined $file_hash && defined $file_name) {
|
||||
# some commits could have deleted file in question,
|
||||
# and not have it in tree, but one of them has to have it
|
||||
for (my $i = 0; $i < @commitlist; $i++) {
|
||||
$file_hash = git_get_hash_by_path($commitlist[$i]{'id'}, $file_name);
|
||||
last if defined $file_hash;
|
||||
}
|
||||
}
|
||||
if (defined $file_hash) {
|
||||
$ftype = git_get_type($file_hash);
|
||||
}
|
||||
if (defined $file_name && !defined $ftype) {
|
||||
die_error(500, "Unknown type of object");
|
||||
}
|
||||
my %co;
|
||||
if (defined $file_name) {
|
||||
%co = parse_commit($base)
|
||||
or die_error(404, "Unknown commit object");
|
||||
}
|
||||
|
||||
my ($patch_max) = gitweb_get_feature('patches');
|
||||
if ($patch_max) {
|
||||
|
||||
my $paging_nav = format_paging_nav($fmt_name, $page, $#commitlist >= 100);
|
||||
my $next_link = '';
|
||||
if ($#commitlist >= 100) {
|
||||
$next_link =
|
||||
$cgi->a({-href => href(-replay=>1, page=>$page+1),
|
||||
-accesskey => "n", -title => "Alt-n"}, "next");
|
||||
}
|
||||
my $patch_max = gitweb_get_feature('patches');
|
||||
if ($patch_max && !defined $file_name) {
|
||||
if ($patch_max < 0 || @commitlist <= $patch_max) {
|
||||
$paging_nav .= " ⋅ " .
|
||||
$cgi->a({-href => href(action=>"patches", -replay=>1)},
|
||||
@ -5321,50 +5393,26 @@ sub git_log {
|
||||
}
|
||||
|
||||
git_header_html();
|
||||
git_print_page_nav('log','', $hash,undef,undef, $paging_nav);
|
||||
|
||||
if (!@commitlist) {
|
||||
my %co = parse_commit($hash);
|
||||
|
||||
git_print_header_div('summary', $project);
|
||||
print "<div class=\"page_body\"> Last change $co{'age_string'}.<br/><br/></div>\n";
|
||||
git_print_page_nav($fmt_name,'', $hash,$hash,$hash, $paging_nav);
|
||||
if (defined $file_name) {
|
||||
git_print_header_div('commit', esc_html($co{'title'}), $base);
|
||||
} else {
|
||||
git_print_header_div('summary', $project)
|
||||
}
|
||||
my $to = ($#commitlist >= 99) ? (99) : ($#commitlist);
|
||||
for (my $i = 0; $i <= $to; $i++) {
|
||||
my %co = %{$commitlist[$i]};
|
||||
next if !%co;
|
||||
my $commit = $co{'id'};
|
||||
my $ref = format_ref_marker($refs, $commit);
|
||||
my %ad = parse_date($co{'author_epoch'});
|
||||
git_print_header_div('commit',
|
||||
"<span class=\"age\">$co{'age_string'}</span>" .
|
||||
esc_html($co{'title'}) . $ref,
|
||||
$commit);
|
||||
print "<div class=\"title_text\">\n" .
|
||||
"<div class=\"log_link\">\n" .
|
||||
$cgi->a({-href => href(action=>"commit", hash=>$commit)}, "commit") .
|
||||
" | " .
|
||||
$cgi->a({-href => href(action=>"commitdiff", hash=>$commit)}, "commitdiff") .
|
||||
" | " .
|
||||
$cgi->a({-href => href(action=>"tree", hash=>$commit, hash_base=>$commit)}, "tree") .
|
||||
"<br/>\n" .
|
||||
"</div>\n";
|
||||
git_print_authorship(\%co, -tag => 'span');
|
||||
print "<br/>\n</div>\n";
|
||||
git_print_page_path($file_name, $ftype, $hash_base)
|
||||
if (defined $file_name);
|
||||
|
||||
$body_subr->(\@commitlist, 0, 99, $refs, $next_link,
|
||||
$file_name, $file_hash, $ftype);
|
||||
|
||||
print "<div class=\"log_body\">\n";
|
||||
git_print_log($co{'comment'}, -final_empty_line=> 1);
|
||||
print "</div>\n";
|
||||
}
|
||||
if ($#commitlist >= 100) {
|
||||
print "<div class=\"page_nav\">\n";
|
||||
print $cgi->a({-href => href(-replay=>1, page=>$page+1),
|
||||
-accesskey => "n", -title => "Alt-n"}, "next");
|
||||
print "</div>\n";
|
||||
}
|
||||
git_footer_html();
|
||||
}
|
||||
|
||||
sub git_log {
|
||||
git_log_generic('log', \&git_log_body,
|
||||
$hash, $hash_parent);
|
||||
}
|
||||
|
||||
sub git_commit {
|
||||
$hash ||= $hash_base || "HEAD";
|
||||
my %co = parse_commit($hash)
|
||||
@ -5901,70 +5949,9 @@ sub git_patches {
|
||||
}
|
||||
|
||||
sub git_history {
|
||||
if (!defined $hash_base) {
|
||||
$hash_base = git_get_head_hash($project);
|
||||
}
|
||||
if (!defined $page) {
|
||||
$page = 0;
|
||||
}
|
||||
my $ftype;
|
||||
my %co = parse_commit($hash_base)
|
||||
or die_error(404, "Unknown commit object");
|
||||
|
||||
my $refs = git_get_references();
|
||||
my $limit = sprintf("--max-count=%i", (100 * ($page+1)));
|
||||
|
||||
my @commitlist = parse_commits($hash_base, 101, (100 * $page),
|
||||
$file_name, "--full-history")
|
||||
or die_error(404, "No such file or directory on given branch");
|
||||
|
||||
if (!defined $hash && defined $file_name) {
|
||||
# some commits could have deleted file in question,
|
||||
# and not have it in tree, but one of them has to have it
|
||||
for (my $i = 0; $i <= @commitlist; $i++) {
|
||||
$hash = git_get_hash_by_path($commitlist[$i]{'id'}, $file_name);
|
||||
last if defined $hash;
|
||||
}
|
||||
}
|
||||
if (defined $hash) {
|
||||
$ftype = git_get_type($hash);
|
||||
}
|
||||
if (!defined $ftype) {
|
||||
die_error(500, "Unknown type of object");
|
||||
}
|
||||
|
||||
my $paging_nav = '';
|
||||
if ($page > 0) {
|
||||
$paging_nav .=
|
||||
$cgi->a({-href => href(action=>"history", hash=>$hash, hash_base=>$hash_base,
|
||||
file_name=>$file_name)},
|
||||
"first");
|
||||
$paging_nav .= " ⋅ " .
|
||||
$cgi->a({-href => href(-replay=>1, page=>$page-1),
|
||||
-accesskey => "p", -title => "Alt-p"}, "prev");
|
||||
} else {
|
||||
$paging_nav .= "first";
|
||||
$paging_nav .= " ⋅ prev";
|
||||
}
|
||||
my $next_link = '';
|
||||
if ($#commitlist >= 100) {
|
||||
$next_link =
|
||||
$cgi->a({-href => href(-replay=>1, page=>$page+1),
|
||||
-accesskey => "n", -title => "Alt-n"}, "next");
|
||||
$paging_nav .= " ⋅ $next_link";
|
||||
} else {
|
||||
$paging_nav .= " ⋅ next";
|
||||
}
|
||||
|
||||
git_header_html();
|
||||
git_print_page_nav('history','', $hash_base,$co{'tree'},$hash_base, $paging_nav);
|
||||
git_print_header_div('commit', esc_html($co{'title'}), $hash_base);
|
||||
git_print_page_path($file_name, $ftype, $hash_base);
|
||||
|
||||
git_history_body(\@commitlist, 0, 99,
|
||||
$refs, $hash_base, $ftype, $next_link);
|
||||
|
||||
git_footer_html();
|
||||
git_log_generic('history', \&git_history_body,
|
||||
$hash_base, $hash_parent_base,
|
||||
$file_name, $hash);
|
||||
}
|
||||
|
||||
sub git_search {
|
||||
@ -6228,44 +6215,8 @@ EOT
|
||||
}
|
||||
|
||||
sub git_shortlog {
|
||||
my $head = git_get_head_hash($project);
|
||||
if (!defined $hash) {
|
||||
$hash = $head;
|
||||
}
|
||||
if (!defined $page) {
|
||||
$page = 0;
|
||||
}
|
||||
my $refs = git_get_references();
|
||||
|
||||
my $commit_hash = $hash;
|
||||
if (defined $hash_parent) {
|
||||
$commit_hash = "$hash_parent..$hash";
|
||||
}
|
||||
my @commitlist = parse_commits($commit_hash, 101, (100 * $page));
|
||||
|
||||
my $paging_nav = format_paging_nav('shortlog', $hash, $head, $page, $#commitlist >= 100);
|
||||
my $next_link = '';
|
||||
if ($#commitlist >= 100) {
|
||||
$next_link =
|
||||
$cgi->a({-href => href(-replay=>1, page=>$page+1),
|
||||
-accesskey => "n", -title => "Alt-n"}, "next");
|
||||
}
|
||||
my $patch_max = gitweb_check_feature('patches');
|
||||
if ($patch_max) {
|
||||
if ($patch_max < 0 || @commitlist <= $patch_max) {
|
||||
$paging_nav .= " ⋅ " .
|
||||
$cgi->a({-href => href(action=>"patches", -replay=>1)},
|
||||
"patches");
|
||||
}
|
||||
}
|
||||
|
||||
git_header_html();
|
||||
git_print_page_nav('shortlog','', $hash,$hash,$hash, $paging_nav);
|
||||
git_print_header_div('summary', $project);
|
||||
|
||||
git_shortlog_body(\@commitlist, 0, 99, $refs, $next_link);
|
||||
|
||||
git_footer_html();
|
||||
git_log_generic('shortlog', \&git_shortlog_body,
|
||||
$hash, $hash_parent);
|
||||
}
|
||||
|
||||
## ......................................................................
|
||||
|
Loading…
Reference in New Issue
Block a user