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

[PATCH v6 3/6] gitweb: add project_filter to limit project list to a subdirectory

From
BLBernhard R. Link <brl+git@mail.brlink.eu>
Date
Jan 30, 2012, 20:07 UTC
Message-ID
<20120130200737.GD2584@server.brlink.eu>
In-Reply-To
<20120130200355.GA2584@server.brlink.eu>

This commit changes the project listing views (project_list, project_index and opml) to limit the output to only projects in a subdirectory if the new optional parameter ?pf=directory name is used.

The implementation of the filter reuses the implementation used for the 'forks' action (i.e. listing all projects within that directory from the projects list file (GITWEB_LIST) or only projects in the given subdirectory of the project root directory without a projects list file).

Reusing $project instead of adding a new parameter would have been nicer from a UI point-of-view (including PATH_INFO support) but would complicate the $project validating code that is currently being used to ensure nothing is exported that should not be viewable.

Signed-off-by: Bernhard R. Link <brlink@debian.org>
---
changed since v5.5:
	- change page titles to show what directory it is limited to
---
 gitweb/gitweb.perl |   31 +++++++++++++++++++++++++------
 1 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 9a296e2..b895f4c 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -760,6 +760,7 @@ our @cgi_param_mapping = (
 	search_use_regexp => "sr",
 	ctag => "by_tag",
 	diff_style => "ds",
+	project_filter => "pf",
 	# this must be last entry (for manipulation from JavaScript)
 	javascript => "js"
 );
