git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
RGRafael Garcia-Suarez <rgarciasuarez@gmail.com>
Date
Jun 3, 2008, 12:58 UTC
Message-ID
<1212497890-4101-1-git-send-email-rgarciasuarez@gmail.com>

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
Next: Lea Wiemann
Message 1 of 3 in “Avoid errors from git-rev-parse in gitweb blame (take 2)”
  1. Avoid errors from git-rev-parse in gitweb blame (take 2)Rafael Garcia-Suarez, Jun 3, 2008
  2. Lea WiemannJun 3, 2008
  3. Rafael Garcia-SuarezJun 3, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.