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:
Jakub Narebski 2008-12-09 23:48:51 +01:00 коммит произвёл Junio C Hamano
Родитель 4a24bfc220
Коммит d2ce10d7b7
1 изменённых файлов: 39 добавлений и 28 удалений

Просмотреть файл

@ -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();
} }