git-rev-parse will abort with an error message on stderr when passed a non-existent revision spec, such as "deadbeef^" where deadbeef has no parent. Using the --revs-only parameter makes this error go away, while retaining functionality, keeping the web server error log nice and clean. Moreover, when there is no parent commit, direct the blame at the first commit featuring the file, that is itself. This unbreaks the link on the line number when the corresponding line had never been modified. Finally, to avoid forking git-rev-parse too many times, cache its results in a new hash %parent_commits. Signed-off-by: Rafael Garcia-Suarez <rgarciasuarez@xxxxxxxxx> --- gitweb/gitweb.perl | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 55fb100..828cf45 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -4189,6 +4189,7 @@ sub git_blame2 { <tr><th>Commit</th><th>Line</th><th>Data</th></tr> HTML my %metainfo = (); + my %parent_commits = (); while (1) { $_ = <$fd>; last unless defined $_; @@ -4226,11 +4227,16 @@ HTML esc_html($rev)); print "</td>\n"; } - open (my $dd, "-|", git_cmd(), "rev-parse", "$full_rev^") - or die_error(undef, "Open git-rev-parse failed"); - my $parent_commit = <$dd>; - close $dd; - chomp($parent_commit); + if (!exists $parent_commits{$full_rev}) { + # --revs-only avoids an error message if $full_rev has no parent + open (my $dd, "-|", git_cmd(), "rev-parse", '--revs-only', "$full_rev^") + or die_error(undef, "Open git-rev-parse failed"); + # set the $parent_commit to $full_rev if it has no parent + $parent_commits{$full_rev} = <$dd> || $full_rev; + chomp($parent_commits{$full_rev}); + close $dd; + } + my $parent_commit = $parent_commits{$full_rev}; my $blamed = href(action => 'blame', file_name => $meta->{'filename'}, hash_base => $parent_commit); -- 1.5.6.rc1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html