@@ -976,7 +977,7 @@ sub evaluate_path_info {
 
 our ($action, $project, $file_name, $file_parent, $hash, $hash_parent, $hash_base,
      $hash_parent_base, @extra_options, $page, $searchtype, $search_use_regexp,
-     $searchtext, $search_regexp);
+     $searchtext, $search_regexp, $project_filter);
 sub evaluate_and_validate_params {
 	our $action = $input_params{'action'};
 	if (defined $action) {
@@ -994,6 +995,13 @@ sub evaluate_and_validate_params {
 		}
 	}
 
+	our $project_filter = $input_params{'project_filter'};
+	if (defined $project_filter) {
+		if (!validate_pathname($project_filter)) {
+			die_error(404, "Invalid project_filter parameter");
+		}
+	}
+
 	our $file_name = $input_params{'file_name'};
 	if (defined $file_name) {
 		if (!validate_pathname($file_name)) {
@@ -3734,7 +3742,12 @@ sub run_highlighter {
 sub get_page_title {
 	my $title = to_utf8($site_name);
 
-	return $title unless (defined $project);
+	unless (defined $project) {
+		if (defined $project_filter) {
+			$title .= " - " . to_utf8($project_filter);
+		}
+		return $title;
+	}
 	$title .= " - " . to_utf8($project);
 
 	return $title unless (defined $action);
@@ -5984,7 +5997,7 @@ sub git_project_list {
 		die_error(400, "Unknown order parameter");
 	}
 
-	my @list = git_get_projects_list();
+	my @list = git_get_projects_list($project_filter, $strict_export);
 	if (!@list) {
 		die_error(404, "No projects found");
 	}
@@ -6023,7 +6036,7 @@ sub git_forks {
 }
 
 sub git_project_index {
-	my @projects = git_get_projects_list();
+	my @projects = git_get_projects_list($project_filter, $strict_export);
 	if (!@projects) {
 		die_error(404, "No projects found");
 	}
@@ -7860,7 +7873,7 @@ sub git_atom {
 }
 
 sub git_opml {
-	my @list = git_get_projects_list();
+	my @list = git_get_projects_list($project_filter, $strict_export);
 	if (!@list) {
 		die_error(404, "No projects found");
 	}
@@ -7871,11 +7884,17 @@ sub git_opml {
 		-content_disposition => 'inline; filename="opml.xml"');
 
 	my $title = esc_html($site_name);
+	my $filter = " within subdirectory ";
+	if (defined $project_filter) {
+		$filter .= esc_html($project_filter);
+	} else {
+		$filter = "";
+	}
 	print <<XML;
 <?xml version="1.0" encoding="utf-8"?>
 <opml version="1.0">
 <head>
-  <title>$title OPML Export</title>
+  <title>$title OPML Export$filter</title>
 </head>
 <body>
 <outline text="git RSS feeds">
-- 
1.7.8.3
Previous: Bernhard R. LinkNext: Bernhard R. Link
Message 24 of 40 in “gitweb: add project_filter to limit project list to a subdirectory”
  1. 1/2 gitweb: add project_filter to limit project list to a subdirectoryBernhard R. Link, Jan 28, 2012
  2. 2/2 gitweb: place links to parent directories in page headerBernhard R. Link, Jan 28, 2012
  3. Jakub NarebskiJan 28, 2012
  4. Jakub NarebskiJan 28, 2012
  5. gitweb: add project_filter to limit project list to a subdirectoryBernhard R. Link, Jan 29, 2012
  6. Jakub NarebskiJan 29, 2012
  7. 1/2 gitweb: add project_filter to limit project list to a subdirectoryBernhard R. Link, Jan 29, 2012
  8. 2/2 gitweb: place links to parent directories in page headerBernhard R. Link, Jan 29, 2012
  9. Jakub NarebskiJan 29, 2012
  10. Jakub NarebskiJan 29, 2012
  11. Junio C HamanoJan 29, 2012
  12. Jakub NarebskiJan 29, 2012
  13. Bernhard R. LinkJan 30, 2012
  14. 1/5 gitweb: prepare git_get_projects_list for use outside 'forks'.Bernhard R. Link, Jan 30, 2012
  15. Jakub NarebskiJan 30, 2012
  16. 1/5 gitweb: prepare git_get_projects_list for use outside 'forks'.Bernhard R. Link, Jan 30, 2012
  17. Jakub NarebskiJan 30, 2012
  18. Bernhard R. LinkJan 30, 2012
  19. 2/5 gitweb: add project_filter to limit project list to a subdirectoryBernhard R. Link, Jan 30, 2012
  20. Jakub NarebskiJan 30, 2012
  21. Bernhard R. LinkJan 30, 2012
  22. 1/6 gitweb: move hard coded .git suffix out of git_get_projects_listBernhard R. Link, Jan 30, 2012
  23. 2/6 gitweb: prepare git_get_projects_list for use outside 'forks'.Bernhard R. Link, Jan 30, 2012
  24. 3/6 gitweb: add project_filter to limit project list to a subdirectoryBernhard R. Link, Jan 30, 2012
  25. 4/6 gitweb: limit links to alternate forms of project_list to active project_filterBernhard R. Link, Jan 30, 2012
  26. 5/6 gitweb: show active project_filter in project_list page headerBernhard R. Link, Jan 30, 2012
  27. 6/6 gitweb: place links to parent directories in page headerBernhard R. Link, Jan 30, 2012
  28. Junio C HamanoJan 30, 2012
  29. Jakub NarebskiJan 30, 2012
  30. Junio C HamanoJan 30, 2012
  31. Junio C HamanoJan 30, 2012
  32. Bernhard R. LinkJan 30, 2012
  33. Bernhard R. LinkFeb 1, 2012
  34. Junio C HamanoFeb 1, 2012
  35. 3/5 gitweb: limit links to alternate forms of project_list to active project_filterBernhard R. Link, Jan 30, 2012
  36. Jakub NarebskiJan 30, 2012
  37. 4/5 gitweb: show active project_filter in project_list page headerBernhard R. Link, Jan 30, 2012
  38. Jakub NarebskiJan 30, 2012
  39. 5/5 gitweb: place links to parent directories in page headerBernhard R. Link, Jan 30, 2012
  40. Jakub NarebskiJan 30, 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.