зеркало из https://github.com/microsoft/git.git
gitweb: A bit of code cleanup in git_blame()
Among others, here are the highlights: * move variable declaration closer to the place it is set and used, if possible, * uniquify and simplify coding style a bit, which includes removing unnecessary '()'. * check type only if $hash was defined, as otherwise from the way git_get_hash_by_path() is called (and works), we know that it is a blob, * use modern calling convention for git-blame, * remove unused variable, * don't use implicit variables ($_), * add some comments Signed-off-by: Jakub Narebski <jnareb@gmail.com> Acked-by: Luben Tuikov <ltuikov@yahoo.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
4a24bfc220
Коммит
d2ce10d7b7
|
@ -4575,28 +4575,33 @@ sub git_tag {
|
||||||
}
|
}
|
||||||
|
|
||||||
sub git_blame {
|
sub git_blame {
|
||||||
my $fd;
|
# permissions
|
||||||
my $ftype;
|
|
||||||
|
|
||||||
gitweb_check_feature('blame')
|
gitweb_check_feature('blame')
|
||||||
or die_error(403, "Blame view not allowed");
|
or die_error(403, "Blame view not allowed");
|
||||||
|
|
||||||
|
# error checking
|
||||||
die_error(400, "No file name given") unless $file_name;
|
die_error(400, "No file name given") unless $file_name;
|
||||||
$hash_base ||= git_get_head_hash($project);
|
$hash_base ||= git_get_head_hash($project);
|
||||||
die_error(404, "Couldn't find base commit") unless ($hash_base);
|
die_error(404, "Couldn't find base commit") unless $hash_base;
|
||||||
my %co = parse_commit($hash_base)
|
my %co = parse_commit($hash_base)
|
||||||
or die_error(404, "Commit not found");
|
or die_error(404, "Commit not found");
|
||||||
|
my $ftype = "blob";
|
||||||
if (!defined $hash) {
|
if (!defined $hash) {
|
||||||
$hash = git_get_hash_by_path($hash_base, $file_name, "blob")
|
$hash = git_get_hash_by_path($hash_base, $file_name, "blob")
|
||||||
or die_error(404, "Error looking up file");
|
or die_error(404, "Error looking up file");
|
||||||
|
} else {
|
||||||
|
$ftype = git_get_type($hash);
|
||||||
|
if ($ftype !~ "blob") {
|
||||||
|
die_error(400, "Object is not a blob");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$ftype = git_get_type($hash);
|
|
||||||
if ($ftype !~ "blob") {
|
# run git-blame --porcelain
|
||||||
die_error(400, "Object is not a blob");
|
open my $fd, "-|", git_cmd(), "blame", '-p',
|
||||||
}
|
$hash_base, '--', $file_name
|
||||||
open ($fd, "-|", git_cmd(), "blame", '-p', '--',
|
|
||||||
$file_name, $hash_base)
|
|
||||||
or die_error(500, "Open git-blame failed");
|
or die_error(500, "Open git-blame failed");
|
||||||
|
|
||||||
|
# page header
|
||||||
git_header_html();
|
git_header_html();
|
||||||
my $formats_nav =
|
my $formats_nav =
|
||||||
$cgi->a({-href => href(action=>"blob", -replay=>1)},
|
$cgi->a({-href => href(action=>"blob", -replay=>1)},
|
||||||
|
@ -4610,40 +4615,44 @@ sub git_blame {
|
||||||
git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav);
|
git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav);
|
||||||
git_print_header_div('commit', esc_html($co{'title'}), $hash_base);
|
git_print_header_div('commit', esc_html($co{'title'}), $hash_base);
|
||||||
git_print_page_path($file_name, $ftype, $hash_base);
|
git_print_page_path($file_name, $ftype, $hash_base);
|
||||||
my @rev_color = (qw(light2 dark2));
|
|
||||||
|
# page body
|
||||||
|
my @rev_color = qw(light2 dark2);
|
||||||
my $num_colors = scalar(@rev_color);
|
my $num_colors = scalar(@rev_color);
|
||||||
my $current_color = 0;
|
my $current_color = 0;
|
||||||
my $last_rev;
|
my %metainfo = ();
|
||||||
|
|
||||||
print <<HTML;
|
print <<HTML;
|
||||||
<div class="page_body">
|
<div class="page_body">
|
||||||
<table class="blame">
|
<table class="blame">
|
||||||
<tr><th>Commit</th><th>Line</th><th>Data</th></tr>
|
<tr><th>Commit</th><th>Line</th><th>Data</th></tr>
|
||||||
HTML
|
HTML
|
||||||
my %metainfo = ();
|
LINE:
|
||||||
while (1) {
|
while (my $line = <$fd>) {
|
||||||
$_ = <$fd>;
|
chomp $line;
|
||||||
last unless defined $_;
|
# the header: <SHA-1> <src lineno> <dst lineno> [<lines in group>]
|
||||||
|
# no <lines in group> for subsequent lines in group of lines
|
||||||
my ($full_rev, $orig_lineno, $lineno, $group_size) =
|
my ($full_rev, $orig_lineno, $lineno, $group_size) =
|
||||||
/^([0-9a-f]{40}) (\d+) (\d+)(?: (\d+))?$/;
|
($line =~ /^([0-9a-f]{40}) (\d+) (\d+)(?: (\d+))?$/);
|
||||||
if (!exists $metainfo{$full_rev}) {
|
if (!exists $metainfo{$full_rev}) {
|
||||||
$metainfo{$full_rev} = {};
|
$metainfo{$full_rev} = {};
|
||||||
}
|
}
|
||||||
my $meta = $metainfo{$full_rev};
|
my $meta = $metainfo{$full_rev};
|
||||||
while (<$fd>) {
|
my $data;
|
||||||
last if (s/^\t//);
|
while ($data = <$fd>) {
|
||||||
if (/^(\S+) (.*)$/) {
|
chomp $data;
|
||||||
|
last if ($data =~ s/^\t//); # contents of line
|
||||||
|
if ($data =~ /^(\S+) (.*)$/) {
|
||||||
$meta->{$1} = $2;
|
$meta->{$1} = $2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
my $data = $_;
|
my $short_rev = substr($full_rev, 0, 8);
|
||||||
chomp $data;
|
|
||||||
my $rev = substr($full_rev, 0, 8);
|
|
||||||
my $author = $meta->{'author'};
|
my $author = $meta->{'author'};
|
||||||
my %date = parse_date($meta->{'author-time'},
|
my %date =
|
||||||
$meta->{'author-tz'});
|
parse_date($meta->{'author-time'}, $meta->{'author-tz'});
|
||||||
my $date = $date{'iso-tz'};
|
my $date = $date{'iso-tz'};
|
||||||
if ($group_size) {
|
if ($group_size) {
|
||||||
$current_color = ++$current_color % $num_colors;
|
$current_color = ($current_color + 1) % $num_colors;
|
||||||
}
|
}
|
||||||
print "<tr id=\"l$lineno\" class=\"$rev_color[$current_color]\">\n";
|
print "<tr id=\"l$lineno\" class=\"$rev_color[$current_color]\">\n";
|
||||||
if ($group_size) {
|
if ($group_size) {
|
||||||
|
@ -4654,7 +4663,7 @@ HTML
|
||||||
print $cgi->a({-href => href(action=>"commit",
|
print $cgi->a({-href => href(action=>"commit",
|
||||||
hash=>$full_rev,
|
hash=>$full_rev,
|
||||||
file_name=>$file_name)},
|
file_name=>$file_name)},
|
||||||
esc_html($rev));
|
esc_html($short_rev));
|
||||||
print "</td>\n";
|
print "</td>\n";
|
||||||
}
|
}
|
||||||
open (my $dd, "-|", git_cmd(), "rev-parse", "$full_rev^")
|
open (my $dd, "-|", git_cmd(), "rev-parse", "$full_rev^")
|
||||||
|
@ -4677,6 +4686,8 @@ HTML
|
||||||
print "</div>";
|
print "</div>";
|
||||||
close $fd
|
close $fd
|
||||||
or print "Reading blob failed\n";
|
or print "Reading blob failed\n";
|
||||||
|
|
||||||
|
# page footer
|
||||||
git_footer_html();
|
git_footer_html();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче