git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Avoid errors from git-rev-parse in gitweb blame (take 2)
@ 2008-06-03 12:58 Rafael Garcia-Suarez
  2008-06-03 14:23 ` Lea Wiemann
  0 siblings, 1 reply; 3+ messages in thread
From: Rafael Garcia-Suarez @ 2008-06-03 12:58 UTC (permalink / raw)
  To: git; +Cc: Rafael Garcia-Suarez

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@gmail.com>
---
 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

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-06-03 15:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-03 12:58 [PATCH] Avoid errors from git-rev-parse in gitweb blame (take 2) Rafael Garcia-Suarez
2008-06-03 14:23 ` Lea Wiemann
2008-06-03 14:59   ` Rafael Garcia-Suarez

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).