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

Re: gitweb.cgi feature request: project list "last change" column to display last change of all heads.

From
Junio C Hamano <junkio@cox.net>
Date
Oct 15, 2006, 10:28 UTC
Message-ID
<7vfydpzxe0.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<4531FC77.6010004@adelaide.edu.au>
Pierre Marc Dumuid <pierre.dumuid@adelaide.edu.au> writes:
Show 7 quoted lines
> The annoying thing is that in our mirrored personal repositories, we
> switch from head to head and push new features in different head, and
> then wait for the other developers to review.  At the moment, the
> getweb.cgi script only shows the "Last Change" for the current branch,
> and not all branches, (i.e. it's currently showing "13 days ago" for
> cinelerra-pmdumuid, whilst if you click the summary, you'll see I
> actually extended one of the branches only "24 hours ago".

It is fairly expensive to do without recent core-side support, but if the site runs version of git from the "next" branch, you should be able to do something like this.

I'll queue this to "next".

-- >8 -- gitweb: use for-each-ref to show the latest activity across branches

The project list page shows last change from the HEAD branch but often people would want to view activity on any branch.

Unfortunately that is fairly expensive without the core-side support. for-each-ref was invented exactly for that.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index e4ebce6..a78c8db 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -1009,6 +1009,24 @@ sub parse_tag {
 	return %tag
 }
 
+sub git_get_last_activity {
+	my ($path) = @_;
+	my $fd;
+
+	$git_dir = "$projectroot/$path";
+	open($fd, "-|", git_cmd(), 'for-each-ref', 
+	     '--format=%(refname) %(committer)',
+	     '--sort=-committerdate',
+	     'refs/heads') or return;
+	my $most_recent = <$fd>;
+	close $fd or return;
+	if ($most_recent =~ / (\d+) [-+][01]\d\d\d$/) {
+		my $timestamp = $1;
+		my $age = time - $timestamp;
+		return ($age, age_string($age));
+	}
+}
+
 sub parse_commit {
 	my $commit_id = shift;
 	my $commit_text = shift;
@@ -2258,16 +2276,11 @@ sub git_project_list {
 		die_error(undef, "No projects found");
 	}
 	foreach my $pr (@list) {
-		my $head = git_get_head_hash($pr->{'path'});
-		if (!defined $head) {
-			next;
-		}
-		$git_dir = "$projectroot/$pr->{'path'}";
-		my %co = parse_commit($head);
-		if (!%co) {
+		my (@aa) = git_get_last_activity($pr->{'path'});
+		unless (@aa) {
 			next;
 		}
-		$pr->{'commit'} = \%co;
+		($pr->{'age'}, $pr->{'age_string'}) = @aa;
 		if (!defined $pr->{'descr'}) {
 			my $descr = git_get_project_description($pr->{'path'}) || "";
 			$pr->{'descr'} = chop_str($descr, 25, 5);
@@ -2317,7 +2330,7 @@ sub git_project_list {
 		      "</th>\n";
 	}
 	if ($order eq "age") {
-		@projects = sort {$a->{'commit'}{'age'} <=> $b->{'commit'}{'age'}} @projects;
+		@projects = sort {$a->{'age'} <=> $b->{'age'}} @projects;
 		print "<th>Last Change</th>\n";
 	} else {
 		print "<th>" .
@@ -2339,8 +2352,8 @@ sub git_project_list {
 		                        -class => "list"}, esc_html($pr->{'path'})) . "</td>\n" .
 		      "<td>" . esc_html($pr->{'descr'}) . "</td>\n" .
 		      "<td><i>" . chop_str($pr->{'owner'}, 15) . "</i></td>\n";
-		print "<td class=\"". age_class($pr->{'commit'}{'age'}) . "\">" .
-		      $pr->{'commit'}{'age_string'} . "</td>\n" .
+		print "<td class=\"". age_class($pr->{'age'}) . "\">" .
+		      $pr->{'age_string'} . "</td>\n" .
 		      "<td class=\"link\">" .
 		      $cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary")}, "summary")   . " | " .
 		      $cgi->a({-href => href(project=>$pr->{'path'}, action=>"shortlog")}, "shortlog") . " | " .
Previous: Pierre Marc DumuidNext: Jakub Narebski
Message 2 of 3 in “gitweb.cgi feature request: project list "last change" column to display last change of all heads.”
  1. Pierre Marc DumuidOct 15, 2006
  2. Junio C HamanoOct 15, 2006
  3. Jakub NarebskiOct 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.