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

[PATCH 1/5] gitweb: Option for filling only specified info in fill_project_list_info

From
Jakub Narebski <jnareb@gmail.com>
Date
Feb 4, 2012, 12:47 UTC
Message-ID
<1328359648-29511-2-git-send-email-jnareb@gmail.com>
In-Reply-To
<1328359648-29511-1-git-send-email-jnareb@gmail.com>

Introduce project_info_needs_filling($pr, $key[, @fill_only]), which is now used in place of simple 'defined $pr->{$key}' to check if specific slot in project needs to be filled.

This is in preparation of future lazy filling of project info in project search and pagination of sorted list of projects. The only functional change is that fill_project_list_info() now checks if 'age' is already filled before running git_get_last_activity().

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
This could have been squashed with the next commit, but this way it is
pure refactoring that shouldn't change gitweb behavior.

Adding project_info_needs_filling() subroutine could have been split into separate commit, but it would be subroutine without use...

 gitweb/gitweb.perl |   41 +++++++++++++++++++++++++++++++----------
 1 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 913a463..b7a3752 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -5185,35 +5185,56 @@ sub git_project_search_form {
 	print "</div>\n";
 }
 
+# entry for given $key doesn't need filling if either $key already exists
+# in $project_info hash, or we are interested only in subset of keys
+# and given key is not among @fill_only.
+sub project_info_needs_filling {
+	my ($project_info, $key, @fill_only) = @_;
+
+	if (!@fill_only ||            # we are interested in everything
+	    grep { $key eq $_ } @fill_only) { # or key is in @fill_only
+		# check if key is already filled
+		return !exists $project_info->{$key};
+	}
+	# uninteresting key, outside @fill_only
+	return 0;
+}
+
 # fills project list info (age, description, owner, category, forks)
 # for each project in the list, removing invalid projects from
-# returned list
+# returned list, or fill only specified info (removing invalid projects
+# only when filling 'age').
+#
 # NOTE: modifies $projlist, but does not remove entries from it
 sub fill_project_list_info {
-	my $projlist = shift;
+	my ($projlist, @fill_only) = @_;
 	my @projects;
 
 	my $show_ctags = gitweb_check_feature('ctags');
  PROJECT:
 	foreach my $pr (@$projlist) {
-		my (@activity) = git_get_last_activity($pr->{'path'});
-		unless (@activity) {
-			next PROJECT;
+		if (project_info_needs_filling($pr, 'age', @fill_only)) {
+			my (@activity) = git_get_last_activity($pr->{'path'});
+			unless (@activity) {
+				next PROJECT;
+			}
+			($pr->{'age'}, $pr->{'age_string'}) = @activity;
 		}
-		($pr->{'age'}, $pr->{'age_string'}) = @activity;
-		if (!defined $pr->{'descr'}) {
+		if (project_info_needs_filling($pr, 'descr', @fill_only)) {
 			my $descr = git_get_project_description($pr->{'path'}) || "";
 			$descr = to_utf8($descr);
 			$pr->{'descr_long'} = $descr;
 			$pr->{'descr'} = chop_str($descr, $projects_list_description_width, 5);
 		}
-		if (!defined $pr->{'owner'}) {
+		if (project_info_needs_filling($pr, 'owner', @fill_only)) {
 			$pr->{'owner'} = git_get_project_owner("$pr->{'path'}") || "";
 		}
-		if ($show_ctags) {
+		if ($show_ctags &&
+		    project_info_needs_filling($pr, 'ctags', @fill_only)) {
 			$pr->{'ctags'} = git_get_project_ctags($pr->{'path'});
 		}
-		if ($projects_list_group_categories && !defined $pr->{'category'}) {
+		if ($projects_list_group_categories &&
+		    project_info_needs_filling($pr, 'category', @fill_only)) {
 			my $cat = git_get_project_category($pr->{'path'}) ||
 			                                   $project_list_default_category;
 			$pr->{'category'} = to_utf8($cat);
-- 
1.7.9
Previous: Jakub NarebskiNext: Junio C Hamano
Message 2 of 21 in “gitweb: Faster and imrpoved project search”
  1. 0/5 gitweb: Faster and imrpoved project searchJakub Narebski, Feb 4, 2012
  2. 1/5 gitweb: Option for filling only specified info in fill_project_list_infoJakub Narebski, Feb 4, 2012
  3. Junio C HamanoFeb 9, 2012
  4. Jakub NarebskiFeb 9, 2012
  5. Junio C HamanoFeb 9, 2012
  6. Jakub NarebskiFeb 9, 2012
  7. Junio C HamanoFeb 9, 2012
  8. Jakub NarebskiFeb 10, 2012
  9. Junio C HamanoFeb 10, 2012
  10. Jakub NarebskiFeb 10, 2012
  11. Junio C HamanoFeb 10, 2012
  12. Jakub NarebskiFeb 10, 2012
  13. Junio C HamanoFeb 10, 2012
  14. Jakub NarebskiFeb 10, 2012
  15. 2/5 gitweb: Faster project searchJakub Narebski, Feb 4, 2012
  16. 3/5 gitweb: Highlight matched part of project name when searching projectsJakub Narebski, Feb 4, 2012
  17. 4/5 gitweb: Highlight matched part of project description when searching projectsJakub Narebski, Feb 4, 2012
  18. 5/5 gitweb: Highlight matched part of shortened project descriptionJakub Narebski, Feb 4, 2012
  19. 5/5 gitweb: Highlight matched part of shortened project descriptionJakub Narebski, Feb 4, 2012
  20. Felipe ContrerasFeb 4, 2012
  21. Jakub NarebskiFeb 4, 2012

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.