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

[PATCH 6/9] gitweb: Change appereance of marker of refs pointing to given object

From
Jakub Narebski <jnareb@gmail.com>
Date
Aug 14, 2006, 00:14 UTC
Message-ID
<200608140214.20450.jnareb@gmail.com>
In-Reply-To
<200608140202.46160.jnareb@gmail.com>

Change git_get_references to include type of ref in the %refs value, which means putting everything after 'refs/' as a ref name, not only last part of the name. Instead of separating refs pointing to the same object by " / " separator, use anonymous array reference to store all refs pointing to given object.

Use 'git-ls-remote .' if $projectroot/$project/info/refs does not exist. (Perhaps it should be used always.)

Refs are now in separate span elements. Class is dependent on the ref type: currently known classes are 'tag', 'head', 'remote', and 'ref' (last one for HEAD and other refs in the main directory). There is encompassing span element of class refs, just in case of unknown ref type.

This might be considered cleaner separating of git_get_references into filling %refs hash only, and not taking part in formatting ref marker.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
Alternate solution to the one proposed by Thomas Kolejka in
 "[PATCH] gitweb: Different colours for tags and heads"
  Message-Id: <20060811151224.177110@gmx.net>

CSS and format_ref_marker is conservative: as of now it should not be "ref" (generic) type of references.

 gitweb/gitweb.css  |   19 +++++++++++++++++--
 gitweb/gitweb.perl |   37 ++++++++++++++++++++++++++++++-------
 2 files changed, 47 insertions(+), 9 deletions(-)
diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css
index f58a418..21ce99c 100644
--- a/gitweb/gitweb.css
+++ b/gitweb/gitweb.css
@@ -326,15 +326,30 @@ a.rss_logo:hover {
 	background-color: #ee5500;
 }
 
-span.tag {
+span.refs span {
 	padding: 0px 4px;
 	font-size: 10px;
 	font-weight: normal;
-	background-color: #ffffaa;
 	border: 1px solid;
+	background-color: #ffaaff;
+	border-color: #ffccff #ff00ee #ff00ee #ffccff;
+}
+
+span.refs span.ref {
+	background-color: #aaaaff;
+	border-color: #ccccff #0033cc #0033cc #ccccff;
+}
+
+span.refs span.tag {
+	background-color: #ffffaa;
 	border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
 }
 
+span.refs span.head {
+	background-color: #aaffaa;
+	border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
+}
+
 span.atnight {
 	color: #cc0000;
 }
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 6be6c55..4fe3fc7 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -364,9 +364,26 @@ sub format_log_line_html {
 # format marker of refs pointing to given object
 sub format_ref_marker {
 	my ($refs, $id) = @_;
+	my $markers = '';
 
 	if (defined $refs->{$id}) {
-		return ' <span class="tag">' . esc_html($refs->{$id}) . '</span>';
+		foreach my $ref (@{$refs->{$id}}) {
+			my ($type, $name) = qw();
+			# e.g. tags/v2.6.11 or heads/next
+			if ($ref =~ m!^(.*?)s?/(.*)$!) {
+				$type = $1;
+				$name = $2;
+			} else {
+				$type = "ref";
+				$name = $ref;
+			}
+
+			$markers .= " <span class=\"$type\">" . esc_html($name) . "</span>";
+		}
+	}
+
+	if ($markers) {
+		return ' <span class="refs">'. $markers . '</span>';
 	} else {
 		return "";
 	}
@@ -561,18 +578,24 @@ sub git_get_project_owner {
 sub git_get_references {
 	my $type = shift || "";
 	my %refs;
+	my $fd;
 	# 5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c	refs/tags/v2.6.11
 	# c39ae07f393806ccf406ef966e9a15afc43cc36a	refs/tags/v2.6.11^{}
-	open my $fd, "$projectroot/$project/info/refs" or return;
+	if (-f "$projectroot/$project/info/refs") {
+		open $fd, "$projectroot/$project/info/refs"
+			or return;
+	} else {
+		open $fd, "-|", $GIT, "ls-remote", "."
+			or return;
+	}
+
 	while (my $line = <$fd>) {
 		chomp $line;
-		# attention: for $type == "" it saves only last path part of ref name
-		# e.g. from 'refs/heads/jn/gitweb' it would leave only 'gitweb'
-		if ($line =~ m/^([0-9a-fA-F]{40})\t.*$type\/([^\^]+)/) {
+		if ($line =~ m/^([0-9a-fA-F]{40})\trefs\/($type\/?[^\^]+)/) {
 			if (defined $refs{$1}) {
-				$refs{$1} .= " / $2";
+				push @{$refs{$1}}, $2;
 			} else {
-				$refs{$1} = $2;
+				$refs{$1} = [ $2 ];
 			}
 		}
 	}
-- 
1.4.1.1
Previous: Jakub NarebskiNext: Jakub Narebski
Message 11 of 23 in “gitweb: Great subroutine renaming + task separation into subroutines + improvements”
  1. 0/9 gitweb: Great subroutine renaming + task separation into subroutines + improvementsJakub Narebski, Aug 14, 2006
  2. 1/9 gitweb: Great subroutines renamingJakub Narebski, Aug 14, 2006
  3. Junio C HamanoAug 14, 2006
  4. 2/9 gitweb: Separate ref parsing in git_get_refs_list into parse_refJakub Narebski, Aug 14, 2006
  5. Junio C HamanoAug 15, 2006
  6. Jakub NarebskiAug 15, 2006
  7. 3/9 gitweb: Refactor printing shortened title in git_shortlog_body and git_tags_bodyJakub Narebski, Aug 14, 2006
  8. Junio C HamanoAug 15, 2006
  9. 4/9 gitweb: Separate main part of git_history into git_history_bodyJakub Narebski, Aug 14, 2006
  10. 5/9 gitweb: Separate finding project owner into git_get_project_ownerJakub Narebski, Aug 14, 2006
  11. 6/9 gitweb: Change appereance of marker of refs pointing to given objectJakub Narebski, Aug 14, 2006
  12. Jakub NarebskiAug 14, 2006
  13. Junio C HamanoAug 15, 2006
  14. Jakub NarebskiAug 15, 2006
  15. 7/9 gitweb: Skip comments in mime.types like fileJakub Narebski, Aug 14, 2006
  16. 8/9 gitweb: True fix: Support for the standard mime.types map in gitwebJakub Narebski, Aug 14, 2006
  17. Junio C HamanoAug 15, 2006
  18. Jakub NarebskiAug 15, 2006
  19. 9/9 gitweb: Separate printing difftree in git_commit into git_difftree_bodyJakub Narebski, Aug 14, 2006
  20. Junio C HamanoAug 15, 2006
  21. Jakub NarebskiAug 15, 2006
  22. Jakub NarebskiAug 14, 2006
  23. Junio C HamanoAug 15, 2006

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.