[PATCH] Avoid errors from git-rev-parse in gitweb blame (take 2)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux