Previously gitweb would ignore partial PATH_INFO. For example, it would produce a project list for the top URL https://www.example.org/projects/ and a project summary for https://www.example.org/projects/git/git.git but if you tried to list just the git-related projects with https://www.example.org/projects/git/ you would get a list of all projects, same as the top URL. As well as fixing that omission, this change also makes gitweb generate PATH_INFO-style URLs for project filter links, such as in the breadcrumbs. Signed-off-by: Tony Finch <dot@xxxxxxxx> --- gitweb/gitweb.perl | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index a9f57d6..12aba8f 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -891,7 +891,17 @@ sub evaluate_path_info { while ($project && !check_head_link("$projectroot/$project")) { $project =~ s,/*[^/]*$,,; } - return unless $project; + # If there is no project, use the PATH_INFO as a project filter if it + # is a directory in the projectroot. (It can't be a subdirectory of a + # repo because we just verified that isn't the case.) + unless ($project) { + if (-d "$projectroot/$path_info") { + $path_info =~ s,/+$,,; + $input_params{'project_filter'} = $path_info; + $path_info = ""; + } + return; + } $input_params{'project'} = $project; # do not change any parameters if an action is given using the query string @@ -1356,6 +1366,18 @@ sub href { } my $use_pathinfo = gitweb_check_feature('pathinfo'); + + # we have to check for a project_filter first because handling the full + # project-plus-parameters deletes some of the paramaters we check here + if (!defined $params{'project'} && $params{'project_filter'} && + $params{'action'} eq "project_list" && + (exists $params{-path_info} ? $params{-path_info} : $use_pathinfo)) { + $href =~ s,/$,,; + $href .= "/".esc_path_info($params{'project_filter'})."/"; + delete $params{'project_filter'}; + delete $params{'action'}; + } + if (defined $params{'project'} && (exists $params{-path_info} ? $params{-path_info} : $use_pathinfo)) { # try to put as many parameters as possible in PATH_INFO: -- 2.1.0.rc0.229.gaee38de -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html