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

[PATCH 2/4] gitweb: Separate printing of git_tree row into git_print_tree_entry

From
Jakub Narebski <jnareb@gmail.com>
Date
Aug 30, 2006, 22:35 UTC
Message-ID
<200608310035.07585.jnareb@gmail.com>
In-Reply-To
<200608310030.33512.jnareb@gmail.com>

This is preparation for "tree blame" (similar to what ViewVC shows) output, i.e. for each entry give commit where it was changed.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
This could be applied even though it is proof-of-concept series,
but I think it would be better to separate git_tree_body rather,
although perhaps something like git_print_tree_entry subroutine
is a good idea.
 gitweb/gitweb.perl |  103 ++++++++++++++++++++++++++++++----------------------
 1 files changed, 59 insertions(+), 44 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 84a13fd..d8b94a1 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -1462,6 +1462,62 @@ sub git_print_simplified_log {
 		-remove_title => $remove_title);
 }
 
+# print tree entry (row of git_tree), but without encompassing <tr> element
+sub git_print_tree_entry {
+	my ($t, $basedir, $hash_base, $have_blame) = @_;
+
+	my %base_key = ();
+	$base_key{hash_base} = $hash_base if defined $hash_base;
+
+	print "<td class=\"mode\">" . mode_str($t->{'mode'}) . "</td>\n";
+	if ($t->{'type'} eq "blob") {
+		print "<td class=\"list\">" .
+		      $cgi->a({-href => href(action=>"blob", hash=>$t->{'hash'},
+		                             file_name=>"$basedir$t->{'name'}", %base_key),
+		              -class => "list"}, esc_html($t->{'name'})) .
+		      "</td>\n" .
+		      "<td class=\"link\">" .
+		      $cgi->a({-href => href(action=>"blob", hash=>$t->{'hash'},
+		                             file_name=>"$basedir$t->{'name'}", %base_key)},
+		              "blob");
+		if ($have_blame) {
+			print " | " .
+				$cgi->a({-href => href(action=>"blame", hash=>$t->{'hash'},
+				                       file_name=>"$basedir$t->{'name'}", %base_key)},
+				        "blame");
+		}
+		if (defined $hash_base) {
+			print " | " .
+			      $cgi->a({-href => href(action=>"history", hash_base=>$hash_base,
+			                             hash=>$t->{'hash'}, file_name=>"$basedir$t->{'name'}")},
+			              "history");
+		}
+		print " | " .
+		      $cgi->a({-href => href(action=>"blob_plain",
+		                             hash=>$t->{'hash'}, file_name=>"$basedir$t->{'name'}")},
+		              "raw") .
+		      "</td>\n";
+
+	} elsif ($t->{'type'} eq "tree") {
+		print "<td class=\"list\">" .
+		      $cgi->a({-href => href(action=>"tree", hash=>$t->{'hash'},
+		                             file_name=>"$basedir$t->{'name'}", %base_key)},
+		              esc_html($t->{'name'})) .
+		      "</td>\n" .
+		      "<td class=\"link\">" .
+		      $cgi->a({-href => href(action=>"tree", hash=>$t->{'hash'},
+		                             file_name=>"$basedir$t->{'name'}", %base_key)},
+		              "tree");
+		if (defined $hash_base) {
+			print " | " .
+			      $cgi->a({-href => href(action=>"history", hash_base=>$hash_base,
+			                             file_name=>"$basedir$t->{'name'}")},
+			              "history");
+		}
+		print "</td>\n";
+	}
+}
+
 ## ......................................................................
 ## functions printing large fragments of HTML
 
@@ -2499,14 +2555,13 @@ sub git_tree {
 	my $refs = git_get_references();
 	my $ref = format_ref_marker($refs, $hash_base);
 	git_header_html();
-	my %base_key = ();
 	my $base = "";
 	my $have_blame = gitweb_check_feature('blame');
 	if (defined $hash_base && (my %co = parse_commit($hash_base))) {
-		$base_key{hash_base} = $hash_base;
 		git_print_page_nav('tree','', $hash_base);
 		git_print_header_div('commit', esc_html($co{'title'}) . $ref, $hash_base);
 	} else {
+		undef $hash_base;
 		print "<div class=\"page_nav\">\n";
 		print "<br/><br/></div>\n";
 		print "<div class=\"title\">$hash</div>\n";
@@ -2528,48 +2583,8 @@ sub git_tree {
 		}
 		$alternate ^= 1;
 
-		print "<td class=\"mode\">" . mode_str($t{'mode'}) . "</td>\n";
-		if ($t{'type'} eq "blob") {
-			print "<td class=\"list\">" .
-			      $cgi->a({-href => href(action=>"blob", hash=>$t{'hash'},
-			                             file_name=>"$base$t{'name'}", %base_key),
-			              -class => "list"}, esc_html($t{'name'})) .
-			      "</td>\n" .
-			      "<td class=\"link\">" .
-			      $cgi->a({-href => href(action=>"blob", hash=>$t{'hash'},
-			                             file_name=>"$base$t{'name'}", %base_key)},
-			              "blob");
-			if ($have_blame) {
-				print " | " .
-					$cgi->a({-href => href(action=>"blame", hash=>$t{'hash'},
-					                       file_name=>"$base$t{'name'}", %base_key)},
-					        "blame");
-			}
-			print " | " .
-			      $cgi->a({-href => href(action=>"history", hash_base=>$hash_base,
-			                             hash=>$t{'hash'}, file_name=>"$base$t{'name'}")},
-			              "history") .
-			      " | " .
-			      $cgi->a({-href => href(action=>"blob_plain",
-			                             hash=>$t{'hash'}, file_name=>"$base$t{'name'}")},
-			              "raw") .
-			      "</td>\n";
-		} elsif ($t{'type'} eq "tree") {
-			print "<td class=\"list\">" .
-			      $cgi->a({-href => href(action=>"tree", hash=>$t{'hash'},
-			                             file_name=>"$base$t{'name'}", %base_key)},
-			              esc_html($t{'name'})) .
-			      "</td>\n" .
-			      "<td class=\"link\">" .
-			      $cgi->a({-href => href(action=>"tree", hash=>$t{'hash'},
-			                             file_name=>"$base$t{'name'}", %base_key)},
-			              "tree") .
-			      " | " .
-			      $cgi->a({-href => href(action=>"history", hash_base=>$hash_base,
-			                             file_name=>"$base$t{'name'}")},
-			              "history") .
-			      "</td>\n";
-		}
+		git_print_tree_entry(\%t, $base, $hash_base, $have_blame);
+
 		print "</tr>\n";
 	}
 	print "</table>\n" .
-- 
1.4.1.1
Previous: Jakub NarebskiNext: Jakub Narebski
Message 2 of 4 in “gitweb: Move git-ls-tree output parsing to parse_ls_tree_line”
  1. 1/4 gitweb: Move git-ls-tree output parsing to parse_ls_tree_lineJakub Narebski, Aug 30, 2006
  2. 2/4 gitweb: Separate printing of git_tree row into git_print_tree_entryJakub Narebski, Aug 30, 2006
  3. 3/4 gitweb: Extend parse_difftree_raw_line to save commit infoJakub Narebski, Aug 30, 2006
  4. 4/4 gitweb: Add "tree_blame" view (WIP)Jakub Narebski, Aug 30, 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.