gitweb: add project_filter to limit project list to a subdirectory

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>
Acked-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Bernhard R. Link 2012-01-30 21:07:37 +01:00 коммит произвёл Junio C Hamano
Родитель 348a6589e0
Коммит 19d2d23998
1 изменённых файлов: 25 добавлений и 6 удалений

Просмотреть файл

@ -760,6 +760,7 @@ our @cgi_param_mapping = (
search_use_regexp => "sr", search_use_regexp => "sr",
ctag => "by_tag", ctag => "by_tag",
diff_style => "ds", diff_style => "ds",
project_filter => "pf",
# this must be last entry (for manipulation from JavaScript) # this must be last entry (for manipulation from JavaScript)
javascript => "js" javascript => "js"
); );
@ -976,7 +977,7 @@ sub evaluate_path_info {
our ($action, $project, $file_name, $file_parent, $hash, $hash_parent, $hash_base, our ($action, $project, $file_name, $file_parent, $hash, $hash_parent, $hash_base,
$hash_parent_base, @extra_options, $page, $searchtype, $search_use_regexp, $hash_parent_base, @extra_options, $page, $searchtype, $search_use_regexp,
$searchtext, $search_regexp); $searchtext, $search_regexp, $project_filter);
sub evaluate_and_validate_params { sub evaluate_and_validate_params {
our $action = $input_params{'action'}; our $action = $input_params{'action'};
if (defined $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'}; our $file_name = $input_params{'file_name'};
if (defined $file_name) { if (defined $file_name) {
if (!validate_pathname($file_name)) { if (!validate_pathname($file_name)) {
@ -3732,7 +3740,12 @@ sub run_highlighter {
sub get_page_title { sub get_page_title {
my $title = to_utf8($site_name); 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); $title .= " - " . to_utf8($project);
return $title unless (defined $action); return $title unless (defined $action);
@ -5982,7 +5995,7 @@ sub git_project_list {
die_error(400, "Unknown order parameter"); die_error(400, "Unknown order parameter");
} }
my @list = git_get_projects_list(); my @list = git_get_projects_list($project_filter, $strict_export);
if (!@list) { if (!@list) {
die_error(404, "No projects found"); die_error(404, "No projects found");
} }
@ -6023,7 +6036,7 @@ sub git_forks {
} }
sub git_project_index { sub git_project_index {
my @projects = git_get_projects_list(); my @projects = git_get_projects_list($project_filter, $strict_export);
if (!@projects) { if (!@projects) {
die_error(404, "No projects found"); die_error(404, "No projects found");
} }
@ -7862,7 +7875,7 @@ sub git_atom {
} }
sub git_opml { sub git_opml {
my @list = git_get_projects_list(); my @list = git_get_projects_list($project_filter, $strict_export);
if (!@list) { if (!@list) {
die_error(404, "No projects found"); die_error(404, "No projects found");
} }
@ -7873,11 +7886,17 @@ sub git_opml {
-content_disposition => 'inline; filename="opml.xml"'); -content_disposition => 'inline; filename="opml.xml"');
my $title = esc_html($site_name); my $title = esc_html($site_name);
my $filter = " within subdirectory ";
if (defined $project_filter) {
$filter .= esc_html($project_filter);
} else {
$filter = "";
}
print <<XML; print <<XML;
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<opml version="1.0"> <opml version="1.0">
<head> <head>
<title>$title OPML Export</title> <title>$title OPML Export$filter</title>
</head> </head>
<body> <body>
<outline text="git RSS feeds"> <outline text="git RSS feeds">