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

[PATCHv6 4/8] gitweb: (gr)avatar support

From
Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Date
Jun 25, 2009, 10:43 UTC
Message-ID
<1245926587-25074-5-git-send-email-giuseppe.bilotta@gmail.com>
In-Reply-To
<1245926587-25074-4-git-send-email-giuseppe.bilotta@gmail.com>

Introduce avatar support: the featuer adds the appropriate img tag next to author and committer in commit(diff), history, shortlog and log view. Multiple avatar providers are possible, but only gravatar is implemented at the moment (and not enabled by default).

Gravatar support depends on Digest::MD5, which is a core package since Perl 5.8. If gravatars are activated but Digest::MD5 cannot be found, the feature will be automatically disabled.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
---
 gitweb/gitweb.css  |    4 +++
 gitweb/gitweb.perl |   67 ++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 67 insertions(+), 4 deletions(-)
diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css
index 7240ed7..ad82f86 100644
--- a/gitweb/gitweb.css
+++ b/gitweb/gitweb.css
@@ -28,6 +28,10 @@ img.logo {
 	border-width: 0px;
 }
 
+img.avatar {
+	vertical-align: middle;
+}
+
 div.page_header {
 	height: 25px;
 	padding: 8px;
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index cdfd1d5..f2e0cfe 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -195,6 +195,14 @@ our %known_snapshot_format_aliases = (
 	'x-zip' => undef, '' => undef,
 );
 
+# Pixel sizes for icons and avatars. If the default font sizes or lineheights
+# are changed, it may be appropriate to change these values too via
+# $GITWEB_CONFIG.
+our %avatar_size = (
+	'default' => 16,
+	'double'  => 32
+);
+
 # You define site-wide feature defaults here; override them with
 # $GITWEB_CONFIG as necessary.
 our %feature = (
@@ -365,6 +373,22 @@ our %feature = (
 		'sub' => \&feature_patches,
 		'override' => 0,
 		'default' => [16]},
+
+	# Avatar support. When this feature is enabled, views such as
+	# shortlog or commit will display an avatar associated with
+	# the email of the committer(s) and/or author(s).
+
+	# Currently only the gravatar provider is available, and it
+	# depends on Digest::MD5.
+
+	# To enable system wide have in $GITWEB_CONFIG
+	# $feature{'avatar'}{'default'} = ['gravatar'];
+	# To have project specific config enable override in $GITWEB_CONFIG
+	# $feature{'avatar'}{'override'} = 1;
+	# and in project config gitweb.avatar = gravatar;
+	'avatar' => {
+		'override' => 0,
+		'default' => ['']},
 );
 
 sub gitweb_get_feature {
@@ -814,6 +838,13 @@ $git_dir = "$projectroot/$project" if $project;
 our @snapshot_fmts = gitweb_get_feature('snapshot');
 @snapshot_fmts = filter_snapshot_fmts(@snapshot_fmts);
 
+# check if avatars are enabled and dependencies are satisfied
+our ($git_avatar) = gitweb_get_feature('avatar');
+if (($git_avatar eq 'gravatar') &&
+   !(eval { require Digest::MD5; 1; })) {
+	$git_avatar = '';
+}
+
 # dispatch
 if (!defined $action) {
 	if (defined $hash) {
@@ -1476,7 +1507,9 @@ sub format_author_html {
 	my $tag = shift;
 	my $co = shift;
 	my $author = chop_and_escape_str($co->{'author_name'}, @_);
-	return "<$tag class=\"author\">" . $author . "</$tag>\n";
+	return "<$tag class=\"author\">" .
+	       git_get_avatar($co->{'author_email'}, 'pad_after' => 1) .
+	       $author . "</$tag>\n";
 }
 
 # format git diff header line, i.e. "diff --(git|combined|cc) ..."
@@ -3224,6 +3257,29 @@ sub git_print_header_div {
 	      "\n</div>\n";
 }
 
+# Insert an avatar for the given $email at the given $size if the feature
+# is enabled.
+sub git_get_avatar {
+	my ($email, %params) = @_;
+	my $pre_white  = ($params{'pad_before'} ? "&nbsp;" : "");
+	my $post_white = ($params{'pad_after'}  ? "&nbsp;" : "");
+	my $size = $avatar_size{$params{'size'}} || $avatar_size{'default'};
+	my $url = "";
+	if ($git_avatar eq 'gravatar') {
+		$url = "http://www.gravatar.com/avatar.php?gravatar_id=" .
+			Digest::MD5::md5_hex(lc $email) . "&amp;size=$size";
+	}
+	# Currently only gravatars are supported, but other forms such as
+	# picons can be added by putting an else up here and defining $url
+	# as needed. If no variant puts something in $url, we assume avatars
+	# are completely disabled/unavailable.
+	if ($url) {
+		return $pre_white . "<img class=\"avatar\" src=\"$url\" />" . $post_white;
+	} else {
+		return "";
+	}
+}
+
 # Outputs the author name and date in long form
 sub git_print_authorship {
 	my $co = shift;
@@ -3243,7 +3299,8 @@ sub git_print_authorship {
 			       $ad{'hour_local'}, $ad{'minute_local'}, $ad{'tz_local'});
 		}
 	}
-	print "]</$tag>\n";
+	print "]" . git_get_avatar($co->{'author_email'}, 'pad_before' => 1)
+		  . "</$tag>\n";
 }
 
 # Outputs table rows containign the full author and commiter information.
@@ -3251,7 +3308,8 @@ sub git_print_full_authorship {
 	my $co = shift;
 	my %ad = parse_date($co->{'author_epoch'}, $co->{'author_tz'});
 	my %cd = parse_date($co->{'committer_epoch'}, $co->{'committer_tz'});
-	print "<tr><td>author</td><td>" . esc_html($co->{'author'}) . "</td></tr>\n".
+	print "<tr><td>author</td><td>" . esc_html($co->{'author'}) . "</td>".
+	      "<td rowspan=\"2\">" .git_get_avatar($co->{'author_email'}, 'size' => 'double') . "</td></tr>\n" .
 	      "<tr>" .
 	      "<td></td><td> $ad{'rfc2822'}";
 	if ($ad{'hour_local'} < 6) {
@@ -3263,7 +3321,8 @@ sub git_print_full_authorship {
 	}
 	print "</td>" .
 	      "</tr>\n";
-	print "<tr><td>committer</td><td>" . esc_html($co->{'committer'}) . "</td></tr>\n";
+	print "<tr><td>committer</td><td>" . esc_html($co->{'committer'}) . "</td>".
+	      "<td rowspan=\"2\">" .git_get_avatar($co->{'committer_email'}, 'size' => 'double') . "</td></tr>\n";
 	print "<tr><td></td><td> $cd{'rfc2822'}" .
 	      sprintf(" (%02d:%02d %s)", $cd{'hour_local'}, $cd{'minute_local'}, $cd{'tz_local'}) .
 	      "</td></tr>\n";
-- 
1.6.3.rc1.192.gdbfcb
Previous: Giuseppe BilottaNext: Giuseppe Bilotta
Message 5 of 46 in “[PATCHv6 0/8] gitweb: gravatar support”
  1. Giuseppe BilottaJun 25, 2009
  2. 1/8 gitweb: refactor author name insertionGiuseppe Bilotta, Jun 25, 2009
  3. 2/8 gitweb: uniform author info for commit and commitdiffGiuseppe Bilotta, Jun 25, 2009
  4. 3/8 gitweb: right-align date cell in shortlogGiuseppe Bilotta, Jun 25, 2009
  5. 4/8 gitweb: (gr)avatar supportGiuseppe Bilotta, Jun 25, 2009
  6. 5/8 gitweb: gravatar url cacheGiuseppe Bilotta, Jun 25, 2009
  7. 6/8 gitweb: add 'alt' to avatar imagesGiuseppe Bilotta, Jun 25, 2009
  8. 7/8 gitweb: recognize 'trivial' acksGiuseppe Bilotta, Jun 25, 2009
  9. 8/8 gitweb: add avatar in signoff linesGiuseppe Bilotta, Jun 25, 2009
  10. 9/8 gitweb: put signoff lines in a tableGiuseppe Bilotta, Jun 25, 2009
  11. Jakub NarebskiJun 27, 2009
  12. Jakub NarebskiJun 27, 2009
  13. Giuseppe BilottaJun 27, 2009
  14. Jakub NarebskiJun 27, 2009
  15. Junio C HamanoJun 27, 2009
  16. Giuseppe BilottaJun 27, 2009
  17. Jakub NarebskiJun 26, 2009
  18. Thomas AdamJun 27, 2009
  19. Jakub NarebskiJun 26, 2009
  20. Giuseppe BilottaJun 26, 2009
  21. Jakub NarebskiJun 26, 2009
  22. Jakub NarebskiJun 26, 2009
  23. Giuseppe BilottaJun 26, 2009
  24. Jakub NarebskiJun 26, 2009
  25. Giuseppe BilottaJun 26, 2009
  26. Jakub NarebskiJun 26, 2009
  27. Junio C HamanoJun 27, 2009
  28. Giuseppe BilottaJun 27, 2009
  29. Jakub NarebskiJun 26, 2009
  30. Giuseppe BilottaJun 26, 2009
  31. Junio C HamanoJun 26, 2009
  32. Giuseppe BilottaJun 26, 2009
  33. Junio C HamanoJun 26, 2009
  34. Jakub NarebskiJun 27, 2009
  35. Jakub NarebskiJun 27, 2009
  36. Jakub NarebskiJun 25, 2009
  37. Giuseppe BilottaJun 26, 2009
  38. Jakub NarebskiJun 25, 2009
  39. Jakub NarebskiJun 25, 2009
  40. Giuseppe BilottaJun 25, 2009
  41. Jakub NarebskiJun 25, 2009
  42. Giuseppe BilottaJun 25, 2009
  43. Junio C HamanoJun 25, 2009
  44. Giuseppe BilottaJun 25, 2009
  45. Junio C HamanoJun 25, 2009
  46. Jakub NarebskiJun 25, 2009

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.